井字棋AI

论坛 期权论坛 脚本     
匿名网站用户   2020-12-19 21:55   29   0
#include<stdio.h>//YZY_AI_try_fei_ge 
#include<windows.h>
#include<string.h>
#define INF 9999 
#define max(a,b) ((a)>(b))?(a):(b)
#define min(a,b) ((a)<(b))?(a):(b)
void setCursorPosition(int x,int y);
void setMap();
void start();
void computer(int cur);
void player(int cur);
void mind(int* x,int* y);
int deepMind(int deep,int maxDeep);
int evaluate();
int full();
int fullComputer();
int evaWhite(int cur);
int evaBlack(int cur);
int putChess(int x,int y,int cur);
int win();
int winComputer();
int setDesktop();
int map[3][3];
int main()
{
 while(setDesktop())
 {
  memset(map,0,sizeof(map));
  setMap();
  start();
 }
 return 0;
 } 
void start()
{
 int cur=-1;
 while(!win()&&!full())
 {
  cur++;
  if(!(cur%2))computer(cur);
  else player(cur);
 }
}
void computer(int cur)
{
 int x,y;
 mind(&x,&y);

 putChess(x,y,cur);
}
void mind(int* x,int* y)//AI
{
 int maxEvalue=-2*INF;
 for(int i=0;i<3;i++)
  for(int j=0;j<3;j++)
   if(!map[i][j])
   {
    map[i][j]=-1;
    int ans;
    ans=deepMind(1,2*1);
    if(maxEvalue<ans)
    {
     maxEvalue=ans;
     *x=i+1;*y=j+1;
    }
    map[i][j]=0;
   }
}
int deepMind(int deep,int maxDeep)//奇数电脑下完后的局 
{
 if(winComputer()) return deep%2?INF:-INF;
 if(fullComputer()) return 0;
 if(deep>=maxDeep) return evaluate();
 int eva;
 if(deep%2)
 {
  eva=INF*2;
  for(int i=0;i<3;i++)
   for(int j=0;j<3;j++)
    if(!map[i][j])
    {
     map[i][j]=1;
     eva=min(eva,deepMind(deep+1,maxDeep));
     map[i][j]=0;
    }
 }else{
  eva=-INF*2;
  for(int i=0;i<3;i++)
   for(int j=0;j<3;j++)
    if(!map[i][j])
    {
     map[i][j]=-1;
     eva=max(eva,deepMind(deep+1,maxDeep));
     map[i][j]=0;
    }
 }
 return eva;
}
int winComputer()
{
 int sure=0;
 for(int i=0;i<3&&(sure!=3&&sure!=-3);i++)
 {
  sure=0;
  sure=map[i][0]+map[i][1]+map[i][2];
 }
 for(int i=0;i<3&&(sure!=3&&sure!=-3);i++)
 {
  sure=0;
  sure=map[0][i]+map[1][i]+map[2][i];
 }
 if(sure!=3&&sure!=-3) {sure=0;sure=map[0][0]+map[1][1]+map[2][2];}
 if(sure!=3&&sure!=-3) {sure=0;sure=map[0][2]+map[1][1]+map[2][0];}
 if(sure!=3&&sure!=-3) return 0;
 else {
  return 1;
 }
}
int evaluate()
{
 return evaWhite(1)-evaBlack(-1);
}
int evaWhite(int cur)
{
 int count=0;
 for(int i=0;i<3;i++)
  if(map[i][0]!=cur&&map[i][1]!=cur&&map[i][2]!=cur)
   count++;
 for(int i=0;i<3;i++)
  if(map[0][i]!=cur&&map[1][i]!=cur&&map[2][i]!=cur)
   count++;
 if(map[0][0]!=cur&&map[1][1]!=cur&&map[2][2]!=cur) count++;
 if(map[0][2]!=cur&&map[1][1]!=cur&&map[2][1]!=cur) count++;
 return count;
} 
int evaBlack(int cur)
{
 int count=evaWhite(cur);
 return count;
 } 
void player(int cur)
{
 int x,y,count=1;
 while(1)
  {
   setCursorPosition(0,7);
   printf("坐标:     ");
   setCursorPosition(7,7);
   scanf("%d %d",&x,&y);
   if(putChess(x,y,cur)) break;
   setCursorPosition(0,8);
   printf("落子失败请重试第%d次!",count++);
  }
}
int putChess(int x,int y,int cur)
{
 if(x<=0||x>3||y<=0||y>3) return 0; 
 if(map[x-1][y-1]) return 0;
 setCursorPosition(0,8);
 printf("                            ");
 setCursorPosition(0,0);
 setCursorPosition(4*(y+1),2*x-1);
 if(cur%2) {map[x-1][y-1]=1;putchar('X');}
 else {map[x-1][y-1]=-1;putchar('O');}
}
int win()
{
 int sure=0;
 for(int i=0;i<3&&(sure!=3&&sure!=-3);i++)
 {
  sure=0;
  sure=map[i][0]+map[i][1]+map[i][2];
 }
 for(int i=0;i<3&&(sure!=3&&sure!=-3);i++)
 {
  sure=0;
  sure=map[0][i]+map[1][i]+map[2][i];
 }
 if(sure!=3&&sure!=-3) {sure=0;sure=map[0][0]+map[1][1]+map[2][2];}
 if(sure!=3&&sure!=-3) {sure=0;sure=map[0][2]+map[1][1]+map[2][0];}
 if(sure!=3&&sure!=-3) return 0;
 else {
  if(sure==3)
  {
   setCursorPosition(0,8);
   printf("X胜利                    \n"); 
  }else{
   setCursorPosition(0,8);
   printf("O胜利                    \n"); 
  }
  system("pause");
  return 1;
 }
}
int fullComputer()
{
 int sure=1;
 for(int i=0;i<3;i++)
  for(int j=0;j<3;j++)
   if(!map[i][j])
    sure=0;
 return sure;
}
int full()
{
 int sure=1;
 for(int i=0;i<3;i++)
  for(int j=0;j<3;j++)
   if(!map[i][j])
    sure=0;
 if(sure==1)
 {
  setCursorPosition(0,8);
  printf("平局!\n");
  system("pause");
 }
 return sure;
}
int setDesktop()
{
 system("cls");
 int choose;
 printf("0.退出;\n");
 printf("1.开始;\n");
 printf("选择:");
 scanf("%d",&choose);
 system("cls");
 return choose;
}
void setMap()
{
 printf("      -------------\n");
 printf("      |   |   |   |\n");
 printf("      -------------\n");
 printf("      |   |   |   |\n");
 printf("      -------------\n");
 printf("      |   |   |   |\n");
 printf("      -------------\n");
}
void setCursorPosition(int x,int y)
{
 COORD coord;
 coord.X=x;
 coord.Y=y;
 SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),coord);
}

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:1136255
帖子:227251
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP