3

私は戦いのために次のコードを持っていますが、ユーザーは約99.9%の確率で勝ちます(5000回のランダムループでテスト済み)

戦闘に影響を与える次の変数があります

強度 | 防御 | 器用さ | ダメージ | ポータルの難易度 (常に + 1 で停止 * 0 ずつ) | 致命的

これは私がこれまでに持っているものです

//player variable 
//(int) player.itemDamage = 20
//(int) player.itemStr = 2
//(int) player.itemDex = 4

            int defense = (int)Math.Round((((portal + 1) * ((rand.NextDouble() + 0.5))) + 5) / 2, 0);
            int damage = (int)Math.Round((((portal + 1) * ((rand.NextDouble() + 0.5))) + player.itemDamage), 0);
            int str = (int)Math.Round((((portal + 1) * ((rand.NextDouble() + 0.5))) + player.itemStr), 0);
            int dex = (int)Math.Round((((portal + 1) * ((rand.NextDouble() + 0.5))) + player.itemDex), 0);
while(true)
{
for (int i = 0; i < 10; i++)
                {
                    critical += rand.NextDouble();
                }
                eHP -= (int)Math.Round((((player.itemDamage + player.itemStr) - defense) * critical) / 2, 0);
                critical = 1;

                for (int i = 0; i < 10; i++)
                {
                    critical += rand.NextDouble();
                }
                HP -= (int)Math.Round((((damage + str) - 5) * critical) / 2, 0);

                if (eHP <= 0)
                {
                    return;
                }
else if (HP <= 0)
                {
                    return;
                }
                }

ユーザー (HP) が 70% の確率で勝てるようにするには、次のコードで何を変更すればよいでしょうか? 私はアルゴリズムがひどい 編集: ユーザーに 70% の確率で勝つことを望んでいますが、単純な if(0 > 70) win else Loose ステートメントを使用しないで、ダメージに基づいて丸めたいと思っています。非常に興味深い戦い。

4

3 に答える 3

2
if (rand.next(10) > 7) {
    //user wins
} else {
    //user loses
}
于 2012-11-25T13:10:32.310 に答える
1

真剣に、コードでどのようにアプローチしているかに基づいて、これに問題がある理由は理解できます。代わりに、数学関数のように扱う必要があります。

一連の入力から出力への純粋な関数 を作成します。この関数では を使用しないでください。ランダムな入力が必要な場合は、関数に渡します。最初に、既存の変数を上書きせずに実行してみてください ( /は使用しないでください)。すべての に対して、常に同じ出力が得られるはずです。これを行うと、数学を使用して欠損値を解くのは非常に簡単になるはずです。f(x, y, ..., z)booleanrand+=-=(x, y, z)f(x, y, z)

于 2012-11-25T13:42:40.377 に答える
1

drstevens が言うように、実装はより小さな純粋な関数に分割する方がよいでしょう。

特に、失われたヒット ポイントの数は の値に比例するようですcritical。あなたが与えるコードは、ループの開始時の値を示していませんcriticalが、最初の反復の後、「敵」のヒットポイントを減らすと、前の反復で「ユーザー」のヒットポイントを減らすときよりも値が約5高くなります。 10 個の乱数を追加する前に 1 に設定しないでください。だいたい使い手は11前後、敵は6前後とcritical強い敵が勝つ(例えば、自分defenceの体力やアイテムダメージよりも大きい敵に当たるとヒットポイントが増える!)。

または減算するヒット ポイントの数を計算する純粋な関数を作成したcritical場合、このエラーは発生しませんでした。

于 2012-11-25T16:42:37.850 に答える