提问人:Mayank 提问时间:11/1/2023 最后编辑:Vlad from MoscowMayank 更新时间:11/1/2023 访问量:50
使用 IF-ELSE 语句比较二维数组元素时出错
error in comparing elements of a 2d array using if-else statements
问:
我尝试使用2D字符数组制作游戏。但是 if else 语句不起作用,并且循环没有中断。此外,当我为行的最后一个元素分配一个字符时,下一行的第一个元素会自动更改。
我的代码是:
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
void scoreprinter( int m , int n , char matrix[m][n]);
void newscore( int m , int n , char matrix[m][n]) ;
void maingame(int m , int n , char matrix[m][n]);
int main() {
system("cls");
char columns[2][2] ;
newscore(2,2,columns);
maingame(2,2,columns);
getch();
return 0;
}
void scoreprinter( int m , int n , char matrix[m][n]) {
printf("\n\n\t\tTICTACTOE GAME\n");
for(int i=0 ; i<=2 ; i++ ) {
for(int j=0 ; j<=2 ; j++) {
printf("\t%c\t",matrix[i][j]);
}
printf("\n");
}
}
void newscore( int m , int n , char matrix[m][n]) {
for(int i=0 ; i<=2 ; i++) {
for(int j=0 ; j<=2 ; j++){
matrix[i][j] = '_' ;
}
}
}
void maingame(int m , int n , char matrix[m][n]) {
int k=0;
int a,b;
for(k ; k<=9 ; k++) {
system("cls");
scoreprinter(2,2,matrix);
if (k%2 == 0)
{
if ( (matrix[0][0] == matrix[0][1] == matrix[0][2]) || (matrix[1][0] == matrix[1][1] == matrix[1][2]) || (matrix[2][0] == matrix[2][1] == matrix[2][2]) || (matrix[0][0] == matrix[1][0] == matrix[2][0]) || (matrix[0][1] == matrix[1][1] == matrix[2][1]) || (matrix[0][2] == matrix[1][2] == matrix[2][2]) || (matrix[0][0] == matrix[1][1] == matrix[2][2]) || (matrix[0][3] == matrix[1][1] == matrix[3][0]) )
{
printf("condition matched");
break;
}
printf("\nPlayer 1\nEnter row for marking\n");
scanf("%d",&a);
printf("\nEnter column for marking\n");
scanf("%d",&b);
matrix[(a-1)][(b-1)] = 'X';
scoreprinter(2,2,matrix);
}
else if (k%2 == 1)
{
if ( (matrix[0][0] == matrix[0][1] == matrix[0][2]) || (matrix[1][0] == matrix[1][1] == matrix[1][2]) || (matrix[2][0] == matrix[2][1] == matrix[2][2]) || (matrix[0][0] == matrix[1][0] == matrix[2][0]) || (matrix[0][1] == matrix[1][1] == matrix[2][1]) || (matrix[0][2] == matrix[1][2] == matrix[2][2]) || (matrix[0][0] == matrix[1][1] == matrix[2][2]) || (matrix[0][3] == matrix[1][1] == matrix[3][0]) )
{
printf("condition matched");
break;
}
printf("\nPlayer 2\nEnter row for marking\n");
scanf("%d",&a);
printf("\nEnter column for marking\n");
scanf("%d",&b);
matrix[(a-1)][(b-1)] = '0';
scoreprinter(2,2,matrix);
}
}
}
我尝试创建另一个循环,但它不起作用。
答:
当我为行的最后一个元素分配一个字符时,下一行的第一个元素会自动更改。
对于 noughts 和 crosses 游戏,您的数组通常是 3x3。你的声明是 2x2,所以修改真的是修改.columns[0][2]
columns[1][0]
char columns[3][3]; /* not [2][2] */
由于大多数 for 循环似乎是硬编码的 or ,因此一旦数组大小得到纠正,它们应该可以正常工作。i<=2
j<=2
该行 ,以及多次遍历数组边界,还对布尔值和 ie 进行了大量比较,将运算结果与字符值进行比较。(matrix[0][0] == matrix[0][1] == matrix[0][2]) || (matrix[1][0] == matrix[1][1] == matrix[1][2]) || (matrix[2][0] == matrix[2][1] == matrix[2][2]) || (matrix[0][0] == matrix[1][0] == matrix[2][0]) || (matrix[0][1] == matrix[1][1] == matrix[2][1]) || (matrix[0][2] == matrix[1][2] == matrix[2][2]) || (matrix[0][0] == matrix[1][1] == matrix[2][2]) || (matrix[0][3] == matrix[1][1] == matrix[3][0])
char
==
如果将其分解为几个函数,则错误会更少:
column_matches(int col, char **matrix)
{
return (matrix[0][col] == matrix[1][col]) && (matrix[0][col] == matrix[2][col]);
}
row_matches(int row, char **matrix)
{
return (matrix[row][0] == matrix[row][1]) && (matrix[row][0] == matrix[row][2]);
}
如果数组是 3x3,则不应访问元素。[3]
您声明了一个只有两个“行”的字符数组,每个“行”包含两个元素
char columns[2][2] ;
因此,“rows”和“rows”中的元素的有效范围是 。[0, 2)
但是在您的函数中,您正在使用 for 循环中的范围,例如[0, 3)
for(int i=0 ; i<=2 ; i++ ) {
for(int j=0 ; j<=2 ; j++) {
因此,这些循环会产生对阵列外部内存的访问。
看来你的意思是数组的以下声明
char columns[3][3] ;
此外,您的函数使用参数等声明m
n
void scoreprinter( int m , int n , char matrix[m][n]);
void newscore( int m , int n , char matrix[m][n]) ;
void maingame(int m , int n , char matrix[m][n]);
但这些参数不会在函数中使用。取而代之的是,使用了幻数。编译器应发出有关未使用的局部变量的消息。您是否阅读编译器消息?您应该在循环中使用这些函数参数,而不是幻数。2
此 if 语句
if ( (matrix[0][0] == matrix[0][1] == matrix[0][2]) || (matrix[1][0] == matrix[1][1] == matrix[1][2]) || (matrix[2][0] == matrix[2][1] == matrix[2][2]) || (matrix[0][0] == matrix[1][0] == matrix[2][0]) || (matrix[0][1] == matrix[1][1] == matrix[2][1]) || (matrix[0][2] == matrix[1][2] == matrix[2][2]) || (matrix[0][0] == matrix[1][1] == matrix[2][2]) || (matrix[0][3] == matrix[1][1] == matrix[3][0]) )
太长,因此不可读。此外,它与比较运算符的表达式是错误的。
例如,代替此表达式
(matrix[0][0] == matrix[0][1] == matrix[0][2])
你必须写
(matrix[0][0] == matrix[0][1] && matrix[0][1] == matrix[0][2])
您可以使用循环来检查数组的元素,而不是这个不可读且错误的 if 语句。
请注意,您应该检查用户输入,即输入的行和列值是否在有效范围内。
评论
matrix[0][0] == matrix[0][1] == matrix[0][2]
不会按照你的想法去做。您还可以到处进行越界访问,因为对于包含 2 个项目的数组,唯一有效的索引是 0 和 1,而不是 2。i<=2
i<m
for(int i=0 ; i<=2 ; i++)
for(int i=0 ; i<m ; i++)