linux下 C编写的 五子棋

五子棋

//5.完善五子棋程序
#include <stdio.h>

#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;x++)
    {
       printf("\033[34m%d \033[0m",x);
    }
    putchar('\n');

    for(y=0;y<NR;y++)
    {
       printf("\033[34m%d \033[0m",y);//打印行号
       for(x=0;x<NR;x++)
       {
          switch(bg[y][x]){
              case 0 :printf("+ ");break;//空白区
              case 1 :printf("\033[36m# \033[0m");break;//A方
              case -1:printf("\033[31mM \033[0m");break;//B方
          }
       }
       putchar('\n');
    }
}
int checkDown(char bg[NR][NR],int x,int y)
{
    //是否在范围内
    if(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 //
}
////////////////////////////////////////////////////

猜你喜欢

转载自blog.csdn.net/weixin_42180737/article/details/83178225