//5.完善五子棋程序
#include
#define NR 8
void showBg(char bg[NR][NR]);
//能下返回真 不能下则返回假
int checkDown(char bg[NR][NR],int x,int y);
//如果发生胜负关系 则返回真 否则返回假
int checkWin(char bg[NR][NR],int x,int y,int flag);
int main(void)
{
char bg[NR][NR]={0};
int x,y,flag=1;//1:表示A方'#' -1表示B方'M'
showBg(bg);
while(1)
{
//提示某方下子
printf("[%s方下子]:",flag==1?"A":"B");
scanf("%d%d",&y,&x);
//检查yx处是否可下子
if(!checkDown(bg,x,y))
{
printf("\033[31m此处不可下子,请重下!\033[0m\n");
continue;
}
//能下则下
bg[y][x]=flag;
showBg(bg);
//检查胜负关系
if(checkWin(bg,x,y,flag))
{
printf("\033[32m恭喜 %s 方胜利!!!!!!!\033[0m\n",flag==1?"A":"B");
break;
}
//未发生胜负 则换对方下
flag=-flag;
}
return 0;
}
void showBg(char bg[NR][NR])
{
int x,y;
system("clear");
//打印列号
printf(" ");
for(x=0;x=NR||y<0||y>=NR)
return 0;//no
//是否已经有棋子
if(bg[y][x]!=0)
return 0;//no
return 1;//yes
}
//水平方向(从左到右)
int __check_a(char bg[NR][NR],int x,int y,int flag)
{
int i,count=0;
for(i=x-4;i<=x+4;i++)
{
if(i<0||i>=NR)
continue;
//判断是否为flag颜色的棋子
if(bg[y][i]==flag)
{
count++;
if(count>=5) return 1;
}
else
{
count=0;
}
}
return 0;
}
//垂直方向(从下到上)
int __check_b(char bg[NR][NR],int x,int y,int flag)
{
int i,count=0;
for(i=y-4;i<=y+4;i++)
{
if(i<0||i>=NR)
continue;
//判断是否为flag颜色的棋子
if(bg[i][x]==flag)
{
count++;
if(count>=5) return 1;
}
else
{
count=0;
}
}
return 0;
}
//斜线方向<从左上到右下的方向检查>
int __check_c(char bg[NR][NR],int x,int y,int flag)
{
int i,j,count=0;
for(i=y-4,j=x-4;i<=y+4 && j<=x+4;i++,j++)
{
if(i<0||i>=NR ||j<0||j>=NR)
continue;
//判断是否为flag颜色的棋子
if(bg[i][j]==flag)
{
count++;
if(count>=5) return 1;
}
else
{
count=0;
}
}
return 0;
}
//反斜线方向<从右上到左下的方向检查>
int __check_d(char bg[NR][NR],int x,int y,int flag)
{
int i,j,count=0;
for(i=y-4,j=x+4;i<=y+4 && j>=x-4;i++,j--)
{
if(i<0||i>=NR ||j<0||j>=NR)
continue;
//判断是否为flag颜色的棋子
if(bg[i][j]==flag)
{
count++;
if(count>=5) return 1;
}
else
{
count=0;
}
}
return 0;
}
int checkWin(char bg[NR][NR],int x,int y,int flag)
{
#if 0
int a=0,b=0,c=0,d=0;
a=__check_a(bg,x,y,flag);
if(a) return 1;
b=__check_b(bg,x,y,flag);
if(b) return 1;
c=__check_c(bg,x,y,flag);
if(c) return 1;
d=__check_d(bg,x,y,flag);
return d;
#else
//表达式短路
return __check_a(bg,x,y,flag) ||\
__check_b(bg,x,y,flag) ||\
__check_c(bg,x,y,flag) ||\
__check_d(bg,x,y,flag);
#endif //
}