关于#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;

 }

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

#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;

}


回答不易,有用请采纳!
你可以在代码中添加一个函数来输出3x3列表,例如:


void printBoard(int board[size][size]) {
    for (int i = 0; i < size; i++) {
        for (int j = 0; j < size; j++) {
            printf("%d ", board[i][j]);
        }
        printf("\n");
    }
}

然后在循环的末尾调用这个函数来输出棋盘的当前状态,例如:

for ( i=0; i<size; i++ ) {
    for ( j=0; j<size; j++ ) {
        scanf("%d", &board[i][j]);
    }
    printBoard(board);
}


关于第1个问题,int x0=0, x1=0, x2=0, x3=0, o0=0, o1=0, o2=0, o3=0; 是用来记录棋盘中X和O的个数的变量,它们可能在代码中用于判断游戏是否结束。

关于第2个问题,result变量可能用于记录游戏结果,例如-1表示平局,0表示O赢了,1表示X赢了。

关于第4个问题,这句话是在检查对角线方向上的棋子数,board[i][i]表示第i行第i列上的棋子,如果是1,就累加x2,如果是0,就累加o2。
全部代码:

#include <stdio.h>

const int size = 3;

void printBoard(int board[size][size]) {
    for (int i = 0; i < size; i++) {
        for (int j = 0; j < size; j++) {
            printf("%d ", board[i][j]);
        }
        printf("\n");
    }
}

int main() {
    int x0=0, x1=0, x2=0, o0=0, o1=0, o2=0;
    int board[size][size];
    int i,j;
    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]);
        }
        printBoard(board);
    }

    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 ++;
        }

    }
    // 判断谁赢了
    // ...
    return 0;
}


代码中新增了一个printBoard函数,它可以在循环中输出3x3列表,帮助理解数组

怎么输入就怎么输出
四个数那是记录双方的标记情况,每一方连成线之后的情况都有四种:横,竖,斜向右上,斜向右下
斜方向那个找规律
没太细看,但是感觉你逻辑可能有点问题:我方没有把棋子下在(0,0)怎么就直接给对方加分了

修改如下,供参考:

#include <stdio.h>
const int size = 3;   //修改
void display(int board[][size],int row,int col);  //函数声明
int main()//井字棋2维数组例题。
{
//1.不理解下一行为这么写,都是什么意思??为什么不是9个变量  ?
    //下面定义了8个变量,并将它们初始化为0值。
    //因为3*3的矩阵,按行列及对角线划分为:每行两种状态分别x0 o0记录,
    //每列两种状态分别x1 o1记录,左右对角线2条,每条两种状态分别x2 02 x3 o3记录,共8个变量。
    int x0=0, x1=0, x2=0, x3=0, o0=0, o1=0, o2=0, o3=0;
    int board[size][size];
    int i,j;
//2.编译器显示没有用到下一行result变量,这个感觉不用也行,但是我想知道怎么利用起来?
    //result变量在这里是没显现出作用,但将这段代码改为一个判断输赢的函数时,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]);
       */
    display(board,size,size); //函数调用

    for ( i=0; i<size ; i++ ) {
        for (j=0 ,x0 = 0,o0 = 0,x1 = 0,o1 = 0; j<size; j++ ) {//横线方向 修改
            if ( board[i][j] == 1 ) {
                x0 ++;
            } else {
                o0 ++;
            }
            if ( board[j][i] == 1 ) {//竖线方向
                x1 ++;
            } else {
                o1 ++;
            }
        }
        if (x0 == size || x1 == size || o0 == size || o1 == size) break;//修改
        
        if ( board[i][i] == 1 ) {//斜方向1 左对角线
            x2 ++;
        } else {
            o2 ++;
        }
// 4.下面这句话的意思大概能理解,但是我自己想不到 可以这么表达。
//请传授思考过程,万分感只因。
        //右对角线上元素下标:i + j == size - 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("平局");
    }

  return 0;
}
void display(int board[][size],int row,int col)
{
     int i,j;
     for (i = 0;i < row;i++)
     {
         for (j = 0;j < col;j++)
             printf("%d ",board[i][j]);
         printf("\n");
     }
}

你的x0之类的没有刷新,他有可能大于3

问题已被解决,重新编辑留待观看 2023年1月26日。
【井字棋2维数组问题 。困扰两小时了,

我的题问在注释里,】

下面是评论区的修订版

#include <stdio.h>
const int size = 3;   //修改
void display(int board[][size],int row,int col);  //函数声明
int main()//井字棋2维数组例题。
{
//1.不理解下一行为这么写,都是什么意思??为什么不是9个变量  ?
/*
     * 井字棋的获胜方式就是-(横线)方向是相同的,或|(竖线)方向是相同的,或\(右斜线)方向是相同的,或/(左斜线)方向是相同的
     * x0表示横线方向-X方的
     * x1表示竖线方向-X方的
     * x2表示\(右斜线)-X方的
     * x3表示/(左斜线)-X方的
     * 
     * o0表示横线方向-O方的
     * o1表示竖线方向-O方的
     * o2表示\(右斜线)-O方的
     * o3表示/(左斜线)-O方的
     * */
    //下面定义了8个变量,并将它们初始化为0值。
    //因为3*3的矩阵,按行列及对角线划分为:每行两种状态分别x0 o0记录,
    //每列两种状态分别x1 o1记录,左右对角线2条,每条两种状态分别x2 02 x3 o3记录,共8个变量。
    int x0=0, x1=0, x2=0, x3=0, o0=0, o1=0, o2=0, o3=0;
    int board[size][size];
    int i,j;
//2.编译器显示没有用到下一行result变量,这个感觉不用也行,但是我想知道怎么利用起来?
    //result变量在这里是没显现出作用,但将这段代码改为一个判断输赢的函数时,result
    //变量可以作为函数的返回值,作为输赢双方的判断。根据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]);/*
     * 井字棋,会遍历出9个位置,根据下面的代码,用户输入1或者其它数字
     * 我们可以用10
     * 1表示的是X方下的,0表示的是O方下的
     * */

            display(board,size,size); //函数调用
            
        }
    }
 
/* 3. 我想用调用函数的方法,如何在每次循环后用3x3列表的形式输出数组,
       辅助理解数组。
       */
    
    for ( i=0; i<size ; i++ ) {
        for (j=0 ,x0 = 0,o0 = 0,x1 = 0,o1 = 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 (x0 == size || x1 == size || o0 == size || o1 == size) break;//修改        
            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
        //右对角线上元素下标:i + j == size - 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方胜");//zhe这个方式,没有用到result变量。
      //   这样写可以用得到:1.注释掉这三行打印,
     //2.shi使用下面注释的代码a
    } else if ( o0==size || o1==size || o2==size || o3==size ) {//O赢的判定
        result = 0;
        printf("O方胜");
    } else {
        printf("平局");
    }
//   if (result == 1) {
//         printf("X方胜");
//     } else if (result == 0) {
//         printf("O方胜");
//     } else {
//         printf("平局");
//     }
  return 0;
}
void display(int board[][size],int row,int col)
{
     int i,j;
     for (i = 0;i < row;i++)
     {
         for (j = 0;j < col;j++)
             printf("[%-7d]",board[i][j]);
         printf("\n");
     }
}
不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^