PTA 7-13 TicTacToe游戏--胜负判定(正向简单思考)

通过这道题,可以重新思考%c与%s在输入字符时的不同点

井字棋是一种在3x3格子上进行的连珠游戏,和五子棋比较类似,由于棋盘一般不画边框,格线排成井字故得名。

游戏规则:由分别代表O和X的两个游戏者轮流在格子里留下标记。由最先在任意一条直线上成功连接三个标记的一方获胜。(摘抄自百度百科)

QQ截图20210516153608.jpg

读入一个3X3的二维数组,数组元素为'X'表示下X,元素为'O'表示下O,数组元素为'.'(英文符号“点”)表示未下棋,现编写程序进行当前胜负的判断,如果X方胜,则显示"X win!",如果O方胜,则显示"O win!",如果无人获胜,则显示"No one win!"。

输入格式:

读入一个3X3的二维数组,数组元素为'X'表示下X,元素为'O'表示下O,数组元素为'.'(英文符号“点”)表示未下棋。

输出格式:

若X方胜,则显示"X win!";若O方胜,则显示"O win!";若无人获胜,则显示"No one win!"。

输入样例1:

X.O
OX.
O.X

输出样例2:

X win!

输入样例2:

O.O
XX.
X..

输出样例2:

No one win!

注意,本题的出错点在于输入字符串到数组中时对回车符号的忽略,导致错误。

在输入字符串时,我们有两种选择

1.0(%c输入,需要注意回车符)

#include<stdio.h>
int main(){
    char a[3][3];
    int i,x=0,o=0;
    for(i=0;i<3;i++)
        scanf("%c",&a[0][i]);
    getchar();
        for(i=0;i<3;i++)
        scanf("%c",&a[1][i]);
    getchar();                                              //用两个getchar()来吸收回车符
        for(i=0;i<3;i++)
        scanf("%c",&a[2][i]);                               //输入字符串
    for(i=0;i<3;i++){
        if(a[i][0]=='X'&&a[i][1]=='X'&&a[i][2]=='X')
            x++;
        else if(a[0][i]=='X'&&a[1][i]=='X'&&a[2][i]=='X')
            x++;
        else if(a[i][0]=='O'&&a[i][1]=='O'&&a[i][2]=='O')
            o++;
        else if(a[0][i]=='O'&&a[1][i]=='O'&&a[2][i]=='O')   //行或列连成获胜情况
            o++;
        else if(a[0][0]=='X'&&a[1][1]=='X'&&a[2][2]=='X')
            x++;
        else if(a[0][0]=='O'&&a[1][1]=='O'&&a[2][2]=='O')
            o++;
        else if(a[2][0]=='X'&&a[1][1]=='X'&&a[0][2]=='X')
            x++;
        else if(a[2][0]=='O'&&a[1][1]=='O'&&a[0][2]=='O')
            o++;}                                           //对角线连成获胜情况
    if(x==3||x==1)
        printf("X win!");
    else if(o==3||o==1)
        printf("O win!");
        else
            printf("No one win!");                          //当数字等于3时为对角线
                                                            //当数字等于1时为行或列
        return 0;
}

2.0(%s 输入,遇到回车符停止,且该回车符不进入数组中)

#include<stdio.h>
int main(){
    char a[3][3];
    int i,x=0,o=0;
    for(i=0;i<3;i++)
        scanf("%s",a[i]);                                  //输入字符串
    for(i=0;i<3;i++){
        if(a[i][0]=='X'&&a[i][1]=='X'&&a[i][2]=='X')
            x++;
        else if(a[0][i]=='X'&&a[1][i]=='X'&&a[2][i]=='X')
            x++;
        else if(a[i][0]=='O'&&a[i][1]=='O'&&a[i][2]=='O')
            o++;
        else if(a[0][i]=='O'&&a[1][i]=='O'&&a[2][i]=='O')   //行或列连成获胜情况
            o++;
        else if(a[0][0]=='X'&&a[1][1]=='X'&&a[2][2]=='X')
            x++;
        else if(a[0][0]=='O'&&a[1][1]=='O'&&a[2][2]=='O')
            o++;
        else if(a[2][0]=='X'&&a[1][1]=='X'&&a[0][2]=='X')
            x++;
        else if(a[2][0]=='O'&&a[1][1]=='O'&&a[0][2]=='O')
            o++;}                                           //对角线连成获胜情况
    if(x==3||x==1)
        printf("X win!");
    else if(o==3||o==1)
        printf("O win!");
        else
            printf("No one win!");                          //当数字等于3时为对角线
                                                            //当数字等于1时为行或列
        return 0;
}

  • 53
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值