我正在用C编写一个简单的文本游戏,其中玩家可以对抗非常简单的AI。在main()函数内部,只要玩家的HP 或 敌人的HP高于0,就会有一个循环继续。见下面的例子。
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低于零,则会中断。
循环的每次迭代都会打印这些值,因此我可以跟踪它们。
我根本不理解这个逻辑吗?如果您需要查看任何其他代码,请告诉我们。
答案 0 :(得分:4)
您正在使用逻辑OR,如果至少有一个参数为true,则为true。换句话说,真值表是这样的:
In | In | Out
T | T | T
T | F | T
F | T | T
F | F | F
听起来你想要一个逻辑AND,如果两个参数都为真,则为真。这样,只要玩家和敌人的生命值都超过0,战斗就会继续。 C(和许多其他语言)中逻辑AND的运算符是&&
。
如果你感兴趣,这是AND的真值表:
In | In | Out
T | T | T
T | F | F
F | T | F
F | F | F
答案 1 :(得分:1)
虽然grunt的hp 和玩家的hp(true)都高于0,但您希望循环继续,以便您想要:
{{1}}
如果grunt的hp 或玩家的hp低于0,则上述条件将为false,您将退出循环。
答案 2 :(得分:1)
如果在你的脑海中你在想“当玩家的HP或敌人的HP低于或等于零时我想结束游戏”,那么正确的条件将是:
while(!(grunt->hp <= 0 || player->hp <= 0))
使用逻辑逆运算符!
召回:!(A || B) == !A && !B
所以其他人的答案完全相同。
答案 3 :(得分:0)
有时,抽象可以使事情更容易掌握。
考虑一下你是否:
#define Alive(who) ((who)->hp > 0)
然后你可以写:
while (Alive(grunt) && Alive(player)) {
…
}