⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 othello.c~

📁 linux下编的黑白棋 棋盘格4x4 人机对战 gcc编译
💻 C~
字号:
#include <stdio.h>#include <stdlib.h>#include <ctype.h>#define     DIM 4  /* 4∵4の鸽茸 */#define   NOSPC 'x'/*弥く眷疥ない*/#define FREESPC ' '/*鄂腕*/#define BLACKPC '*'/*  辊短 */#define WHITEPC 'o'/* 球短 */void clear(      void );void printintro( void );void printscrn(  void );void initboard(  void );void printboard( void );void center( int );int place( int, int, int, int );int move(  int, int );int check( int, int, int, int * );int getspcs( int, int, int, int, int );void change( int, int, int * );char getcolor( int );char invcolor( char );char board[DIM + 2][DIM + 2]; int pcnum[3] = { 2, 2, 12 }; /*   0 = computer                             1 = human                             2 = free spaces    */int depth;  /* 雇えの考さ */main(){   int x, plyr = 1,  /* プレヤ〖フラグ                   ~     0 = computer, 1 = human                   */       a, b, c, d, max;   char y;   /*  棱汤と鸽茸を今く */   printintro();   initboard();   while( pcnum[0] * pcnum[1] * pcnum[2] )   {      printboard();      c = 0;      max = 0;      while( c < 2 )      {         for( a = 1; a < DIM + 1; a++ )            for( b = 1; b < DIM + 1; b++ )            {               if ( board[a][b] == FREESPC )                  d = check( plyr, a, b, NULL );/*check簇眶で短を弥けるかをチェックする*/               if (d > max)                  max = d;            }         if (max > 0)            break;         c++;         plyr = 1 - plyr;      }      if (c == 2)      {         printf("もう弥けない\n");         printf("(Press return)");         getchar();         break;      }      if (c == 1)         if (plyr == 0)         {            printf("おまえ海搀パス ");            printf("コンピュ〖タもう办搀.\n(Press return)");            getchar();            printboard();         } else {            printf("コンピュ〖タパス、おまえもう办搀 ");            printf("お搓い.\n");         }      if (plyr)      {         printf("郝筛を今きなさい:\n");         scanf("%c%d", &y, &x );         getchar();         /*  Check to make sure that the move is legal */         if ( place( plyr, tolower(y) - 'a' + 1, x, 0) )         {            /*  Prompt the user for his move */            printf("ここに弥けない.\n");            printf("(Press return)\n");            getchar();            plyr = 0;         }      } else {/*コンピュ〖タの戎*/         depth = 3;         move( plyr, 0 );      }      plyr = 1 - plyr;  /* プレヤ〖蛤仑 */   }   /* ゲ〖ム冯蔡 */   clear();   printf("\n\n\n\n\n\n\n\n\n\n\n");   center( 9 );   if (pcnum[1] > pcnum[0])      printf("YOU WIN!!\n");   if (pcnum[1] < pcnum[0])      printf("YOU LOSE.\n");   if (pcnum[1] == pcnum[0])      printf("苞き尸け!\n");   return(0);}voidclear( void ){   if (system("clear"))   {      printf("An error occured clearing the screen.\n");      exit(0);   }}void printscrn( void ){   clear();   printf("\n\n\n\n\n\n\n\n\n\n\n                        オセロ                          \n\n\n\n\n\n\n\n\n\n\n");   printf("                             デ〖タ菇陇とアルゴリズム呵姜レポ〖ト\n\n");   printf("                                          ep03027 拨 池\n                                              (办婶はアメリカのあるサイトのothelloに徊雇した)");   getchar();}voidprintintro( void ){   printscrn();   clear();   printf("舍奶のオセロゲ〖ムのル〖ルに骄う\n");   printf("Press <return> to start the game.");   getchar();}voidinitboard( void ){   int i, j;   for( i = 0; i < DIM + 2; i++ )      for( j = 0; j < DIM + 2; j++ )         if (i * j == 0 || i == DIM + 1 || j == DIM + 1)            board[i][j] = NOSPC;         else            board[i][j] = FREESPC;   board[ DIM/2    ][ DIM/2    ] = BLACKPC;   board[ DIM/2    ][ DIM/2 + 1] = WHITEPC;   board[ DIM/2 + 1][ DIM/2    ] = WHITEPC;   board[ DIM/2 + 1][ DIM/2 + 1] = BLACKPC;}voidprintboard( void )/*鸽茸を今く*/{   int i, j, c = DIM * 4 + 17;   char  comp[20] = "コンピュ〖タ",         humn[20] = "おまえ   ",        *pstr[2]  = {comp, humn};   clear();   center( c );   printf("  ");   for( i = 0; i < DIM; i++ )      printf("  %d ", i + 1);   printf("\n");   for ( i = 0; i < DIM; i++ )   {      center( c );      printf("  +");      for (j = 0; j < DIM; j++)         printf("---+");      printf("\n");      center( c );      printf("%c | %c", 'A' + i, board[i+1][1] );      for (j = 1; j < DIM; j++)         printf(" | %c", board[i+1][j+1]);      printf(" | %c", 'A' + i);      if (i < 2)         printf("   %s: %d", pstr[i], pcnum[i] );      printf("\n");   }   center( c );   printf("  +");   for (j = 0; j < DIM; j++)      printf("---+");   printf("\n");   center( c );   printf("  ");   for( i = 0; i < DIM; i++ )      printf("  %d ", i + 1);   printf("\n\n");}voidcenter( int spaces ){   int i;   for( i = 0; i < (80 - spaces) / 2; i++ )      printf(" ");}place( int who, int y, int x, int undo )/*短を弥く*/{   int n, k[8], na = 100 * (who * 2 - 1);   /* na 痰跟な猛 -100 に提る                */   if (x < 1 || y < 1)      return (na);   if (x > DIM || y > DIM)      return (na);   if (board[y][x] != FREESPC)      return (na);   if ( check( who, y, x, k ) == 0 )      return (na);   /*呵努眷疥を玫すため、短を极瓢に弥くときの球か辊かの冉们 */   board[y][x] = getcolor( who );   pcnum[2] -= 1;   pcnum[who] += 1;   /* チェンジ */   change( y, x, k );   /* もし塑碰に短を弥くなら、undoではない */   if (!undo)      return(0);   n = move( 1 - who, 1 );   depth++;  /* 徒鳞の考さ */   board[y][x] = FREESPC;   pcnum[2] += 1;   pcnum[who] -= 1;   change( y, x, k );   return (n);/*moveからの猛に提る*/}move( int who, int n ) /* nはplaceから */{   		int y, x, a, b, val, max = -100;	   char mycolor = getcolor( who ); /* 球か辊か冉们 */   /* 考さの姜爬に缅くと*/   if (depth-- < 1)      return( pcnum[0] - pcnum[1] ); /* ミニマクス恕で冉们 */   for( y = 1; y < DIM + 1; y++ ){      for( x = 1; x < DIM + 1; x++ )      {          /*who プレヤ〖が 1 コンピュ〖タが 0で 赖と砷に惰侍する */          val = (who * -2 + 1) * place( who, y, x, 1 );          if (val > max)            {             max = val;             a = y;             b = x;		          }      }	}  if ( max > -100 )      return (place( who, a, b, n ));         else            return (pcnum[0] - pcnum[1]);}intcheck( int who, int y, int x, int *k ){   int n = 0, i, j, num, max = 0, ydir, xdir; /* "dir" means "direction */    for( i = y - 1; i < y + 2; i++ )      for( j = x - 1; j < x + 2; j++ )         {            ydir = i - y;             xdir = j - x; /*                          ydir = -1   ydir = -1   ydir = -1                          xdir = -1   xdir =  0   xdir =  1                                    \     ^     /                                      \   |   /                          ydir =  0     \ | /     ydir = 0                          xdir = -1 <----- -----> xdir = 1                                        / | \                                      /   |   \                                    /     v     \                          ydir =  1   ydir =  1   ydir = 1                          xdir = -1   xdir =  0   xdir = 1 */                       if ( ydir || xdir )            {                              num = getspcs( 1 - who, i, j, ydir, xdir );               if (k != NULL )                    k[n++] = num;                                               if ( num > max )                       max = num;              }         }   return (max);}intgetspcs( int color, int y, int x, int ydir, int xdir ){    int n = 0;   char colrpc = getcolor( color );    while( board[y][x] == colrpc )   {                                  n++;            y += ydir;       x += xdir;   }      if (board[y][x] == invcolor( colrpc ) )      return (n);     else      return (0);}voidchange( int y, int x, int *amt )/*弥いた短による,辊か球かチェンジ*/{   int a, b, i, n, tempwho, ydir, xdir;   for( i = 0; i < 8; i++ )   {      ydir = 0 + (i > 4) - (i < 3);      xdir = 0 + (i < 4)*(i % 3 - 1) - (i > 3)*((7 - i) % 3 - 1);      a = y + ydir;        b = x + xdir;        n = 0;       while( n++ < amt[i] )       {         tempwho = (board[a][b] == BLACKPC);         board[a][b] = getcolor( 1 - tempwho );          pcnum[tempwho] -= 1;          pcnum[1 - tempwho] += 1;          a += ydir;          b += xdir;   }}}chargetcolor( int who ){   return ( (who == 0)*WHITEPC + (who == 1)*BLACKPC );}charinvcolor( char piece ){   return( (BLACKPC + WHITEPC) - piece );}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -