#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);
}
井字棋AI
最新推荐文章于 2024-05-17 18:56:51 发布