#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<conio.h>
void prinf(void);/*这里负责输出与清屏*/
int judge_chess(void);/*判断棋局输赢,同时为电脑服务*/
int Computer_strategy(void);/*作为电脑攻防优先级*/
int compurter_think(void);/*电脑思考,实质是发生随机数*/
int a[9]={49,50,51,52,53,54,55,56,57};/*棋盘*/
int b_j=0,who=0; /*who为限制使用权限*/
struct computer_construe/*作为电脑判断用*/
{
int n;
int attack;
}b[8];
int main(void)
{
int scan,i,j=5;
char compurter_one;
prinf();
puts("电脑先下,请按y或Y,否则按其它键,默认电脑为X,用户黙认为O");
compurter_one=getchar();
if(compurter_one=='y'||compurter_one=='Y')/*电脑先下,按y,否则按其它键*/
{
compurter_think();
prinf();
j=4;
}
for(i=0;i<j;i++)
{
printf("\t\t\t\t\t\t输入时按数字:");
do{
scanf("%d",&scan);
if(scan<0||scan>9)
printf("请新重生输入");
}
while(scan<1||scan>9);
if(who==0)
who=1;
switch(scan)
{
case 1:scan=i;if(a[0]>='1'&&a[0]<='9')a[0]=79;else{--i;printf("己使用\n");}break;
case 2:scan=i;if(a[1]>='1'&&a[1]<='9')a[1]=79;else{--i;printf("己使用\n");}break;
case 3:scan=i;if(a[2]>='1'&&a[2]<='9')a[2]=79;else{--i;printf("己使用\n");}break;
case 4:scan=i;if(a[3]>='1'&&a[3]<='9')a[3]=79;else{--i;printf("己使用\n");}break;
case 5:scan=i;if(a[4]>='1'&&a[4]<='9')a[4]=79;else{--i;printf("己使用\n");}break;
case 6:scan=i;if(a[5]>='1'&&a[5]<='9')a[5]=79;else{--i;printf("己使用\n");}break;
case 7:scan=i;if(a[6]>='1'&&a[6]<='9')a[6]=79;else{--i;printf("己使用\n");}break;
case 8:scan=i;if(a[7]>='1'&&a[7]<='9')a[7]=79;else{--i;printf("己使用\n");}break;
case 9:scan=i;if(a[8]>='1'&&a[8]<='9')a[8]=79;else{--i;printf("己使用\n");}break;
}
if(scan==i)
{
if(!(judge_chess()))
if(Computer_strategy())
compurter_think();
who=0;
prinf();
if(judge_chess())
{
if(judge_chess()==3)
puts("YOU WIN");
else
puts("COM WIN");
break; }
}
scan=j;
}
if(scan==j)
puts("a draw in chess");/*和局*/
getch();
return 0;
}
void prinf(void)
{
int i;
system("cls");
for(i=0;i<7;i++)
puts("");
for(i=1;i<4;i++)
{
printf("\t\t\t %c | %c | %c \n",a[3*(i-1)],a[3*(i-1)+1],a[3*(i-1)+2]);
if(i!=3)
printf("\t\t\t_________________\n");}
}
int judge_chess(void)
{
int i,j,k,m,n,X,O;
for(i=1;i<4;i++)
{
k=0;X=0;O=0;
for(j=0;j<9;j++)
{
switch(i)
{
case 1:m=a[j];break;
case 2:m=a[j%3*3+k];break;
case 3:if(j<6) m=a[2*(2-k)*(j%3+k)];break;
}
switch(m)
{
case 'O':++O;break;
case 'X':--X;break;
default:
switch(i)
{
case 1:n=j;break;
case 2:n=j%3*3+k;break;
case 3:if(j<6) n=2*(2-k)*(j%3+k);break;
}
}
if(2==j%3)
{
m=O+X;
switch(m)
{
case 2:if(who){b[b_j].n=n;b[b_j].attack=-1;++b_j;}break;
case 3:return 3;break;
case -2:if(who){b[b_j].n=n;b[b_j].attack=1;++b_j;}break;
case -3:return -3;break;
}
++k;
X=0;
O=0;
}
}
if(i==3&&j>5)
return 0;
}
}
int Computer_strategy(void)/*电脑战略*/
{
int i;
for(i=0;i<b_j;i++)
if(b[i].attack==1&&a[b[i].n]!=88&&a[b[i].n]!=79)
{a[b[i].n]=88;
return 0;}
for(i=0;i<b_j;i++)
if(b[i].attack!=1&&a[b[i].n]!=88&&a[b[i].n]!=79)
{a[b[i].n]=88;
return 0;}
return 1;
}
int compurter_think(void)
{
int i,j,k=1,m=0;
srand(time(NULL));
do{
m=rand()%10;
if(m==0&&a[4]!=88&&a[4]!=79)
{a[4]=88;return 0;} }while(m==0);
for(j=0;j<9;j++)
for(i=0;i<9;i++)/*选译功能*/
if(a[i]>='1'&&a[i]<='9')
{if(k==m)
{a[i]=88;
return 0;
}
k++;
}
}