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

📄 人机下棋.c

📁 用c语言编写的关于人机下棋问题的相关源程序
💻 C
字号:
#include <stdio.h>

typedef char chess [10];
typedef int  temparr [10];

chess arr;
temparr brr;
int number, suc, c3, n2, c2, n1, c1;
char ch;

void  inarrdata(chess a)
{ a[1] = '1';    a[2] = '2';    a[3] = '3';
  a[4] = '4';    a[5] = '5';    a[6] = '6';
  a[7] = '7';    a[8] = '8';    a[9] = '9';
}

void  display(chess a)
{ printf("    棋盘显示\n");
  printf("\n");   printf("\n");
  printf("      %c | %c | %c\n",a[1],a[2],a[3]);
  printf("     -----------\n");
  printf("      %c | %c | %c\n",a[4],a[5],a[6]);
  printf("     -----------\n");
  printf("      %c | %c | %c\n",a[7],a[8],a[9]);
  printf("\n");   printf("\n");
}

int arrfull()
{ int i;
  int arrf = 0;
  
  for(i = 1; i<= 9; i++)
     if(i == arr[i] - 48)  arrf = 1;
  return arrf;
}

void cn(int line)
{  switch(line)
    {case 0: c3 = c3 + 1; break;
     case 1: n2 = n2 + 1; break;
     case 2: c2 = c2 + 1; break;
     case 3: n1 = n1 + 1; break;
     case 4: c1 = c1 + 1; break;}
}

int linenum(char a,char b,char c)
{  int ln = 5;
   
   if((a == 'X') && (b == 'X') && (c == 'X'))
       ln = 0;
   if(((a == 'O') && (b == 'O') && (c != 'O'))
   || ((a == 'O') && (b != 'O') && (c == 'O'))
   || ((a != 'O') && (b == 'O') && (c == 'O')))
       ln = 1;
   if(((a == 'X') && (b == 'X') && (c != 'X'))
   || ((a == 'X') && (b != 'X') && (c == 'X'))
   || ((a != 'X') && (b == 'X') && (c == 'X')))
       ln = 2;
   if(((a == 'O') && (b != 'O') && (c != 'O'))
   || ((a != 'O') && (b == 'O') && (c != 'O'))
   || ((a != 'O') && (b != 'O') && (c == 'O')))
       ln = 3;
   if(((a == 'X') && (b != 'X') && (c != 'X'))
   || ((a != 'X') && (b == 'X') && (c != 'X'))
   || ((a != 'X') && (b != 'X') && (c == 'X')))
       ln = 4;
   return ln;
}

int maxbrr(int  *br)
   { int temp, i, mb;
     temp = -888;

     for(i = 1; i <= 9; i++)
        {if(temp <= br[i])
           {temp = br[i];
            mb = i;}}
     return mb;
   }

void manstep()
/*人走棋处理模块*/
{ int j;

  display(arr);
  if(arrfull())                         /*如果棋盘上还有可下棋的位置,给人走一步棋*/
  {printf("输入下一步对应位置编号 : ");
   scanf("%d",&j);   printf("\n");
   while((j < 1)||(j > 9) || (j != arr[j] - 48))
        { printf("输入错误,重新输入 : ");
          scanf("%d",&j);}
   arr[j] = 'O';}
}

void computerstep()
{/*计算机走棋处理模块*/
   int i;

   if (arrfull())                       /*如果棋盘上还有可下棋的位置,则计算机走一步棋*/
      {for(i = 1; i <= 9; i++)          /*对每一步可走棋的位置进行计算*/
         {if(i == arr[i] - 48) { c3 = 0; n2 = 0; c2 = 0; n1 = 0; c1 = 0; arr[i] = 'X';
              number = linenum(arr[1],arr[2],arr[3]);  cn(number);
              number = linenum(arr[4],arr[5],arr[6]);  cn(number);
              number = linenum(arr[7],arr[8],arr[9]);  cn(number);
              number = linenum(arr[1],arr[4],arr[7]);  cn(number);
              number = linenum(arr[2],arr[5],arr[8]);  cn(number);
              number = linenum(arr[3],arr[6],arr[9]);  cn(number);
              number = linenum(arr[1],arr[5],arr[9]);  cn(number);
              number = linenum(arr[3],arr[5],arr[7]);  cn(number);
              brr[i] = (128*c3 - 63*n2 + 31*c2 - 15*n1 + 7*c1);     /*计算此步权值*/
              arr[i] = i + 48;}
          else brr[i] = -999;}
       arr[maxbrr(brr)] = 'X';                     /*确定计算机走哪一步:权值最大的一步*/
       c3 = 0; n2 = 0; c2 = 0; n1 = 0; c1 = 0;
       number = linenum(arr[1],arr[2],arr[3]); cn(number);
       number = linenum(arr[4],arr[5],arr[6]); cn(number);
       number = linenum(arr[7],arr[8],arr[9]); cn(number);
       number = linenum(arr[1],arr[4],arr[7]); cn(number);
       number = linenum(arr[2],arr[5],arr[8]); cn(number);
       number = linenum(arr[3],arr[6],arr[9]); cn(number);
       number = linenum(arr[1],arr[5],arr[9]); cn(number);
       number = linenum(arr[3],arr[5],arr[7]); cn(number);
       if(c3 != 0 )                                /*计算机已胜*/
           { display(arr);
             printf("\n");
	     printf("计算机胜!!!\n\n\n");
	     fflush(stdin);
	     suc = 0;}
       }
     else suc = 0;}

main()
 {
  inarrdata(arr);                             /*棋盘坐标编号*/
  display(arr);                               /*显示初始坐标*/
  suc = 1;  printf("你先走吗? (y/n)  ");
  scanf("%c",&ch);
  printf("\n");
  if ((ch == 'y') || (ch == 'Y'))             /*人先走棋*/
     { while (suc )
          { manstep();  computerstep();}
       display(arr);}
  else { while (suc )                         /*计算机先走棋*/
            { computerstep();
              if(suc)  manstep();}
       }
 }

⌨️ 快捷键说明

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