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

📄 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);
}


void
clear( 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("                                          ep05047 烈抖 灸\n                                              (办婶はアメリカのあるサイトのothelloに徊雇した)");
   getchar();
}



void
printintro( void )
{
   printscrn();

   clear();
   printf("舍奶のオセロゲ〖ムのル〖ルに骄う\n");
   printf("Press <return> to start the game.");
   getchar();

}



void
initboard( 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;
}


void
printboard( 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");

}


void
center( 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]);


}



int
check( 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);
}



int
getspcs( 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);
}



void
change( 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;
   }
}
}
char
getcolor( int who )
{
   return ( (who == 0)*WHITEPC + (who == 1)*BLACKPC );
}

char
invcolor( char piece )
{
   return( (BLACKPC + WHITEPC) - piece );
}

⌨️ 快捷键说明

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