2016-01-20 2 views
0

Я пишу простую текстовую игру на C, где игрок сражается с очень простым AI. Внутри функции main() есть цикл, который должен продолжаться до тех пор, пока HP или HP не может превышать 0. См. Пример ниже.C: While Loop With Logical OR

while(grunt->hp > 0 || player->hp > 0) { 
    stats(player); 
    printf("Grunt HP: %d\n", grunt->hp); 
    plyMove(player, grunt); 
    aiMove(player, grunt); 
} 

if(player->hp > 0) { 
    printf("You won the battle!\n"); } 
else { 
    printf("You've lost the battle!\n"); } 

return 0; 

Теперь, насколько я понимаю, цикл while должен делать это до тех пор, пока оба выражения истинны. Если только один из них становится ложным, цикл должен заканчиваться. Однако, если вражеский HP ниже нуля, он не выйдет из строя. Но если HP игрока ниже нуля, он ломается.

Каждая итерация цикла печатает эти значения, поэтому я могу отслеживать их.

Я просто не понимаю логику этого? Если вам нужно увидеть какой-либо дополнительный код, пожалуйста, дайте мне знать.

+1

«есть петля, которая должна продолжаться до тех пор, пока HP *** или *** вражеского HP выше 0». Итак, вы хотите продолжить цикл до тех пор, пока обе стороны не умрут? Это звучит не так. Вы уверены, что понимаете, что означает «или»? – user2357112

+2

Вы противоречите себе. В первом абзаце вы подтверждаете, что цикл продолжается до тех пор, пока выполняется одно из условий.Во втором абзаце вы говорите, что ожидаете, что цикл остановится, как только одно из условий будет ложным. – Stijn

+0

Я думаю, что ваш код верен, он соответствует вашему описанию в первом абзаце. Это второй абзац, который противоречит вашему первому. – nobism

ответ

4

Вы используете логическое ИЛИ, которое истинно, если хотя бы один параметр является истинным. Другими словами, таблица истинности такова:

In | In | Out 
T | T | T 
T | F | T 
F | T | T 
F | F | F 

Это звучит, как вы хотите, логическое И, что верно, если оба параметра являются истинными. Таким образом, бой продолжается до тех пор, пока у игрока и врага более 0 здоровья. Оператор для логического И в C (и многих других языках) - &&.

В случае, если вы заинтересованы, вот таблица истинности для И:

In | In | Out 
T | T | T 
T | F | F 
F | T | F 
F | F | F 
1

Хотя оба л.с. и л.с. игрока (правда) выше 0 рубаки вы хотите, чтобы петля продолжать так что вы хочу:

while(grunt->hp > 0 && player->hp > 0) 

Если какая-либо л.с. рубаки или л.с. игрока опускается ниже 0 условие выше будет ложным, и вы будете выйти из цикла.

0

Иногда абстракция может упростить задачу.

Рассмотрим, если у вас:

#define Alive(who) ((who)->hp > 0) 

, то вы могли бы написать:

while (Alive(grunt) && Alive(player)) { 
    … 
} 
0

Если в вашей голове, вы думаете: «Я хочу, чтобы закончить игру, когда HP игрока или HP противника ниже или равна нулю ", право в то время как условие было бы:

while(!(grunt->hp <= 0 || player->hp <= 0)) 

С логическим обратным оператором или !

Отзыв: !(A || B) == !A && !B так что другие ребята отвечают строго эквивалентно.