三子棋小游戏

一、井字双人对战游戏(3子棋游戏)
分析
1.棋盘模拟。
       因为棋盘上的交叉点正好是3行3列,因此用一个3行3列的二维数组即可。数据初始值为0,表示未有妻子落下;值为1表示落下的是1好选手棋子,之位2表示的是2号选手的棋子。
2.是否连成一条线检测。
      对刚落下的妻子检查所在的行是否都是同一选手的棋子;同样再检测所有的列是否都是同一选手的棋;同样的方法再检测对角线和反对角线。
 3.对棋子位置的描述。
       用一个结构体,把棋子所在的行号和列号组合在一起。程序中对连成一线的检测是从棋盘的角度出发,检测有没有相同的行、列、对角线,也可以从选手已下的棋子,即play1、play2数组出发,检测是否有3个的同值得行号分量或列号分量。
   代码如下:
   

# include <stdio.h>
# include <stdlib.h>
struct position
{
    int x = 0;
    int y = 0;
};
int qipan[3][3]={0}; //棋盘数据结构
void printqipan(int qp[3][3]) //打印棋盘
{
    int i = 0;
    for(i = 0;i<3;i++)
    {
        if(qp[i][0] = 0)
            printf("+--");
        else if(qp[i][0] = 1)
            printf("o--");
        else printf("*--");
        if(qp[i][1] = 0)
            printf("+--");
        else if (qp[i][1] = 1)
            printf("o--");
        else printf("*--");
        if (qp[i][2] = 0)
            printf("+");
        else if(qp[i][2] = 1)
            printf("o");
        else printf("*");
        printf("\n");
    }
}
int check (struct position *play,int i) //检查有无3个棋子连成一线
{
    int k = 0;
    int x = play[i].x;
    int y = play[i].y;
    int qizi = qipan[x][y];
    for (k = 0;k<=2;k++) //*检查所在的行是否是同一棋子
        if(qipan[x][k]!=qizi)
            break;
        if(k>2)
            return 1;
    for(k = 0; k <= 2;k++) //检查所有的列是否都是同一棋子
        if(qipan[k][y]!=qizi)
            break;
        if(k>2)
            return 1;
    for(k = 0;k <= 2;k++) //检查所有的对角线是否都是同一棋子
        if(qipan[k][k]!=qizi)
            break;
        if(k>2)
            return 1;
    for(k = 0;k <= 2;k++) //检查所有反对角线是否都是同一棋子
        if(qipan[x][2-k]!=qizi)
            break;
        if(k>2)
            return 1;
        return 0;
}
main()
{
    int i,num=0,t_x,t_y; //t_x和t_y的取值范围是0、1、2
    struct position play1[5],play2[5]; //每个选手最多下5次
    printqipan(qipan);
        i = 1;
    while (num < 9)
    {
        do
        {
            printf("选手一下子,输入下一子的位置:");
            scanf("%d,%d",&t_x,&t_y);
        }while(qipan[t_x][t_y]!=0);
         play1[i].x=t_x;
         play1[i].y=t_y;
         qipan[t_x][t_y]=1;
         num+=1;
         printqipan(qipan);
        if(check(play1,i))
        {
            printf("1号选手胜利了");
                return 0;
        }
        if(num == 9)
            break;
        do
        { 
            printf("选手2下一子,输入下子的位置:");
            scanf("%d,%d",&t_x,&t_y);
        }while(qipan[t_x][t_y]!=0);
          play2[i].x=t_x;
          play2[i].y=t_y;
          qipan[t_x][t_y]=2;
          num+=1;
          printqipan;
        if( check(play2,i))
        {
            printf("2号选手胜利了");
                return 0;
        }
        i++;
    } 
    printf("两人都失败了");
    return 0;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值