代码用c写的,算法比较丑陋
#include <stdio.h>
int s1;
int s2; //人棋子
int w; //电脑棋子
int n = 9; //存放棋盘空位置数量
void Intro() //游戏简介
{
printf("\t\t\t\t\t程序员:demon咔咔");
printf("\n【游戏规则:由最先在任意一条直线上成功连接成三个标记的一方获胜】\n\n");
printf("棋盘:\n");
printf(" 1 | 2 | 3\n");
printf("----------\n");
printf(" 4 | 5 | 6\n");
printf("----------\n");
printf(" 7 | 8 | 9\n");
}
int Judge(int a[]) //判断是否胜利
{
if(a[1]!=0 && a[1]==a[2] && a[2]==a[3]) return 1;
else if(a[4]!=0 && a[4]==a[5] && a[5]==a[6]) return 1;
else if(a[7]!=0 && a[7]==a[8] && a[8]==a[9]) return 1;
else if(a[1]!=0 && a[1]==a[4] && a[4]==a[7]) return 1;
else if(a[2]!=0 && a[2]==a[5] && a[5]==a[8]) return 1;
else if(a[3]!=0 && a[3]==a[6] && a[6]==a[9]) return 1;
else if(a[1]!=0 && a[1]==a[5] && a[5]==a[9]) return 1;
else if(a[3]!=0 && a[3]==a[5] && a[5]==a[7]) return 1;
return 0;
}
void Show(int a[])
{
int i;
char temp[10]={0};
for (i=1;i<10;i++) //棋子转换
{
if (a[i]>0) temp[i]=88;
else if (a[i]<0) temp[i]=79;
}
printf("\n %c | %c | %c\n",temp[1],temp[2],temp[3]);
printf("-----------\n");
printf(" %c | %c | %c\n",temp[4],temp[5],temp[6]);
printf("-----------\n");
printf(" %c | %c | %c\n",temp[7],temp[8],temp[9]);
}
void Checker(int a[],int x) //显示棋盘
{
Show(a);
n--; //剩余空位置个数
if(x==2)
{
printf("你赢了\n");
getchar();
}
else if(x==3)
{
printf("你输了\n");
getchar();
}
}
int People1(int a[]) //人走棋
{
int num;
while(1)
{
printf("\nPLAYER1选择位置放置棋子:");
scanf("%d",&num);
getchar();
if(num>0 && num<10 && a[num]==0)
{
a[num]=s1;
if(Judge(a))
{
Checker(a,2);
return 1;
}
else
{
n--;
return 0;
}
}
else
printf("输入有误\n");
}
}
int People2(int a[]) //人走棋
{
int num;
while(1)
{
printf("\nPLAYER2选择位置放置棋子:");
scanf("%d",&num);
getchar();
if(num>0 && num<10 && a[num]==0)
{
a[num]=s2;
if(Judge(a))
{
Checker(a,2);
return 1;
}
else
{
n--;
return 0;
}
}
else
printf("输入有误\n");
}
}
int Max(int temp[]) //比较胜率大小
{
int i,max=1;
for (i=2;i<10;i++)
{
if(temp[max]<temp[i])
max=i;
}
return max;
}
int Computer(int a[]) //电脑走棋
{
int i;
int temp[10]={0}; //胜率计数器
if(n<=6) //输赢情况有可能发生了
{
for(i=1;i<10;i++) //电脑能赢,就赢
{
if(a[i]==0)
{
a[i]=w;
if(Judge(a))
{
Checker(a,3);
return 1; //1标示分出胜负
}
else
a[i]=0;
}
}
for (i=1;i<10;i++) //电脑不能赢,人能赢,就堵
{
if(a[i]==0)
{
a[i]=s1;
if(Judge(a))
{
a[i]=w;
Checker(a,0);
return 0;
}
else
a[i]=0;
}
}
}
//共八种胜利情况,计算九个格子的胜率
if( (a[1]==0 || a[1]==w) && (a[2]==0 || a[2]==w) && (a[3]==0 || a[3]==w) )
{ temp[1]++; temp[2]++; temp[3]++; }
if( (a[4]==0 || a[4]==w) && (a[5]==0 || a[5]==w) && (a[6]==0 || a[6]==w) )
{ temp[4]++; temp[5]++; temp[6]++; }
if( (a[7]==0 || a[7]==w) && (a[8]==0 || a[8]==w) && (a[9]==0 || a[9]==w) )
{ temp[7]++; temp[8]++; temp[9]++; }
if( (a[1]==0 || a[1]==w) && (a[4]==0 || a[4]==w) && (a[7]==0 || a[7]==w) )
{ temp[1]++; temp[4]++; temp[7]++; }
if( (a[2]==0 || a[2]==w) && (a[5]==0 || a[5]==w) && (a[8]==0 || a[8]==w) )
{ temp[2]++; temp[5]++; temp[8]++; }
if( (a[3]==0 || a[3]==w) && (a[6]==0 || a[6]==w) && (a[9]==0 || a[9]==w) )
{ temp[3]++; temp[6]++; temp[9]++; }
if( (a[1]==0 || a[1]==w) && (a[5]==0 || a[5]==w) && (a[9]==0 || a[9]==w) )
{ temp[1]++; temp[5]++; temp[9]++; }
if( (a[3]==0 || a[3]==w) && (a[5]==0 || a[5]==w) && (a[7]==0 || a[7]==w) )
{ temp[3]++; temp[5]++; temp[7]++; }
for (i=1;i<10;i++) //将走过的格子胜率除去
{
if(a[i]!=0)
temp[i]=-1;
}
a[Max(temp)]=w; //选择最高胜率
Checker(a,0);
return 0;
}
void main()
{
int a[10] = {0}; //存放棋子
int num;
int temp;
Intro();
while(1) //输入错误,继续输入
{
n = 9;
printf("\n1 P v E 2- P V P 0--退出游戏\n");
printf("\n【菜单选择】:");
scanf("%d",&num);
getchar(); //接收回车
if (num == 0)
{
printf("游戏结束\n");
getchar();
return;
}
else if(num == 1) //人先走
{
s1=1;w=-1;
while(n>0)
{
temp=People1(a);
if (temp == 1)
return;
if(n==0) //人是最后一步
break;
temp=Computer(a);
if (temp == 1)
return;
}
printf("和棋\n"); //棋盘走完
getchar();
return;
}
else if (num == 2) //电脑先走
{
s1=-1;s2=1;
while (n>0)
{
temp=People1(a);
if (temp == 1)
return;
Show(a);
if(n==0) //电脑是最后一步
break;
temp=People2(a);
if (temp == 1)
return;
Show(a);
}
printf("和棋\n");
getchar();
return;
}
else
printf("输入有误\n");
}
}