【问题标题】:Randomly select from array then assign selection to a variable从数组中随机选择,然后将选择分配给一个变量
【发布时间】:2016-03-02 18:00:00
【问题描述】:

我有一个从对象中随机选择怪物的函数。函数如下:

var travel = function(direction) {
        var newRoom = rooms[currentRoom.paths[direction]];
        if (!newRoom) {
            $("<p>You can't go that way.</p>").properDisplay();
        }
        else {
            currentRoom = newRoom;
            $("<p>You are now in the " + currentRoom.name + " Room.</p>").properDisplay();
                if (currentRoom.hasMonsters) {
                    function pickRand() {
                        var monsterArray = Object.keys(monsters);   
                        var randomKey = Math.floor(Math.random() * monsterArray.length);
                        return $("<p>Holy Crap!  There's a " + monsterArray[randomKey] + " in here!</p>").properDisplay();  
                    }
                    pickRand();

                }
        }
    };

这是对象:

var monsters = {
    zombie:  {
        hitPoints: 10,
        loot: "magic knife"
    },
    skeleton: {
        hitPoints: 15,
        loot: "magic shield"
    },
    ghoul:  {
        hitPoints: 12,
        loot: "magic helm"
    }
};  

设置为随机选择“僵尸”、“骷髅”或“食尸鬼”。一切正常。如何获取随机选择的内容并将其保存到变量中?

我尝试了一些类似的方法:

var beast = pickRand();

var beast = monsterArray;

但没有运气。我错过了什么?

【问题讨论】:

  • properDisplay 返回什么?
  • 它添加了一些 CSS 并在游戏中添加了一些文本。它比任何东西都更美观。
  • 您的pickRand 函数将返回properDisplay 的返回值。为什么不只是return monsterArray[randomKey]
  • 如果我做了退货,我以后怎么调用呢?抱歉,还在努力学习 JS。我正在尝试做的是将随机值分配给一个变量,以便稍后在您决定与怪物战斗时使用它。我希望能够调用按名称随机生成的任何怪物。 (僵尸、食尸鬼等)。

标签: javascript arrays variables object random


【解决方案1】:

看起来问题在于您正在返回 properDisplay 函数的返回值。

如果您使用怪物数组而不是地图,则可以在随机选择一个怪物时存储所有怪物信息:

var monsters = [
    {
        name: 'zombie',
        hitPoints: 10,
        loot: "magic knife"
    },
    {
        name: 'skeleton',
        hitPoints: 15,
        loot: "magic shield"
    },
    {
        name: 'ghoul',
        hitPoints: 12,
        loot: "magic helm"
    }
];

function pickRand(arr) {
    var index = Math.floor(Math.random() * arr.length);
    return arr[index];
}

var monster = pickRand(monsters);

现在你有了你的怪物,你可以展示它了:

$("<p>Holy Crap!  There's a " + monster.name + " in here!</p>").properDisplay();

演示:https://jsfiddle.net/louisbros/3cu9spfd/

【讨论】:

  • 这是我的小提琴@louisbros。 jsfiddle.net/eut1h5m7 当我调用变量时,它会显示 [object object]。我唯一能想到的是我错误地放置了变量?当你在游戏开始时“向东走”时,怪物就会被召唤。
  • 我的错。我错过了monster.name 的显示。谢谢@louisbros。一切就绪!
  • 有没有办法让变量记住同一个随机选择的怪物一段时间? IE。它随机选择 Zombie - 我如何让它记住 Zombie,直到我希望它随机生成另一个怪物?那有意义吗?我知道每次调用该函数时,它都会再次随机生成。我需要它来暂时记住它的选择。
  • 是的,您可以通过为monster 变量提供更大的范围来每次保留该值。比如在函数外面声明变量,在函数里面设置。
  • 好的,我明白在函数之外声明。你在你的例子中这样做。我对“将其设置在函数内”含糊不清我这样做了:function pickRand(arr) { var index = Math.floor(Math.random() * monsters.length); return arr[index]; var monster = pickRand(monsters); }; var monster = pickRand(monsters); 但没有运气。我确定这是我搞砸的功能部分。
【解决方案2】:

var beast = pickRand(); 应该完全可以工作。你只需要在调用时正确分配变量吗?

var travel = function(direction) {
        var newRoom = rooms[currentRoom.paths[direction]];
        if (!newRoom) {
            $("<p>You can't go that way.</p>").properDisplay();
        }
        else {
            currentRoom = newRoom;
            $("<p>You are now in the " + currentRoom.name + " Room.</p>").properDisplay();
                if (currentRoom.hasMonsters) {
                    function pickRand() {
                        var monsterArray = Object.keys(monsters);   
                        var randomKey = Math.floor(Math.random() * monsterArray.length);
                        return $("<p>Holy Crap!  There's a " + monsterArray[randomKey] + " in here!</p>").properDisplay();  
                    }
                    var beast = pickRand();
                }
        }
    }

【讨论】:

  • 这就是我认为它不起作用的原因。我使用它只是为了看看它是否会正确调用,我添加了alert(beast);,它输出objectObject。我猜这意味着它错误地调用了对象......
  • 也许可以试试alert(beast[0])?您可能需要查看该对象中的第一项
猜你喜欢
  • 1970-01-01
  • 2021-05-06
  • 2017-05-01
  • 1970-01-01
  • 2018-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-22
相关资源
最近更新 更多