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

📄 wuziqi.c

📁 五子棋小游戏#include<stdlib.h> #include<time.h> #include<stdio.h> #include<conio.h
💻 C
字号:
#include<stdlib.h>
#include<time.h>
#include<stdio.h>
#include<conio.h>
int chess[169]={0};/*棋盘*/

struct chess_t/*作为辅助,即是作为建意*/
{
    char attack;/*攻防用的,0表示守,1表示攻*/
    int j;/*作为优先级用*/
}chess_a[169];

void prinf(void)/*输出部分*/
{
     int i,k,m=0;
     system("cls");
    for(i=1;i<=169;i++)
    {
        if(i%13==1)
        {
         if(chess[i-1]>0)
          printf("%3d",i);
         else
          printf("%3c",-chess[i-1]);/*负数表示人与机己下的子*/
        }
        else
        {
         if(chess[i-1]>0)
          printf("|%3d",i);
         else
          printf("|%3c",-chess[i-1]);/*负数表示人与机己下的子*/
        }

       if(!(i%13))
       {
           for(k=1;k<=13;k++,m++)
         {
            if(k==1)
            {printf("%2c",' ');
              if(chess[m]>0)
              putchar(' ');
              else
              printf("%c",-chess[m]);
            }
            else
            {
              putchar('|');
              if(chess[m]>0)
              putchar(' ');
              else
               printf("%c",-chess[m]);
            }
         }
         putchar('\n');
       }
    }

}

char AI_dz(int b,long *chess_m,
            const int O,const int X
          )/*忧化AI*/
{
    int i,root=-1; /*root是权限*/
    
          if(!(O==0||X==0))
          { return 0;}
          switch(b)
          {
               case 1:root=0;break;
               case 2:root=1;break;
               case 3:root=2;break;
               case 4:root=3;break;
          }
          for(i=0;b>0&&b<5&&i<5;i++)
          {
              if(chess_m[i]>=0)
              {
                 switch(i)
                 {
                    case 0:
                              if(chess_m[i+1]<0) /*表示为-1 O ? ? ?*/
                              {

                                  if(chess_a[chess_m[i]].j>root||
                                     chess_a[chess_m[i]].j==-1
                                     )/*相当于权限小*/
                                   {
                                        if(X==5-b&&O==0)/*攻*/
                                        {
                                             chess_a[chess_m[i]].attack=1;
                                             chess_a[chess_m[i]].j=root;/*赋一个权限*/
                                        }
                                        else
                                           if(O==5-b&&X==0)/*防*/
                                           {
                                              chess_a[chess_m[i]].attack=-1;
                                              chess_a[chess_m[i]].j=root;/*赋一个权限*/
                                           }
                                   }
                              }
                           break;
                    case 1:
                    case 2:
                    case 3:
                            if(!(chess_m[i+1]>=0&&chess_m[i-1]>=0))
                            {
                                if(chess_a[chess_m[i]].j>root||
                                     chess_a[chess_m[i]].j==-1
                                     )/*相当于权限小*/
                                   {
                                        if(X==5-b&&O==0)/*攻*/
                                        {
                                             chess_a[chess_m[i]].attack=1;
                                             chess_a[chess_m[i]].j=root;/*赋一个权限*/
                                        }
                                        else
                                           if(O==5-b&&X==0)/*防*/
                                           {
                                              chess_a[chess_m[i]].attack=-1;
                                              chess_a[chess_m[i]].j=root;/*赋一个权限*/
                                           }
                                   }
                            }
                           break;
                     case 4:
                           if(chess_m[i-1]<0) /*表示为? ? ? O -1*/
                              {

                                  if(chess_a[chess_m[i]].j>root||
                                     chess_a[chess_m[i]].j==-1
                                     )/*相当于权限小*/
                                   {
                                        if(X==5-b&&O==0)/*攻*/
                                        {
                                             chess_a[chess_m[i]].attack=1;
                                             chess_a[chess_m[i]].j=root;/*赋一个权限*/
                                        }
                                        else
                                           if(O==5-b&&X==0)/*防*/
                                           {
                                              chess_a[chess_m[i]].attack=-1;
                                              chess_a[chess_m[i]].j=root;/*赋一个权限*/
                                           }
                                   }
                              }
                           break;
                 }
              }
          }
}
char AI_fx(const int N,int k,int i,
           const int O,const int X) /*智能调整*/
{
   int j;
   int  m=0;/*m为容量*/
   long  chess_m[5]={0};/*棋所在位置的关系*/

   for(j=0;j<5;j++)
   {
       switch(i)
       {
            case 1:
                    if(chess[N-28+k*13+j%5]>=0)/*表示没有被使用*/
                    {
                        chess_m[j]=N-28+k*13+j%5;;
                        m++;
                    }
                    else
                       chess_m[j]=-(N-28+k*13+j%5)-1;
                     break;
            case 2:
                     if(chess[N-28+k+(j%5)*13]>=0)
                     {
                        chess_m[j]=N-28+k+(j%5)*13;
                        m++;
                     }
                     else
                        chess_m[j]=-(N-28+k+(j%5)*13)-1;
                     break;
            case 3:
                     if(chess[N-28+4*k+j%5*(14+k*(-2))]>=0)
                     {
                        chess_m[j]=N-28+4*k+j%5*(14+k*(-2));
                        m++;
                     }
                     else
                        chess_m[j]=-(N-28+4*k+j%5*(14+k*(-2)))-1;
                     break;
       }
   }

   AI_dz(m,chess_m,O,X);

}

