1

このコードに、基本値の +-20% の範囲に基づいてダメージを増減するランダムな修飾子を追加したいと考えています。ダメージは結果の 80% から結果の 120% の範囲でランダム化されます。数値例:

attack.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";
    }
};
4

3 に答える 3

3

Math.random0 から 1 の間の数値を返します。0.8これを からまでの範囲にマップします1.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

于 2012-10-14T16:44:47.240 に答える
1

のようにMath.random() * 0.4

result = (attacker.Strength - defender.Defense) * (0.8 + Math.random() * 0.4);
于 2012-10-14T16:43:19.050 に答える
0

eaxact +/- 20% の場合、random2 つの数値のみを生成するために使用します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 ;
于 2012-10-14T16:44:28.820 に答える