鹿见青山 2023-12-04 22:43 采纳率: 97.9%
浏览 4
已结题

井字棋pta题为什么不对


nclude <stdio.h>
int main()
{char arr[3][3];
    int flag=0;   
 for(int i=0;i<3;i++)    
{         for(int j=0;j<3;j++)     
    {scanf("%c",&arr[i][j]);       

        getchar();         
}    }if(arr[0][0]==arr[1][1]&&arr[2][2]==arr[1][1]){  
  flag=1;  
  if(arr[0][0]=='X')    
    printf("X win!");     
         if(arr[0][0]=='O')    
    printf("O win!");       
  }if(arr[0][2]==arr[1][1]&&arr[2][0]==arr[1][1]){    flag=1;   
 if(arr[0][2]=='X')      
  printf("X win!");        
      if(arr[0][2]=='O')       
 printf("O win!");}
 for(int i=0;i<3;i++)  
  {     flag=1;     
    if(arr[i][0]==arr[i][1]&&arr[i][0]==arr[i][2])              if(arr[i][2]=='X')    
    printf("X win!");         
     if(arr[i][2]=='O')     
   printf("O win!");   
 } for(int j=0;j<3;j++)    
{     flag=1;    
     if(arr[0][j]==arr[1][j]&&arr[1][j]==arr[2][j])              if(arr[2][j]=='X')    
    printf("X win!");        
      if(arr[2][j]=='O')      
  printf("O win!");  
  }if(flag==0)   
 printf("No one win!");   
 return 0;}

井字棋这样写为什么不对 ,哪里不对,我觉得和答案没差啥呀急

  • 写回答

