javascript游戏的动态闭包功能

时间:2012-02-24 05:19:43

标签: javascript closures

我正在开发一个简单的html / javascript乘法游戏,其中我有一个乘法表,其中包含一些输入,用于表示产品的结果。在那场比赛中,你需要尽可能快地回答尽可能多的问题。为了方便玩家,我将一个事件分配给输入键,以便在按下时移动到下一个输入。

multiplication table game

以下是突出显示行和输入键事件的javascript代码:

for (var i=0; i<boardInputArray.length; i++) {
    boardInputArray[i].onkeydown = (function(nextBox) {
        return function(e) {
            if(e.keyCode == 13) {
                if(nextBox==boardInputArray.length) {boardInputArray[0].focus();boardInputArray[0].select();}
                else {boardInputArray[nextBox].focus();boardInputArray[nextBox].select();}
                var gameCompleted = true;
                for(var c=0;c<boardInputArray.length;c++) {
                    if(boardInputArray[c].value == '') {gameCompleted = false;}
                }
                if(gameCompleted) validateGame();
            }
        }
    })(i+1);
}

我不想在这里发布整个代码,因为它很长。如果您想看到游戏的实际效果,请访问: http://www.webdesk.co.il/articles/javascript/multiplication-table-game.php

问题在于:我希望每按一次Enter键,它会检查以下输入是否为空。如果它不为空 - 跳到下一个,依此类推,直到找到空输入。这样,玩家可以回到他没有回答的问题,而不是通过他回答的所有问题。有意义吗?

1 个答案:

答案 0 :(得分:2)

您可以改进此代码,但它确实会移动到下一个空框。

for (var i=0; i<boardInputArray.length; i++) {
    boardInputArray[i].onkeydown = (function(currentBox) {
        return function(e) {
            if(e.keyCode == 13) {
                var gameCompleted = true;
                if(boardInputArray[currentBox].value == '')
                    gameCompleted = false;
                for (
                        var c = (currentBox + 1) % boardInputArray.length;
                        c != currentBox;
                        c = (c + 1) % boardInputArray.length
                    )
                {
                    if(boardInputArray[c].value == '')
                    {
                        gameCompleted = false;
                        boardInputArray[c].focus();
                        boardInputArray[c].select();
                        break;
                    }
                }
                if(gameCompleted) validateGame();
            }
        }
    })(i);
}

注意:

  • 我已经使匿名函数成为currentBox的函数而不是nextBox(i而不是i + 1)。
  • 循环遍历除当前框之外的所有框,从下一个框开始,环绕并在前一个框结束或遇到空白框时。