连接四项检查获胜者

问题描述

所以要更改我的问题。它拒绝承认连续有四个二。它认识到连续有四个,但发生在四个二之后。为什么会这样?

0 0 0 0 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0
0 1 1 1 1 0 0
1 2 2 2 2 0 0

int checkFour(int a,int b,int c,int d){
    if (a == b == c == d){
        return 1;
    }
    
    else{
        return 0;
    }
    return 0;
}

//check for the horizontal win
int checkHorizontal(){
    for(int i=0; i < rows; i++){
        for(int j=0; j < column - 3; j++){
            if ((board[i][j] != 0) && (board[i][j+1] != 0) && (board[i][j+2]!= 0) && (board[i][j+3] != 0)){
                if (checkFour(board[i][j],board[i][j+1],board[i][j+2],board[i][j+3]) == 1){
                printf("Game Over\n");
                exit(0);
                }
            }
        }
    }
}

我在做什么错了?

解决方法

if (a == b == c == d){无法按照您的想法工作。 C中的比较结果是布尔值01。假设==运算符具有从左到右的关联性,则您的语句可以重写为:

if ((((a == b) == c) == d)

当它们全部为1时,这似乎可以给出正确的结果。这是因为最终将值(1)与比较操作的结果(也就是(1))进行比较。

(((a == b) == c) == d)   a == b -> 1
((1 == c) == d)          1 == c -> 1
(1 == d)                 1 == d -> 1

正确的方法是使用逻辑AND。

if (a == b && a == c && a == d)

所有三个比较都需要计算为true,整个语句才能为true

请注意,还有其他有效的组合。例如:

if (a == b && b == c && c == d)

顺便说一句,您可以将整个功能缩短为

int checkFour(int a,int b,int c,int d){
    return a == b && b == c && c == d;
}
,

问题是您误解了C的机制。如果abcd的所有值都等于if (a == b == c == d),那么代码return 1就不会被接受。因为C是从左到右计算(相同的优先级),所以它将首先计算a == b,结果为1或0,然后将该结果与c进行比较,第二个结果也是1或0,最后取第二个结果与d进行比较,最后得出结果。
正确的代码是这样的:

if ((a == b) && (d == c) && (b == c))
    return 1;
else
    return 0;