2

ループし続けるだけです。プログラムが終了するまで、数は減少し続けます。私は何かを悪用していますか?

playerHealth および orcHealth int は 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 がブール値にキャストされている間、true または 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つまり、が 0 またはorcHealth0 より小さい場合に条件が満たされます。playerHealthがゼロ以下になったら?両方のキャラクターのヘルスから常に数値を差し引いているため、これは非常に可能性が高いです。完全にゼロになる可能性はplayerHealth非常に小さいものです。また、playerHealthがゼロを下回った場合でも、整数のオーバーフローが原因で、ゼロになる可能性は依然として非常に低いです。したがって、体力がゼロ以下になったときにキャラクターを「殺す」場合は、その行を次のように変更することをお勧めします

while ( playerHealth > 0 && orcHealth > 0 )

補足として、||ステートメントのいずれかが true の場合、ステートメントは機能します。C++ では、整数の0値は false であり、負の値を含む他のすべての値は true として扱われます。また、||左から右にチェックし、最初のtrueステートメントが見つかると検索を停止します。あなたの場合、 をチェックしますがplayerHealth、これはゼロではない可能性が非常に高いです。この式が真であることを確認すると、括弧内のステートメント全体が であると判断し、trueチェックをスキップしorcHealth >= 0ます。これにより、無限ループが発生します。C++での条件の評価の順序を確認することをお勧めします。この投稿のようなものかもしれません

于 2013-08-15T07:05:46.560 に答える