函数参数中的Math.random,其中函数保存在变量中 - 答案始终相同

时间:2017-08-27 23:45:01

标签: javascript

首先,请原谅我这个相当混乱的标题,我一直在努力弄清楚如何正确地说出我的问题。

我一直在研究基于文本的浏览器游戏,并创建了一些“类”(玩家,技能,物品,法术,敌人)。我创造了一个治疗功能,可以重复用于治疗技能,法术或物品。

然后我将函数存储在对象中的变量中,如下所示(添加注释以帮助您遵循):

// Skill: name, description, effect
// heal(amt, cost) <-- amount of HP to heal, cost in MP or Stamina
var healingWind = new Skill('Healing Wind', 'A gust of wind that refreshes the 
user.', heal(15, 10));

我的治疗功能效果很好,愈合风。效果()完全适用。我现在要做的是根据球员统计数据(在我们的球员类中定义)获得治疗15 HP +随机数量的能力。

我试过这样做:

// player is an instance of our Player class
var healingWind = new Skill('Healing Wind', 'A gust of wind that refreshes 
the user.', heal(15 + Math.floor(Math.random() * (player.agility * 2)), 10));

尽管每次使用技能时,一切都按照我的预期运作,但数量仍然完全相同。然后我尝试创建一个返回Math.random()的函数,并在上面的代码中使用它代替Math.random(),结果是相同的。

然后我尝试让我的随机函数返回一个返回Math.random()的函数,结果是NaN。

我不确定我在这里缺少什么,并且一直试图解决这个问题很长一段时间以及无数谷歌搜索无济于事。我不确定自己是否已经解释得很好,但我希望你能理解我的目标。如果有人需要任何进一步的信息,请告诉我,我将尝试尽可能描述。

编辑:

heal()函数 - 当使用healingWind.effect()时,玩家HP会增加,玩家Stamina会因成本而降低。

function heal(amt, cost){
  return function(){
    if(this.constructor.name == 'Item'){
      game.innerHTML += '<br>Using ' + this.name + '!';
      player.currentHp += amt;
    } else if(this.constructor.name == 'Spell'){
      if(player.currentMp >= cost){
        game.innerHTML += '<br>Casting ' + this.name + '!';
        player.currentHp += amt;
        player.currentMp -= cost;
      } else {
        game.innerHTML += '<br>You don\'t have enough Mana to cast this!';
      }
    } else if(this.constructor.name == 'Skill'){
      if(player.currentStamina >= cost){
        game.innerHTML += '<br>Using skill - ' + this.name + '!<br>Healed ' + amt + ' HP!';
    player.currentHp += amt;
    player.currentStamina -= cost;
  } else {
    game.innerHTML += '<br>You don\'t have enough Stamina to use this ability!';
      }
    }
  }
}

请注意 - if(currentHP&gt; = maxHp)的逻辑尚未实现到此函数中,但我将对此进行讨论。

- 求助 - :这是我的heal()函数的新代码,如果有人感兴趣或者在尝试类似的东西时发现它很有用。

function heal(base_amt, cost, attribute, multiply){
  return function(){
    var amt = base_amt;
    if(attribute === 'AGI'){
      amt = Math.floor(amt +(Math.random() * (player.agility * multiply)));
    } else if(attribute === 'STR'){
      amt = Math.floor(amt + (Math.random() * (player.strength * multiply)));
    } else if(attribute === 'END'){
      amt = Math.floor(amt + (Math.random() * (player.endurance * multiply)));
    } else if(attribute === 'INT'){
      amt = Math.floor(amt + (Math.random() * (player.intellect * multiply)));
    } else if(attribute === 'WIL'){
      amt = Math.floor(amt + (Math.random() * (player.willpower * multiply)));
    }

    if(this.constructor.name == 'Item'){
      game.innerHTML += '<br>Using ' + this.name + '!';
      player.currentHp += amt;
      if(player.currentHp >= player.maxHp){
        player.currentHp = player.maxHp;
      }
    } else if(this.constructor.name == 'Spell'){
      if(player.currentMp >= cost){
        game.innerHTML += '<br>Casting ' + this.name + '!';
        player.currentHp += amt;
        player.currentMp -= cost;
        if(player.currentHp >= player.maxHp){
          player.currentHp = player.maxHp;
        }
      } else {
        game.innerHTML += '<br>You don\'t have enough Mana to cast this!';
      }
    } else if(this.constructor.name == 'Skill'){
      if(player.currentStamina >= cost){
        game.innerHTML += '<br>Using ' + this.name + '!<br>Healed ' + amt + ' HP!';
        player.currentHp += amt;
        player.currentStamina -= cost;
        if(player.currentHp >= player.maxHp){
          player.currentHp = player.maxHp;
        }
      } else {
        game.innerHTML += '<br>You don\'t have enough Stamina to use this ability!';
      }
    }
  }
}

变量:

// All of these work :D note the extra params of the Skill.
var cure = new Spell('Cure', 'Heals a small amount of HP.', heal(40, 15), 'Restoration');
var healingWind = new Skill('Healing Wind', 'A gust of wind that refreshes the user.', heal(15, 11, 'AGI', 2));
var weakPotion = new Item('Weak Healing Potion', 'A weak healing potion.', 5, heal(20));

1 个答案:

答案 0 :(得分:2)

正如 Jaromanda X 已经说过,治疗功能会创建一个amt永不改变的闭包。所以你必须随机化该闭包中的amt

function heal(base_amt, cost){
  return function(){
    var amt = base_amt + Math.floor(Math.random() * (player.agility * 2))

    [...]

  }
}