我有下面的代码,但用户将赢得大约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语句,因为这不是一场非常有趣的战斗。

最佳答案

严肃地说,基于你如何用代码来处理这个问题,你为什么会遇到麻烦是可以理解的。你应该把它当作一个数学函数来处理。
从一组输入f创建一个pure function(x, y, ..., z)到一个boolean输出。此函数中不应使用rand。如果需要随机输入,则将其传递到函数中。尝试先做而不重写现有变量(不要使用+= /-=)。对于每个(x, y, z)f(x, y, z)应该总是产生相同的输出。如果您这样做,应该很容易使用数学来解决丢失的值。

10-04 17:54