我有以下代码用于战斗,但用户将赢得大约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)赢得其他松散声明,因为这不是一个非常有趣的战斗。
答案 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
或要减去的生命点数的纯函数,则不会发生此错误。