首页 > 解决方案 > 连接四张支票赢家

问题描述

所以要改变我的问题。它拒绝承认连续有四个二。它识别出连续有四个 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);
                }
            }
        }
    }
}

我究竟做错了什么?

标签: cconnect-four

解决方案


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

推荐阅读