2条回答 默认 最新

  • ChatGPTᴼᴾᴱᴺᴬᴵ 2023-12-04 23:04
    关注

    所有内容均由人工智能模型输出,其内容的准确性和完整性无法保证,不代表我的态度或观点。

    该回答引用ChatGPT-3.5,仅为您提供参考,不保证完全正确
    你的代码存在一些问题。让我来帮你找出并解释一下。


    首先,你在每次输入字符后都调用了getchar(),这会导致每次输入一个字符后都会读取一个回车符(换行符)。这样,每一行只能输入一个字符,后面的两个字符都会被回车符吸收。你可以考虑移除这个getchar()


    其次,你在检查胜利条件时,使用了flag标志,但是在检查行和列的胜利条件时,flag在循环内部被设置为1,这样会导致在循环结束后,flag的值总是1,覆盖了之前判断斜线胜利的条件。你应该将这些行和列的判断放在循环外部。


    最后,你的代码在判断斜线胜利时,没有考虑到所有斜线上的元素是否相等。你只考虑了两个对角线的一组元素,而忽略了另一组。


    以下是修复过的代码:

    #include <stdio.h>
    
    int main() {
        char arr[3][3];
        int flag = 0;
    
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 3; j++) {
                scanf("%c", &arr[i][j]);
            }
            getchar(); // 移除这行,以便能够正确读取输入
        }
    
        for (int i = 0; i < 3; i++) {
            if (arr[i][0] == arr[i][1] && arr[i][0] == arr[i][2]) {
                flag = 1;
                if (arr[i][0] == 'X')
                    printf("X win!");
                else if (arr[i][0] == 'O')
                    printf("O win!");
            }
        }
    
        for (int j = 0; j < 3; j++) {
            if (arr[0][j] == arr[1][j] && arr[0][j] == arr[2][j]) {
                flag = 1;
                if (arr[0][j] == 'X')
                    printf("X win!");
                else if (arr[0][j] == 'O')
                    printf("O win!");
            }
        }
    
        // 检查对角线胜利条件
        if (arr[0][0] == arr[1][1] && arr[0][0] == arr[2][2]) {
            flag = 1;
            if (arr[0][0] == 'X')
                printf("X win!");
            else if (arr[0][0] == 'O')
                printf("O win!");
        }
    
        if (arr[0][2] == arr[1][1] && arr[0][2] == arr[2][0]) {
            flag = 1;
            if (arr[0][2] == 'X')
                printf("X win!");
            else if (arr[0][2] == 'O')
                printf("O win!");
        }
    
        if (flag == 0)
            printf("No one win!");
    
        return 0;
    }
    

    这样应该就能够正确地检测井字棋的胜利条件了。希望这能帮助到你!


    该回答引用NewBing,仅为您提供参考,不保证完全正确
    你好,这是Bing。我看了你的代码,发现了一些错误。我会尽力帮你解决问题。😊


    首先,你的代码中有一些语法错误,比如第一行应该是 #include <stdio.h>,而不是 nclude <stdio.h>。还有,你的代码缩进不够规范,建议你使用空格或制表符来对齐代码,这样可以提高代码的可读性。


    其次,你的代码逻辑有一些问题,比如你在判断是否有人获胜时,每次都把 flag 设为 1,这样就会导致后面的判断无效。你应该在每个 if 语句的条件中加上 flag == 0,这样才能保证只有在没有人获胜时才继续判断。还有,你的代码没有考虑平局的情况,比如当棋盘上所有的格子都被占满,但没有人连成一条线时,你的代码会输出 No one win!,这是不正确的,应该输出 Draw!。


    最后,你的代码风格有一些不规范的地方,比如你的变量命名不够清晰,比如 arr、flag、i、j 等,建议你使用有意义的单词或缩写来命名变量,比如 board、win、row、col 等。还有,你的代码中有一些多余的空格和换行,比如第 7 行和第 8 行之间,建议你删除不必要的空格和换行,这样可以节省空间和提高效率。


    我帮你修改了一下代码,你可以参考一下:

    #include <stdio.h>
    int main()
    {
        char board[3][3]; // 用 board 代替 arr
        int win = 0; // 用 win 代替 flag
        for(int row = 0; row < 3; row++) // 用 row 代替 i
        {
            for(int col = 0; col < 3; col++) // 用 col 代替 j
            {
                scanf("%c", &board[row][col]); // 删除多余的空格
                getchar();
            }
        }
        if(board[0][0] == board[1][1] && board[2][2] == board[1][1] && win == 0) // 加上 win == 0
        {
            win = 1; // 把 win 设为 1
            if(board[0][0] == 'X')
                printf("X win!");
            if(board[0][0] == 'O')
                printf("O win!");
        }
        if(board[0][2] == board[1][1] && board[2][0] == board[1][1] && win == 0) // 加上 win == 0
        {
            win = 1; // 把 win 设为 1
            if(board[0][2] == 'X')
                printf("X win!");
            if(board[0][2] == 'O')
                printf("O win!");
        }
        for(int row = 0; row < 3; row++) // 用 row 代替 i
        {
            if(board[row][0] == board[row][1] && board[row][0] == board[row][2] && win == 0) // 加上 win == 0
            {
                win = 1; // 把 win 设为 1
                if(board[row][2] == 'X')
                    printf("X win!");
                if(board[row][2] == 'O')
                    printf("O win!");
            }
        }
        for(int col = 0; col < 3; col++) // 用 col 代替 j
        {
            if(board[0][col] == board[1][col] && board[1][col] == board[2][col] && win == 0) // 加上 win == 0
            {
                win = 1; // 把 win 设为 1
                if(board[2][col] == 'X')
                    printf("X win!");
                if(board[2][col] == 'O')
                    printf("O win!");
            }
        }
        if(win == 0) // 如果没有人获胜
        {
            int draw = 1; // 增加一个变量 draw,表示是否平局
            for(int row = 0; row < 3; row++) // 遍历棋盘
            {
                for(int col = 0; col < 3; col++)
                {
                    if(board[row][col] == 'O') // 如果有空格,说明不是平局
                    {
                        draw = 0;
                        break;
                    }
                }
                if(draw == 0) // 如果不是平局,跳出循环
                    break;
            }
            if(draw == 1) // 如果是平局,输出 Draw!
                printf("Draw!");
            else // 如果不是平局,输出 No one win!
                printf("No one win!");
        }
        return 0;
    }
    

    源: 与必应的对话, 2023/12/4
    (1) 井字棋 - 知乎. https://www.zhihu.com/topic/20394253.
    (2) 7-5 井字棋 (15分)-CSDN博客. https://blog.csdn.net/AQACXHSH/article/details/111938355.
    (3) 井字棋_百度百科. https://baike.baidu.com/item/%E4%BA%95%E5%AD%97%E6%A3%8B/4467444.
    (4) PTA井字棋 AC不了请大佬康康哪错了?_编程语言-CSDN问答. https://ask.csdn.net/questions/1055581.


    该回答引用文心大模型3.5,仅为您提供参考,不保证完全正确
    这段代码有几个问题。

    1. 输入的棋盘没有清空:在读入九个字符之后,并没有清空输入缓冲区,这样下一次输入时,可能从缓冲区中的某个字符开始读取,导致结果错误。可以在读入九个字符后添加一个空格,然后调用getchar()清空缓冲区。
    2. 检查胜负的条件不完整:井字棋的胜负判断需要检查所有可能的赢法,而你的代码只检查了其中两种情况。具体来说,需要检查以下四种情况:
    • 同一行或同一列的三个格子都相同(这是你的代码已经检查的)
    • 两条对角线上的三个格子都相同(这是你的代码没有检查的)
    1. 输入的字符可能是错的:如果输入的不是'X'或'O',程序可能会出错。应该添加一些错误检查来确保输入的是正确的字符。

    该回答引用讯飞星火认知大模型,仅为您提供参考,不保证完全正确
    这个代码存在一些问题,导致无法正确判断井字棋的结果。以下是问题所在:

    1. 在读取输入时,使用了scanf("%c", &arr[i][j])来读取字符,但没有考虑到空格或其他非字符的情况。这可能导致错误的输入被读取进来。

    2. 在判断获胜条件时,只考虑了三个方向的获胜情况(行、列和对角线),但没有处理平局的情况。如果游戏结束时没有玩家获胜,应该输出"平局"而不是"没有人赢"。

    下面是修正后的代码:

    #include <stdio.h>
    
    int main() {
        char arr[3][3];
        int flag = 0;
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 3; j++) {
                scanf(" %c", &arr[i][j]); // 使用空格跳过非字符输入
            }
        }
    
        // 检查行和列的获胜条件
        if ((arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2]) || (arr[0][2] == arr[1][1] && arr[1][1] == arr[2][0])) {
            flag = 1;
            if (arr[1][1] == 'X') {
                printf("X win!");
            } else if (arr[1][1] == 'O') {
                printf("O win!");
            }
        }
    
        // 检查对角线的获胜条件
        if ((arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2]) || (arr[0][2] == arr[1][1] && arr[1][1] == arr[2][0])) {
            flag = 1;
            if (arr[1][1] == 'X') {
                printf("X win!");
            } else if (arr[1][1] == 'O') {
                printf("O win!");
            }
        }
    
        // 检查是否平局
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 3; j++) {
                if (arr[i][j] != '-') { // 如果还有未填满的位置,则不是平局
                    break;
                }
            }
            if (j == 3) { // 如果所有位置都填满了,则为平局
                printf("Draw!");
                return 0;
            }
        }
    
        if (flag == 0) { // 如果没有玩家获胜且不是平局,则输出"No one win!""Draw!",根据题目要求选择输出哪个结果
            printf("No one win!"); // 根据题目要求修改输出结果为"No one win!""Draw!"
        } else {
            printf("
    "); // 换行输出获胜者信息
        }
        return 0;
    }
    

    修正后的代码会先读取输入并跳过非字符输入,然后检查行、列和对角线的获胜条件。最后,它会检查是否平局,并根据获胜条件输出相应的结果。


    该回答引用通义千问大模型,仅为您提供参考,不保证完全正确
    你的代码中存在几个问题,导致无法正确判断井字棋的胜负。以下是一些建议:

    1. 在输入时使用getchar()会导致输入混乱。你可以将它从代码中删除。

    2. 你需要检查每一行、每一列和两个对角线上的元素是否相同,而不是在每个循环里都设置flag=1。这样会导致输出多次结果。

    3. 检查完所有情况后,再根据flag的值决定是否输出"No one win!"。

    4. 将所有胜利条件合并到一个if语句中,并用逻辑运算符||连接它们,以减少嵌套。

    修改后的代码如下:

    #include <stdio.h>
    
    int main() {
        char arr[3][3];
        int flag = 0;
    
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 3; j++) {
                scanf("%c", &arr[i][j]);
            }
        }
    
        if ((arr[0][0] == arr[1][1] && arr[2][2] == arr[1][1]) ||
            (arr[0][2] == arr[1][1] && arr[2][0] == arr[1][1])) {
            flag = 1;
            if (arr[1][1] == 'X') {
                printf("X win!");
            } else if (arr[1][1] == 'O') {
                printf("O win!");
            }
        }
    
        for (int i = 0; i < 3; i++) {
            if (arr[i][0] == arr[i][1] && arr[i][0] == arr[i][2]) {
                flag = 1;
                if (arr[i][0] == 'X') {
                    printf("X win!");
                } else if (arr[i][0] == 'O') {
                    printf("O win!");
                }
            }
        }
    
        for (int j = 0; j < 3; j++) {
            if (arr[0][j] == arr[1][j] && arr[1][j] == arr[2][j]) {
                flag = 1;
                if (arr[0][j] == 'X') {
                    printf("X win!");
                } else if (arr[0][j] == 'O') {
                    printf("O win!");
                }
            }
        }
    
        if (flag == 0) {
            printf("No one win!");
        }
    
        return 0;
    }
    

    这个版本应该可以正常工作了。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 12月18日
  • 已采纳回答 12月10日
  • 修改了问题 12月4日
  • 创建了问题 12月4日

悬赏问题

  • ¥30 基于信创PC发布的QT应用如何跨用户启动后输入中文
  • ¥20 非root手机,如何精准控制手机流量消耗的大小,如20M
  • ¥15 远程安装一下vasp
  • ¥15 自己做的代码上传图片时,报错
  • ¥15 Lingo线性规划模型怎么搭建
  • ¥15 关于#python#的问题,请各位专家解答!区间型正向化
  • ¥15 unity从3D升级到urp管线,打包ab包后,材质全部变紫色
  • ¥50 comsol温度场仿真无法模拟微米级激光光斑
  • ¥15 上传图片时提交的存储类型
  • ¥15 VB.NET如何绘制倾斜的椭圆