Подключить четыре победителя проверки

#c #connect-four

#c #connect-four

Вопрос:

Итак, чтобы изменить мой вопрос. Он отказывается распознавать, что есть четыре двойки подряд. Он распознает, что есть четыре единицы подряд, но это происходит после четырех двоек. Почему это происходит?

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) amp;amp; (board[i][j 1] != 0) amp;amp; (board[i][j 2]!= 0) amp;amp; (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 Overn");
                exit(0);
                }
            }
        }
    }
}
  

Что я делаю не так?

Комментарии:

1. Не «меняйте» свой вопрос. Это не тот разговор, за которым мы должны следить. Сделайте это новым вопросом со всей справочной информацией.

2. if (a == b == c == d){ Работает не так, как вы могли подумать. if (a == b amp;amp; a == c amp;amp; a == d){

3. if (a == b == c == d) … ой! C — это не математика. Выражение a==b равно 0 или 1, затем сравнивается с этим значением (0 или 1) c , которое снова равно 0 или 1, с которым, наконец, сравнивается d .

Ответ №1:

if (a == b == c == d){ работает не так, как вы могли подумать. Результатом сравнения в C является логическое значение 0 или 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 amp;amp; a == c amp;amp; a == d)
  

Все три сравнения должны быть оценены, чтобы true весь оператор был true .

Обратите внимание, что есть и другие комбинации, которые работают. Пример:

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

Кстати, вы можете сократить всю функцию до

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

Ответ №2:

Проблема в том, что вы неправильно поняли механизм C. код if (a == b == c == d) не будет выполняться, если тогда все значения abcd равны return 1 . поскольку C вычисляет слева направо (тот же приоритет), поэтому сначала он будет вычисляться a == b , результат равен 1 или 0, затем возьмите этот результат для сравнения c , второй результат также равен 1 или 0, наконец, возьмите второй результат для сравнения, d и будет получен конечный результат.
Правильный код выглядит так:

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