2016-11-11 7 views
0

Я начал изучать C неделю назад и решил написать свою собственную игру тиктакто для практики.Множественный логический оператор || (ИЛИ) условия для цикла в C

У меня есть цикл игры в основной

for(int i = 1; player1.isWinner!=1 || player2.isWinner!=1 || noWinner!=1; i++){...} 

Где I - подсчитывает повороты и состояние конца игры один из игроков выиграл, или никто не выиграл (ничья).

На данный момент она завершает работу выполняет только если все условия 1.

Как заставить его работать правильно?

+0

Используйте '&&' вместо '||'? Кроме того, вы можете использовать '_Bool' и избавиться от'! = 1', что облегчает выполнение условия. –

+1

Я думаю, что суть проблемы здесь - непонимание булевой алгебры, а именно [законы Де Моргана] (https://en.wikipedia.org/wiki/De_Morgan%27s_laws). Который легко понять, если вы пропустите все секретные рукопожатия математика bs. «Яблоки не синие, а они не фиолетовые» - это то же самое, что «Яблоки не синие или пурпурные». – Lundin

ответ

2

Является ли значение 1, где кто-то выиграл?

Если да, то вам нужно будет проверить любое из этих условий истинно и цикл, если они не являются:

!(player1.isWinner==1 || player2.isWinner==1 || noWinner==1) 

Или с помощью AND, проверьте и петли, когда никто не установлены:

(player1.isWinner!=1 && player2.isWinner!=1 && noWinner!=1) 
+0

@ ГригорийШепелев Обратите внимание, что с использованием логической логики вы также можете писать (при условии, что вы используете только 0 или 1 - false или true) 'if (condition1 || condition2)' вместо 'if (condition1 == 1 || condition2 == 1)'. Обычно я считаю его более читаемым. Кроме того, я согласен. – MayeulC

0

Рассмотрим извлекая условие хорошо именованной функции для того, чтобы помочь читаемость и maintanability:

int hasWinner(/*...*/) 
{ 
    return player1.isWinner == 1 || player2.isWinner == 1 || noWinner == 1; 
} 

тогда становится очевидным, что условие должно быть:

for(int i = 1; !hasWinner(/*...*/); i++){ /*...*/ } 
0

Вы, кажется, используя некоторую логическую логику назад. Если 1 представляет собой логическое значение true, то условие должно быть

!(player1.isWinner || player2.isWinner || noWinner) 

Это предполагает, что вы установили player1.isWinner в 1, когда player1 выиграл.

Возможно, было бы легче использовать bool со значениями true или false от stdbool.h.