战斗的数学方程式

时间:2012-11-25 12:49:59

标签: c# algorithm equation

我有以下代码用于战斗,但用户将赢得大约99.9%的时间(使用5000随机循环测试)

我有以下影响战斗的变量

力量|防守|灵巧|损坏|门户难度(总是+ 1停0 *由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)赢得其他松散声明,因为这不是一个非常有趣的战斗。

3 个答案:

答案 0 :(得分:2)

if (rand.next(10) > 7) {
    //user wins
} else {
    //user loses
}

答案 1 :(得分:1)

严肃地说,根据您如何使用代码来解决问题,这是可以理解的。您应该将其视为数学函数。

从一组输入f(x, y, ..., z)输出创建pure function boolean。此函数中不应使用rand。如果需要随机输入,则传递给函数。尝试先做而不覆盖现有变量(不要使用+= / -=)。对于每个(x, y, z)f(x, y, z)应始终产生相同的输出。如果你这样做,使用数学来解决缺失的值应该很容易。

答案 2 :(得分:1)

正如drstevens所说,你的实现最好分成更小的纯函数。

特别是,丢失的生命点数似乎与critical的值成比例。你给出的代码没有显示循环开始时critical的值是什么,但是在第一次迭代之后,当减少'敌人'生命值时,该值将比减少'用户'生命值时高约5。上一次迭代,因为在向其添加十个随机数之前不将其设置为1。用户critical一般在11左右,对于6左右的敌人,需要一个强大的敌人才能获胜(例如,defence大于用户的力量和物品伤害,所以它获得如果你击中它们就会达到分数!)。

如果您编写了一个计算critical或要减去的生命点数的纯函数,则不会发生此错误。