2012-10-14 32 views
1

我想为这段代码添加一个随机修饰符,这个修饰符可以从基础值的+ -20%范围内增加或减去损伤。伤害会在结果的80%到结果的120%之间随机化。对于数字示例:如何基于数值的百分比合并Math.random?

attacker.Strength(20) - defender.Defense(10)=导致

20 - 10 =范围(8〜12)

var Fight = function (attacker, defender) { 
    var result; 
    result = (attacker.Strength - defender.Defense); 
    defender.HP = defender.HP - result; 

    if(defender.HP >= 1) { 
     return defender.Name + " has taken " + result + " damage!"; 
    } else { 
     return defender.Name + " has been slain"; 
    } 
}; 
+0

你应该小写你的函数和属性名称,因为它们不是构造函数 – Bergi

回答

3

Math.random返回0到1之间的数字。地图给你的范围从0.81.2本:

var factor = Math.random() * 0.4 + 0.8; 
//    |   |  | 
//    [0, 1[  |  | 
//     \ / | 
//     [0, 0.4[ /
//       \ /
//      [0.8, 1,2[ 
var result = Math.round((attacker.Strength - defender.Defense) * factor); 

不知道你是否想不想找个圆,使您的球员的健康点总是自然数。如果没有,你应该改变你的死亡条件为defender.HP > 0

+0

Math.random可以返回0和1之间的任何值,例如0.45。 –

+0

这是完美的,谢谢。我大大地思考方程式。 – Gaiadok

1

Math.random() * 0.4

result = (attacker.Strength - defender.Defense) * (0.8 + Math.random() * 0.4); 
0

对于eaxact +/- 20%,则使用random以产生两个数字仅即0, 1

如果0,把它当作+并且如果1,把它当作-例如如下:

var randomNum = Math.round(Math.random()); //it will return 0 or 1 
    if(randomNum ==0){ 
     //write +20% code here 
     result = (attacker.Strength - defender.Defense)*1.2; 
    }else{ 
     //write -20% code here 
     result = (attacker.Strength - defender.Defense)*0.8; 
    } 

编辑:对于基于范围,它更简单。

var factor = 0.8 + Math.random()*0.4; 
    result = (attacker.Strength - defender.Defense)*factor ; 
+0

如何使用'random'来只产生两个数字中的一个? – Bergi

+0

@Bergi请检查我提到的逻辑。首先它会生成0到1之间的十进制值。然后'round'将其舍入为0或1. –

+0

啊,我写这个时没有代码。不过,OP希望得到一个“*结果的80%至120%*范围内”的因数,而不是其中一个或另一个 – Bergi