李奉典 2023-01-25 23:45 采纳率: 96.3%
浏览 49
已结题

关于#c语言#的问题:是井字棋2维数组问题

是井字棋2维数组问题,
困扰我两小时了,万分感只因解惑。

我想用调用函数的方法,在每次循环后用3x3列表的形式输出数组,
辅助理解数组。请教教如何写书这样的代码,同类帖子似乎用的是指针,我还没学到。
该怎么修改呢。
priintf("%d,%d,%d\n",board[size],board[size],board[size]);
priintf("%d,%d,%d\n",board[size],board[size],board[size]);
priintf("%d,%d,%d\n",board[size],board[size],board[size]);

//其他问题写注释里啦

#include <stdio.h>

int main()//井字棋2维数组例题。
{
//1.不理解下一行为这么写,都是什么意思??为什么不是9个变量  ?

    int x0=0, x1=0, x2=0, x3=0, o0=0, o1=0, o2=0, o3=0;
    const int size = 3;
    int board[size][size];
    int i,j;
//2.编译器显示没有用到下一行result变量,这个感觉不用也行,但是我想知道怎么利用起来?

    int result = -1;//-1是平局,0是O赢了,1是X赢了
    for ( i=0; i<size; i++ ) {//输入棋子结果
        for ( j=0; j<size; j++ ) {
            scanf("%d", &board[i][j]);
        }
    }
    
/* 3. 我想用调用函数的方法,在每次循环后用3x3列表的形式输出数组,
       辅助理解数组。请教教如何写书这样的代码,同类帖子似乎用的是指针,我还没学到。
       该怎么修改呢。
       priintf("%d,%d,%d\n",board[size],board[size],board[size]);
         priintf("%d,%d,%d\n",board[size],board[size],board[size]);
           priintf("%d,%d,%d\n",board[size],board[size],board[size]);
       */
    for ( i=0; i<size ; i++ ) {
        for ( j=0; j<size; j++ ) {//横线方向
            if ( board[i][j] == 1 ) {
                x0 ++;
            } else {
                o0 ++;
            }
            if ( board[j][i] == 1 ) {//竖线方向
                x1 ++;
            } else {
                o1 ++;
            }
        }
        
            if ( board[i][i] == 1 ) {//斜方向1
                x2 ++;
            } else {
                o2 ++;
        }
// 4.下面这句话的意思大概能理解,但是我自己想不到 可以这么表达。
//请传授思考过程,万分感只因。
            if ( board[i][size-1-i] == 1) {//斜方向2 

                x3 ++;//看不懂
            } else {
                o3 ++;//
            }
        }
        if ( x0==size || x1==size || x2==size || x3==size ) {//X赢的判定
            result = 1;
            printf("X方胜");
        } else if ( o0==size || o1==size || o2==size || o3==size ) {//O赢的判定
            result = 0;
            printf("O方胜");
        } else {
            printf("平局");
        }
  return 0;

 }

  • 写回答

7条回答 默认 最新

  • 有一只小精灵 2023-01-26 00:57
    关注

    根据问题写了备注,看看可不可以明白

    #include <stdio.h>
    
    int main()//井字棋2维数组例题。
    {
    //1.不理解下一行为这么写,都是什么意思??为什么不是9个变量  ?
        /*
         * 井字棋的获胜方式就是-(横线)方向是相同的,或|(竖线)方向是相同的,或\(右斜线)方向是相同的,或/(左斜线)方向是相同的
         * x0表示横线方向-X方的
         * x1表示竖线方向-X方的
         * x2表示\(右斜线)-X方的
         * x3表示/(左斜线)-X方的
         * o0表示横线方向-O方的
         * o1表示竖线方向-O方的
         * o2表示\(右斜线)-O方的
         * o3表示/(左斜线)-O方的
         * */
        int x0 = 0, x1 = 0, x2 = 0, x3 = 0, o0 = 0, o1 = 0, o2 = 0, o3 = 0;
        const int size = 3;
        int board[size][size];
        int i, j;
    //2.编译器显示没有用到下一行result变量,这个感觉不用也行,但是我想知道怎么利用起来?
        // 要用起来的话,看最下面代码,其实就是根据result的值来输出结果
        int result = -1;//-1是平局,0是O赢了,1是X赢了
        /*
         * 井字棋,会遍历出9个位置,根据下面的代码,用户输入1或者其它数字
         * 我们可以用10
         * 1表示的是X方下的,0表示的是O方下的
         * */
        for (i = 0; i < size; i++) {//输入棋子结果
            for (j = 0; j < size; j++) {
                // 可以看得清楚一点
                printf("i = %d, j = %d:", i, j);
                scanf("%d", &board[i][j]);
            }
        }
    
    /* 3. 我想用调用函数的方法,在每次循环后用3x3列表的形式输出数组,
           辅助理解数组。请教教如何写书这样的代码,同类帖子似乎用的是指针,我还没学到。
           该怎么修改呢。
           printf("%d,%d,%d\n",board[size],board[size],board[size]);
             printf("%d,%d,%d\n",board[size],board[size],board[size]);
               printf("%d,%d,%d\n",board[size],board[size],board[size]);
           */
        for (i = 0; i < size; i++) {
            for (j = 0; j < size; j++) {
                /*
                 * x0表示横线方向-X方的
                 * x1表示竖线方向-X方的
                 * x2表示\(右斜线)-X方的
                 * x3表示/(左斜线)-X方的
                 * o0表示横线方向-O方的
                 * o1表示竖线方向-O方的
                 * o2表示\(右斜线)-O方的
                 * o3表示/(左斜线)-O方的
                 * */
                if (board[i][j] == 1) {//横线方向
                    x0++;
                } else {
                    o0++;
                }
                if (board[j][i] == 1) {//竖线方向
                    x1++;
                } else {
                    o1++;
                }
            }
    
            //  \(右斜线),如(0,0) (1,1) (2,2)
            if (board[i][i] == 1) {//斜方向1
                x2++;
            } else {
                o2++;
            }
            // 4.下面这句话的意思大概能理解,但是我自己想不到 可以这么表达。
            //请传授思考过程,万分感只因。
            // /(左斜线),如(0,2) (1,1) (2,0),把这个带进下面的式子应该就懂了吧
            // i = 0 的时候,j 就是size - 1 - 0
            // i = 1 的时候,j 就是size - 1 - 1
            if (board[i][size - 1 - i] == 1) {//斜方向2
                x3++;//看不懂
            } else {
                o3++;//
            }
        }
        if (x0 == size || x1 == size || x2 == size || x3 == size) {//X赢的判定
            result = 1;
    //        printf("X方胜");
        } else if (o0 == size || o1 == size || o2 == size || o3 == size) {//O赢的判定
            result = 0;
    //        printf("O方胜");
        } else {
    //        printf("平局");
        }
    
        // 这样就是用到了 result
        if (result == 1) {
            printf("X方胜");
        } else if (result == 0) {
            printf("O方胜");
        } else {
            printf("平局");
        }
    
        return 0;
    
    }
    
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(6条)

报告相同问题?

问题事件

  • 系统已结题 2月3日
  • 已采纳回答 1月26日
  • 修改了问题 1月25日
  • 创建了问题 1月25日

悬赏问题

  • ¥170 如图所示配置eNSP
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改
  • ¥20 wireshark抓不到vlan
  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥15 键盘指令混乱情况下的启动盘系统重装