【问题标题】:Why does this do/while never end?为什么这做/虽然永远不会结束?
【发布时间】:2013-08-15 06:47:36
【问题描述】:

它只是不断循环。数字继续减少,直到程序关闭。我是不是在滥用什么东西?

playerHealth 和 orcHealth 整数为 100。

randomNumber = ("%10d", 1 + (rand() % 100));

这就是我看到 srand() 解释页面上使用的随机数的方式。如果这是错的,应该怎么办?

这里还有其他问题吗?

    switch(charDecision)
{
case 1:
    cout << "FIGHT" << endl;
    do{
        randomNumber = ("%10d", 1 + (rand() % 100));
        if(randomNumber >= 50){
            orcHealth = orcHealth - (randomNumber - (randomNumber / 5));
        cout << "You hit the orc! He now has " << orcHealth << " life left!" << endl;
        }
        else
        {
            playerHealth = playerHealth - (randomNumber - (randomNumber / 5));
            cout << "The orc hit you! You now have " << playerHealth << " life left!" << endl;
        }
    }while(playerHealth || orcHealth >= 0);
    break;

default:
    break;
}

【问题讨论】:

  • 嗯,rand 调用确实 有模数偏差。我建议使用&lt;random&gt;

标签: c++ infinite-loop do-while


【解决方案1】:

playerHealth || orcHealth &gt;= 0不是的意思是“当玩家健康大于零或兽人健康大于零时”。它的意思是“当玩家健康时,转换为布尔值是真或 orchealth 大于零”。

【讨论】:

  • 即玩家健康需要正好为 0 才能评估为 false,good catch
【解决方案2】:

这个

}while(playerHealth || orcHealth >= 0);

应该是

}while(playerHealth > 0 && orcHealth > 0);

我认为你想退出循环,如果其中一个为 0 或更少。

另外,将randomNumber = ("%10d", 1 + (rand() % 100)); 更改为randomNumber = 1 + rand() % 100; 逗号操作符只是混淆了代码。

【讨论】:

  • }while(playerHealth &gt; 0 || orcHealth &gt; 0); 是他想要的,我猜。
  • @fiscblog 你认为战斗应该持续到两人都死了吗?
  • 这可行。当双方都是僵尸时,战斗停止,因为僵尸组队。 :)
  • @hvd 不死兽人僵尸 哇!现在这是一个想法
【解决方案3】:

do...while 语句的条件将在某个点停止,但仅在某个点。这意味着,如果playerHealth 为零或orcHealth 小于零,则满足您的条件。如果playerHealth 低于零怎么办?这很可能是因为你总是从两个角色的健康中扣除一个数字。 playerHealth 完全为零的可能性非常小。而当playerHealth 低于零时,它变为零的可能性仍然很小,即使由于整数溢出也是如此。所以,如果你想在角色的一个生命值变成零或更少时“杀死”角色,你最好用类似的东西改变那条线

while ( playerHealth > 0 && orcHealth > 0 )

附带说明,|| 语句在任何其中一个语句为真时有效。在 C++ 中,对于整数,0 值为假,所有其他值(包括负值)都被视为真。此外,|| 从左到右检查,当它找到第一个true 语句时,它会停止搜索。在您的情况下,它检查playerHealth,这很可能是非零的。当它看到这个表达式为真时,它决定括号内的整个语句是true,并跳过检查orcHealth &gt;= 0。这导致无限循环。您可能想查看C++maybe something like this post 中条件的评估顺序。

【讨论】:

    猜你喜欢
    • 2011-08-04
    • 2013-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-11
    • 2015-08-28
    • 1970-01-01
    相关资源
    最近更新 更多