【问题标题】:C: While Loop With Logical ORC: 带逻辑或的 While 循环
【发布时间】:2016-01-20 00:01:52
【问题描述】:

我正在用 C 语言编写一个简单的文本游戏,玩家在其中与一个非常简单的 AI 作斗争。在 main() 函数中,只要玩家的生命值敌人的生命值高于 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低于零,它就会中断。

循环的每次迭代都会打印这些值,因此我可以跟踪它们。

我只是不明白这其中的逻辑吗?如果您需要查看任何其他代码,请告诉我。

【问题讨论】:

  • "只要玩家的HP敌人的HP高于0,就会有一个循环" - 所以你想继续循环直到双方都死?这听起来不对。你确定你明白“或”是什么意思吗?
  • 你自相矛盾。在第一段中,您承认只要其中一个条件为真,循环就会继续。在第二段中,您说您希望循环在其中一个条件为假时立即停止。
  • 我认为您的代码是正确的,它与您在第一段中的描述相匹配。这是与您的第一段相矛盾的第二段。
  • 只需添加&& 而不是||

标签: c


【解决方案1】:

您正在使用逻辑 OR,如果至少有一个参数为真,则该逻辑为真。也就是说,真值表是这样的:

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

听起来您想要一个逻辑与,如果两个参数都为真,则为真。这样,只要玩家和敌人的生命值都超过 0,战斗就会继续。 C(和许多其他语言)中逻辑与的运算符是&&

如果您有兴趣,这里是 AND 的真值表:

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

【讨论】:

    【解决方案2】:

    虽然咕噜的生命值玩家的生命值(真)都高于 0,但你希望循环继续,所以你想要:

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

    如果咕噜人的血量玩家的血量低于 0,则上述条件为假,您将退出循环。

    【讨论】:

      【解决方案3】:

      如果你在想“我想在玩家或敌人的 HP 低于或等于 0 时结束游戏”,那么正确的 while 条件应该是:

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

      使用逻辑逆运算符!

      回想一下:!(A || B) == !A &amp;&amp; !B 所以其他人的回答是严格等价的。

      【讨论】:

        【解决方案4】:

        有时抽象可以使事情更容易掌握。

        考虑一下你是否有:

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

        那么你可以写:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-01-08
          • 1970-01-01
          • 2015-12-17
          • 2015-09-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多