亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? stone.c

?? 該程序是C語言編寫的
?? C
?? 第 1 頁 / 共 2 頁
字號:
  char  *optchars = "ab";
#else
  char  *optchars = "";
#endif

  /*  1.  Get command line arguments:		*/

#if TRACE
  ab = db = 0;
#endif
  errflag = 0;

  while ((c  = getopt(argc, argv, optchars)) != EOF) {
    switch (c) {
      default :
        fprintf(stderr, "stone(main): error in getopt()");
        exit(1);

      case '?' :	/* getopt() found illegal option letter */
        errflag = TRUE;
  	break;		/* has already complained		*/

#if TRACE
      case 'a' :
	ab = TRUE;
	break;

      case 'd' :
	ab = db = TRUE;
	break;
#endif 
    }
  }

  if (errflag || optind < argc) { /* error or arguments */
#if TRACE
    fprintf(stderr, "usage: stone [-ad]\n");
#else
    fprintf(stderr, "usage: stone\n");
#endif
    exit(1);    
  }

  initscr();

  /*  2.  Keep playing as long as user wants to:	*/

  do {
  
    /*  3.  Display an empty board:  */

    initb(board);
    printb(board);

    /*  4.  Get game parameters:	*/

    get_game_parameters();
    initb(board);

    if (!pbegins) goto first;

    /*  5.  Main move loop:	*/

    while (!done(board)) {

      /*  6.  Get player's move		*/

      do {
        pmove = get_players_move(board);
        if (pmove == -1) {		/* user entered 'q' */
          goto quit;
        }
      } while (!dmove(board, pmove) && !done(board));

      /*  7.  Get computer's move:	*/

first:
      {
        int first = 0, y, x;

        move(20, 0); addstr("I'm thinking..."); clrtoeol();
        while (!done(board)) {
          cmove = comp(board);

          if (first == 0) {
            move(19, 0); printw("Computer moves: %d", cmove-(NR_PITS+1));
              clrtoeol();
            getyx(stdscr, y, x);
            first++;
          } else {
            move(y, x);
            printw(", %d", cmove-(NR_PITS+1));
            getyx(stdscr, y, x);
          }
          
          if (dmove(board, cmove)) {
            move(20, 0); clrtoeol();	/* Not thinking anymore */
            break;
          }
        }
      }

    } /* end of main move loop */

    /*  8.  Game is over. Sum up the results:	*/

    com = board[C_KALAH]; 
    hum = board[P_KALAH];
    for (i = 1; i <= NR_PITS; i++) { 
      hum += board[i];
      com += board[NR_PITS+1+i];
    }

    move(22, 0); printw("Score:   me %d  you %d . . . ", com, hum);
    if (com > hum) {
      addstr("I win\n");
    }
    else if (com == hum) {
      addstr("game is a draw\n");
    } else {
      addstr("you win\n");
    }

quit:
    move(23, 0); addstr("New game (y or n): "); clrtoeol();
    refresh();
    getstr(string);

  } while (toupper(string[0]) == 'Y');

  endwin();  

  return 0;
}

/*----------------------------------------------------------------------

Routine:	mmove

Description:	Perform the move 'move' on the 'old' board, and
		put the new board in 'new'. 

		Return FALSE only if the move ended in a kalah.
		This indicates that the mover may move again.
		Return TRUE otherwise.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */

static int mmove(old, new, mov)
char *old; 
char *new;
int   mov;
{
  int i; 
  int who;

  /*  1.  Check that 'move' is legal on 'old':	*/

  if ( (mov < P_FIRST) || (mov == P_KALAH) ||
       (mov >= BOARD_SIZE)      ||
       old[mov] == 0) {
    printf("Bad arg to mmove: %d",mov);
  }

  /*  2.  Do some setting up:	*/

  total++;	/* Total number of moves made during tree search */

  for (i = 0; i < BOARD_SIZE; ++i) {
    new[i] = old[i];
  }

  who = (mov < P_KALAH ? 1 : 0);  /* 1 == player, 0 == computer */

  /*  3.  Make move:	*/

  i = old[mov];	/* 'i' is the stones 'in hand' */
  new[mov] = 0;

  while (i--) {
    mov = mod(mov, who);
    ++new[mov];
  }

  /*  3.  Did we make a capture? */

  if (new[mov] == 1 && who == (mov < 7 ? 1 : 0) && mov && mov != 7) {
    new[who*P_KALAH] += new[14-mov];
    new[14-mov] = 0;
  }

  /*  4.  Did the move end in a kalah? */

  return (!(mov == C_KALAH || mov == P_KALAH));

}

/*----------------------------------------------------------------------

Routine:	mod

Description:	Return the number of the pit after 'i'.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */

static int mod(i, player)
int i,player;
{
  /*  1.  Get next pit number: */

  ++i;

  /*  2.  Only player may use player's own kalah:	*/

  if (i == P_KALAH) return( player ? P_KALAH : P_KALAH+1);
  if (i >= BOARD_SIZE) return ( player ? P_FIRST : C_KALAH);

  return(i);
}

/*----------------------------------------------------------------------

Routine:	initb

Description:	Initialize the board to starting position

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */

static void initb(board)
t_board board;
{
  int i;

  for (i=0; i<BOARD_SIZE; i++) {
    board[i] = NUM;
  }
  board[P_KALAH] = board[C_KALAH] = 0;
  printb(board);
}

/*----------------------------------------------------------------------

Routine:	printb

Description:	Display the kalah board on the screen.

		The board is displayed in lines 0-16,
		columns 0-77.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */

static char screen[17][78+1] = { /* Remember trailing \0! */
"+----------------------------------------------------------------------------+",
"|                                                                            |",
"|       ME        6       5       4       3       2       1                  |",
"|              +-----+ +-----+ +-----+ +-----+ +-----+ +-----+               |",
"|              |     | |     | |     | |     | |     | |     |               |",
"|              |     | |     | |     | |     | |     | |     |               |",
"|              |     | |     | |     | |     | |     | |     |               |",
"|              +-----+ +-----+ +-----+ +-----+ +-----+ +-----+               |",
"|                                                                            |",
"|              +-----+ +-----+ +-----+ +-----+ +-----+ +-----+               |",
"|              |     | |     | |     | |     | |     | |     |               |",
"|              |     | |     | |     | |     | |     | |     |               |",
"|              |     | |     | |     | |     | |     | |     |               |",
"|              +-----+ +-----+ +-----+ +-----+ +-----+ +-----+               |",
"|                 1       2       3       4       5       6        YOU       |",
"|                                                                            |",
"+----------------------------------------------------------------------------+"
};

/* 'centres' of the 0-13 pits */

static int ypos[14] = { 5, 11, 11, 11, 11, 11, 11, 11,  5,  5,  5,  5,  5,  5};
static int xpos[14] = { 8, 17, 25, 33, 41, 49, 57, 65, 57, 49, 41, 33, 25, 17};

static void printb(board)
t_board board;
{
  int i;

  /*  1.  Print empty board layout:  */

  for (i=0; i<17; i++) {
    move(i,0);
    addstr(screen[i]);
  }
  
  /*  2.  Fill in pit contents:  */

  for (i=0; i<BOARD_SIZE; i++) {
    move(ypos[i], xpos[i]);
    printw("%3d", board[i]);
  }

  /*  3.  Update board:  */

  refresh();
}

/*----------------------------------------------------------------------

Routine:	comp

Description:	given the board 'board', calulate the best
		next move and return it as result.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */

