添加条件以使其仅在特定情况下运行

时间:2015-11-09 00:45:07

标签: javascript

我现在正在用javascript编写文本游戏,并且有一个拿起剑的功能。

var takeSword = function() {
        if (currentRoom.hasSword) {
            $("<p>You picked up a sword.</p>").properDisplay();

        }
        else {
            $("<p>The sword is not here.</p>").properDisplay();
        }
    };

我的问题是,只要你和剑在同一个房间里,你就可以一遍又一遍地拿起它。你怎么设置这个功能,这样一旦你拿起剑,你就不能再拿起它了?

我最初的想法是设置一个像var sword = false;这样的变量,然后当函数运行时设置sword = true;但是没有效果。

这不是我的整个代码,还有一个对象,它设置了`hasSword = true;&#39;这样剑就可以在第一时间被拿起而且不能在游戏的不同房间里被拿起来。

3 个答案:

答案 0 :(得分:1)

或许这样的事情?

var GameState = {
    worldHasSword: true,
    playerHasSword: false,
    takeSword: function() {
        if( this.worldHasSword ) {
            this.worldHasSword = false;
            this.playerHasSword = true;
            $("<p>You picked up a sword.</p>").properDisplay();
        }
        else {
            $("<p>The sword is not here.</p>").properDisplay();
        }
    }
}

GameState.takeSword();

答案 1 :(得分:1)

这里最好的解决方案是根本不触及你的原始功能,而只是包装在一般功能中,以防止它被多次调用。这个通用功能可以在您需要的代码中的任何其他位置使用&#34; once-ify&#34;东西:

function once(fn, context) { 
    var result;

    return function() { 
        if(fn) {
            result = fn.apply(context || this, arguments);
            fn = null;
        }

        return result;
    };
}

现在你只需:

var takeSwordOnce = once(takeSword);

并在代码中使用takeSwordOnce。或者,您可以这样做:

takeSword = once(takeSword);

有关once功能的详细说明,请参阅this article

答案 2 :(得分:0)

@Kenney让我思考正确的方向。这是我如何修复它而不完全重写函数:

var takeSword = function() {
        if (currentRoom.hasSword) {
            $("<p>You picked up a sword.</p>").properDisplay();
            currentRoom.hasSword = false;
        }
        else {
            $("<p>The sword is not here.</p>").properDisplay();
        }
    };

我犯的第一个错误就是认为“hasSword”本身就是变量。我需要将currentRoom添加到它然后它工作正常。我已经测试了它,并且在没有剑的房间里试过它,它看起来工作正常。