是井字棋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或者其它数字
* 我们可以用1和0
* 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或者其它数字
* 我们可以用1和0
* 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");
}
}
不知道你这个问题是否已经解决, 如果还没有解决的话: