📄 wuziqi.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 + -