0

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

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

我究竟做错了什么?

4

2 回答 2

1

if (a == b == c == d){不像你想象的那样工作。在 C 中比较的结果是一个布尔值0or 1。鉴于该==运算符具有从左到右的关联性,您的语句可以重写为:

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

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

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

所有三个比较都需要评估 totrue才能使整个语句成为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;
}
于 2020-10-30T17:38:46.010 回答
0

问题是您误解了 C 的机制。if (a == b == c == d)如果 abcd 的所有值都等于 then ,则代码不会采用return 1。因为C从左到右计算(相同的优先级),所以它会 a == b先计算,结果是1或0,然后拿这个结果比较c,第二个结果也是1或0,最后取第二个结果比较d和最后的结果出来了。
正确的代码是这样的:

if ((a == b) && (d == c) && (b == c))
    return 1;
else
    return 0;
于 2020-10-30T17:32:50.890 回答