使用 IF-ELSE 语句比较二维数组元素时出错

error in comparing elements of a 2d array using if-else statements

提问人:Mayank 提问时间:11/1/2023 最后编辑:Vlad from MoscowMayank 更新时间:11/1/2023 访问量:50

问:

我尝试使用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);

        
        }
    

    } 

}

我尝试创建另一个循环,但它不起作用。

c 多维数组 嵌套循环函数 定义

评论

2赞 Retired Ninja 11/1/2023
matrix[0][0] == matrix[0][1] == matrix[0][2]不会按照你的想法去做。您还可以到处进行越界访问,因为对于包含 2 个项目的数组,唯一有效的索引是 0 和 1,而不是 2。
0赞 Lundin 11/1/2023
只是替换臭鼬的魔术数字? -> .也就是说,不要写一个非常奇怪的、硬编码的循环,而你可以写一个完全合理和可变的循环。i<=2i<mfor(int i=0 ; i<=2 ; i++)for(int i=0 ; i<m ; i++)

答:

0赞 SmellyCat 11/1/2023 #1

当我为行的最后一个元素分配一个字符时,下一行的第一个元素会自动更改。

对于 noughts 和 crosses 游戏,您的数组通常是 3x3。你的声明是 2x2,所以修改真的是修改.columns[0][2]columns[1][0]

char columns[3][3]; /* not [2][2] */

由于大多数 for 循环似乎是硬编码的 or ,因此一旦数组大小得到纠正,它们应该可以正常工作。i<=2j<=2

0赞 SmellyCat 11/1/2023 #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]

1赞 Vlad from Moscow 11/1/2023 #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] ;

此外,您的函数使用参数等声明mn

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 语句。

请注意,您应该检查用户输入,即输入的行和列值是否在有效范围内。

评论

0赞 Vlad from Moscow 11/2/2023
@Mayank完全没有。不客气:)