static int comp(board)
char *board;
{
  int score;
  int bestscore,best;
  char temp[14];
  int i;
  unsigned nodes;

  DEPTH = MAXDEPTH = CALLS = TOTDEPTH = WIDTH = TERM = 0;
  total = 0;

  /*  1. Only one possible move? Then select that:	*/

  if ((i = countnodes(board, C_FIRST)) == 1) {
    for (best = C_FIRST; best < C_FIRST+NR_PITS-1; ++best) {
      if (board[best]) {
        return(best);
      }
    }
  }

#if 0	/* DEBUG only */
  if (i < 1) {
    printw("ABORT! comp entered when no moves possible!");
    exit(1);
  }
#endif

  /*  2. Try each move that is left. Select the best one:	*/

  nodes = COUNT/i;
  bestscore = -10000;		/* should be MIN_INT */
  for (i = 13; i > P_KALAH; --i) {
    if (board[i]) {
      score = mmove(board,temp,i);
#if !TRACE
      score = comp1(temp, score, nodes, bestscore, 10000);
#else
      score = comp1(temp, score, nodes, db? -10000 : bestscore, 10000);
      if (db > 0) {
        printf("MOVE: %2d SCORE: %5d",
				i-P_KALAH,
			 (score>=1000)?(score-1000):
			  ((score<= -1000)?(score+1000):score));
	if (score > 1000 || score < -1000) {
          printf("  for SURE");
        }
        printf("\n");
      }
#endif
      if (score > bestscore) {
        bestscore = score;
        best = i;
      }
    }
  }

 /* - -

Indicate if we think we're winning or losing.

Comment by A. Thulin:

The program is sometimes wrong, altough it often is difficult to refute it,
especially with many stones.  The best strategy for the player to win a game
that the program thinks it has won, seems to be to play a 'waiting' game.

The fact that the program *is* wrong indicates an error somewhere, but it
does not appear to be an obvious one...

- -*/

  move(18, 0);
  if (bestscore > 1000) {
    addstr("(I think I've got you!)");
  } else if (bestscore < -1000) {
    addstr("(I think you've got me...)");
  } else {
    clrtoeol();
  }

#if TRACE
  if (db) {
    printf("\nCount: %u\n",total);
    printf("Maximum depth: %d\nAverage depth: %u\n", MAXDEPTH,TOTDEPTH/CALLS);
    printf("Terminal Evaluations: %u\nPlayed out: %u\n",WIDTH,TERM);
  }
#endif

  return(best);
}

/*----------------------------------------------------------------------

Routine:	comp1

Description:	The real alpha-beta minmax evaluator

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */

static int comp1(board, who, count, alpha, beta)
char     *board;	/* current board */
int       who;		/* who is to move */
unsigned  count; 	/* max nr of positions to examine */
int       alpha,	/* ... */
          beta;		/* ... */
{
  int i;
  int turn,new;
  char temp[14];
  unsigned nodes;

  ++DEPTH;
  MAXDEPTH = MAX(MAXDEPTH,DEPTH); 

  /*  1.  If no nodes left, evaluate position statically:	*/

  if (count < 1) {		/* No remaining nodes ... */
    ++CALLS;
    TOTDEPTH += DEPTH;
    ++WIDTH;
    --DEPTH;

    new = board[C_KALAH]-board[P_KALAH];	
    for (i = 1; i < P_KALAH; ++i) {
      turn = MIN(P_KALAH-i,board[i]);
      new -= 2*turn - board[i];
    }
    for (i = P_KALAH+1; i < 14; ++i) {
      turn = MAX(14-i,board[i]);
      new += 2*turn - board[i];
    }
    if (board[C_KALAH] > 6*NUM) {
      return new+1000;
    }
    if (board[P_KALAH] > 6*NUM) {
      return new-1000;
    }
    return(new);
  }

  /*  2.  No more moves to be examined?		*/

  if (done(board)) {
    ++CALLS;
    TOTDEPTH += DEPTH;
    ++TERM;
    --DEPTH;

    new = board[0]+board[8]+board[9]+board[10]+board[11]+board[12]+board[13]
         -board[1]-board[2]-board[3]-board[4]-board[5]-board[6]-board[7];
    if (new < 0) new -= 1000;
    if (new > 0) new += 1000;
    return(new);
  }

  /*  3.  Check moves further down in tree:	*/

#if 0  /* DEBUG printout only */
  if (countnodes(board, 8-who*7) == 0) {
    printf("BREAKOFF: EMPTY BOARD! who = %d\n", who);
    printf("done(board) = %d\n", done(board));
    for (i=0; i<BOARD_SIZE; i++) {
      printf("%4d", board[i]);
    }
    exit(1);
  }
#endif

  nodes = count/countnodes(board,8-who*7);
  for (i = 7*(1-who)+6; i > 7*(1-who); --i)
    if (board[i]) {
      turn = mmove(board,temp,i);
      new = comp1(temp,(turn ? 1-who : who),nodes,alpha,beta);
#if TRACE
      if (ab) printf("DEPTH: %2d  MOVE: %2d  NEW: %4d  ALPHA: %6d  BETA: %6d\n",DEPTH,i,new,alpha,beta);
#endif
      if (who) {
        beta = MIN(new,beta);
        if (beta <= alpha) {
          DEPTH--; 
          return(beta);
        }
      }
      else {
        alpha = MAX(new,alpha);
        if (alpha >= beta) {
          DEPTH--;
          return(alpha);
        }
      }
    }
  --DEPTH;

  return(who ? beta : alpha);
}


/*----------------------------------------------------------------------

Routine:	countnodes

Description:	How many moves are possible?

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */

static int countnodes(board, start) 
int start;
char *board; 
{
  int i, num;

  num = 0;
  for (i=start; i < start + NR_PITS; i++)
    num += (board[i] > 0 ? 1 : 0);
  return(num);
}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91官网在线观看| 暴力调教一区二区三区| 国产精品不卡在线观看| 欧美日韩国产一区二区三区地区| 国产在线播放一区| 亚洲欧美日韩在线| 337p粉嫩大胆噜噜噜噜噜91av| 一本色道亚洲精品aⅴ| 久久99久久精品| 亚洲一区二区三区自拍| 久久久99久久| 欧美成人伊人久久综合网| 91国产免费观看| 99精品久久只有精品| 国内精品在线播放| 水蜜桃久久夜色精品一区的特点 | 欧美性淫爽ww久久久久无| 国内不卡的二区三区中文字幕| 亚洲一区二区在线观看视频| 国产精品久久久久影院色老大| 精品国产乱码久久久久久牛牛| 欧美亚洲综合网| 99久久婷婷国产精品综合| 久88久久88久久久| 天堂午夜影视日韩欧美一区二区| 亚洲欧美一区二区不卡| 国产精品伦一区| 久久中文字幕电影| 欧美成人精品1314www| 欧美久久一区二区| 欧美日韩五月天| 91久久国产综合久久| 一本色道**综合亚洲精品蜜桃冫| 国产精品一区二区在线观看不卡| 另类调教123区| 日韩电影在线免费观看| 日韩精品午夜视频| 午夜亚洲福利老司机| 亚洲成av人片一区二区三区| 一个色在线综合| 亚洲成人av在线电影| 亚洲一区二区欧美日韩| 亚洲高清在线视频| 日韩中文字幕区一区有砖一区| 日韩国产欧美在线播放| 日日欢夜夜爽一区| 国内精品久久久久影院一蜜桃| 久久国产尿小便嘘嘘尿| 国产中文字幕精品| 国产成人综合亚洲网站| 成人免费看视频| 波多野洁衣一区| 色婷婷av久久久久久久| 欧美网站大全在线观看| 欧美性色黄大片| 丰满岳乱妇一区二区三区| 精品一区二区三区欧美| 精品一区二区在线观看| 精品一区二区三区蜜桃| 玖玖九九国产精品| 欧美性高清videossexo| 欧洲亚洲国产日韩| 91久久国产综合久久| 欧美三级日本三级少妇99| 欧美色精品天天在线观看视频| 色综合久久六月婷婷中文字幕| 欧美视频在线观看一区二区| 欧美区视频在线观看| 91精品国产黑色紧身裤美女| 欧美高清视频不卡网| 91精品欧美综合在线观看最新| 欧美日本乱大交xxxxx| 欧美精品18+| 欧美成人伊人久久综合网| 欧美大度的电影原声| 精品国产一区二区三区忘忧草| 国产欧美精品日韩区二区麻豆天美| 国产亚洲欧美在线| 亚洲欧洲精品成人久久奇米网| 亚洲三级免费电影| 一区二区三区日韩欧美| 亚洲h在线观看| 久99久精品视频免费观看| 风流少妇一区二区| 在线视频欧美精品| 欧美日韩在线播放三区| 久久久久久久精| 亚洲色图欧美激情| 视频一区视频二区在线观看| 久久99国产精品免费| 国产成人亚洲综合a∨婷婷图片| 成人一级片在线观看| 日本精品裸体写真集在线观看 | 亚洲欧美激情一区二区| 天堂va蜜桃一区二区三区| 国模冰冰炮一区二区| 91在线你懂得| 666欧美在线视频| 国产视频一区二区三区在线观看| 亚洲色图视频免费播放| 亚洲精品视频自拍| 激情国产一区二区| 一本到不卡免费一区二区| 欧美一区二区三区免费大片| 国产日韩欧美制服另类| 亚洲影视资源网| 国产一区二三区| 91一区二区在线观看| 欧美大黄免费观看| 亚洲精品国产无天堂网2021| 亚洲地区一二三色| 国产成人精品影院| 日韩一区二区在线观看视频播放| 中文一区二区在线观看| 免费观看日韩电影| 成人爱爱电影网址| 717成人午夜免费福利电影| 亚洲精品国产一区二区精华液| 国产一区在线精品| 欧美日韩在线不卡| 亚洲色图另类专区| 国产在线精品一区二区三区不卡| 色哟哟欧美精品| 精品少妇一区二区三区在线播放| 亚洲天天做日日做天天谢日日欢| 日本不卡一区二区| 欧美视频在线观看一区二区| 国产精品色在线| 国内一区二区在线| 欧美顶级少妇做爰| 亚洲激情一二三区| av一区二区久久| 国产偷国产偷亚洲高清人白洁| 日韩中文字幕亚洲一区二区va在线 | 99久久国产免费看| 亚洲精品一区二区三区福利| 亚洲三级久久久| 国产99久久久国产精品潘金网站| 欧美成人a∨高清免费观看| 亚洲国产乱码最新视频| 99热这里都是精品| 日本一区二区不卡视频| 国内精品久久久久影院薰衣草| 欧美一区二区三区色| 亚洲一二三级电影| 91丨porny丨户外露出| 亚洲色图一区二区| 99精品视频在线观看| 欧美国产激情一区二区三区蜜月| 狠狠色丁香久久婷婷综合丁香| 制服丝袜亚洲播放| 视频在线观看国产精品| 欧美日韩国产电影| 亚洲国产三级在线| 欧美三级一区二区| 亚洲大片免费看| 欧美日韩国产一区二区三区地区| 一区二区三区久久| 欧美视频一区二| 亚洲成人免费视| 欧美午夜精品久久久久久超碰| 午夜不卡av在线| 在线播放日韩导航| 视频在线在亚洲| 欧美xxxxx牲另类人与| 国内不卡的二区三区中文字幕| 久久婷婷久久一区二区三区| 精品一区二区精品| 中文字幕一区二区在线观看| 色综合天天性综合| 亚洲一区二区三区在线看| 欧美日韩精品一区二区天天拍小说 | 激情五月婷婷综合网| 久久久久久久综合色一本| 成人免费毛片app| 亚洲专区一二三| 欧美刺激午夜性久久久久久久| 国产精品一区不卡| 亚洲男人的天堂av| 91黄色免费看| 亚洲成精国产精品女| 欧美mv日韩mv国产网站app| 国产91高潮流白浆在线麻豆| 国产亚洲精久久久久久| 一本大道久久a久久综合婷婷| 亚洲一区二区三区中文字幕在线| 日韩一级大片在线| 成人免费视频app| 亚洲一区二区三区影院| 精品福利一二区| 99视频国产精品| 精品午夜久久福利影院| 亚洲欧美在线视频| 欧美日韩国产成人在线91| 国产剧情一区二区三区| 亚洲激情图片一区| 欧美大片一区二区| 91久久国产最好的精华液| 久久69国产一区二区蜜臀| 国产精品美日韩|