gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 03:10:01 27 4
gpt4 key购买 nike

首先请原谅我的标题相当困惑,我一直在努力弄清楚如何正确表达我的问题。

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

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

// 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));

我的heal 函数运行良好,healingWind.effect() 完全按照其应有的方式运行。我现在想做的是获得治愈 15 HP + 基于玩家统计数据(在我们的 Player 类中定义)的随机数量的能力。

我尝试过这样做:

// 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会增加amt,而玩家的耐力会减少cost。

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 >= 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));

最佳答案

正如Jaromanda X已经说过的,heal函数创建了一个amt永远不会改变的闭包。因此,您必须随机化该闭包内的 amt

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

[...]

}
}

关于javascript - 函数参数中的 Math.random ,其中函数保存在变量中 - 答案始终相同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45910280/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com