char chess_Judge(const int N)/*棋盘判断*/
{
    int i,j,k;
    char O=0,X=0;

    for(i=1;i<=3;i++)
    {
        k=0;
        for(j=0;j<25;j++)
       {
            switch(i)
            {
              case 1:/*行*/
               /*N-28+k*13+j%5*/
                      if(chess[N-28+k*13+j%5]==-'O')
                           ++O;
                      else
                          if(chess[N-28+k*13+j%5]==-'X')
                           ++X;
                      break;
              case 2:/*列*/
              /* N-28+k+(j%5)*13*/
                      if(chess[N-28+k+(j%5)*13]==-'O')
                        ++O;
                      else
                          if(chess[N-28+k+(j%5)*13]==-'X')
                             ++X;
                       break;
              case 3:/*斜*/
              /*N-28+4*k+j%5*(12+2+k*(-2))*/
                    if(j<10)
                       if(chess[N-28+4*k+j%5*(14+k*(-2))]==-'O')
                         ++O;
                       else
                           if(chess[N-28+4*k+j%5*(14+k*(-2))]==-'X')
                                ++X;
                     break;
           }

             if(!((j+1)%5))
           {
              if(O==5)/*表示用户胜利*/
                  return -1;
              else
                  if(X==5)/*表示电脑胜利*/
                  return 1;
             AI_fx(N,k,i,O,X);
            k++;
            O=0;X=0; /*还原*/
           }

            if(i==3&&j>=9)
            return 0;
       }
    }
    
}

char chess_go(void)
{
    int i,j;
    /*从下标28开始*/
    for(i=28;i<=132;i+=13)
       for(j=i;j<=i+8;j++)
        if(chess_Judge(j)==1)
            return 1;
         else
            if(chess_Judge(j)==-1)
               return -1;
      return 0;
}


void computer_think()/*类似于出圈问题*/
{
    int i,j,k=0,m;
    j=rand()%169;

   for(m=1;m<=169;m++)
    for(i=1;i<=169;i++)
    {
     if(chess[i-1]>0)
      {
         ++k;
        if(k>j)
        {
          chess[i-1]=-'X';
            return ;
        }
      }
    }
}


char com_attack(void)  /*AI的谋略*/
{
     int i,j;
     for(i=0;i<4;i++)
     {
       for(j=0;j<169;j++)/*攻*/
        {
           if(chess_a[j].j==i&&chess_a[j].attack==1)
                 if(chess[j]>0)
                   {chess[j]=-'X';
                     return 0;
                   }
        }

         for(j=0;j<169;j++)/*防*/
        {
           if(chess_a[j].j==i&&chess_a[j].attack==-1)
             if(chess[j]>0)
                   {chess[j]=-'X';
                     return 0;
                   }
         }
     }
       return 1;
}
int main()
{
    int i,k=85;
    char flag=0;
    srand(time(NULL));
    for(i=1;i<=169;i++)/*初始化*/
      chess[i-1]=i;/*正数表示数字对应地方,相当于空格*/

     for(i=0;i<169;i++)
      {chess_a[i].attack=0;
       chess_a[i].j=-1;/*表示没有任何权限*/
      }
     prinf();
     for(;k>0;k--)
     {
         do
         {
         scanf("%d",&i);/*用户输入方式*/
          if(i<=0||i>169||chess[i-1]<0)
          puts("redo");
         }while(i<=0||i>169||chess[i-1]<0);
         chess[i-1]=-'O';
           flag=chess_go();
         if(!flag) /*如果分出胜负,防止电脑继续*/
         {
           if(com_attack())
             computer_think();
         }
            prinf();
            flag=chess_go();
         if(flag>0)
         {
              puts("COM WIN");
              break;
         }
         else
            if(flag<0)
              {
                 puts("YOU WIN");
                  break;
              }

     }
}

⌨️ 快捷键说明

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