2

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

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;
}
4

3 回答 3

18

playerHealth || orcHealth >= 0并不意味着“当 playerhealth 大于零或 orchealth 大于零时”。它的意思是“当玩家健康时,转换为布尔值是真或 orchealth 大于零”。

于 2013-08-15T06:50:11.667 回答
9

这个

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

应该是

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

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

此外,更改randomNumber = ("%10d", 1 + (rand() % 100));randomNumber = 1 + rand() % 100; 逗号运算符只会混淆代码。

于 2013-08-15T06:51:41.767 回答
3

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

while ( playerHealth > 0 && orcHealth > 0 )

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

于 2013-08-15T07:05:46.560 回答