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