函数重启时,变量不会更新(javascript)

时间:2013-12-24 20:24:48

标签: javascript jquery

我会尽量在没有大量代码的情况下提出这个问题。基本上我写了一个非常简单的数学测验游戏。在这个游戏中你选择一个难度,你想要的问题数量,游戏开始。它询问了一些问题,然后你得到一个分数然后游戏结束了。但是,您可以重新开始游戏。当您重新启动时,它只会返回主屏幕,然后您可以再次选择您的选项。唯一的问题是,我们需要跟踪测验中剩余的问题数量,第一次,它运作良好。我们将numQuestions传递给游戏功能。然而,第二次,即使我通过numQuestions=10,从我第一次玩游戏时,该值仍为0。这是游戏功能:

function startGame(difficulty,numQuestions,score){

    // begins game, excluded that come its just some acsii art

        // asks question
        var q = new question(difficulty);
        $("#gameInside").html(q.string);
        $("#gameInside").data('answer',q.answer);
            // gives answer options
        for (var ii=0;ii<=3;ii++){
            $("#answers").append("<button class='answerButton'>"+q.answerArray[ii]+"</button>")
        }
            // starts timer
        var b = document.getElementById("timer");
        timer = new stopWatch(b, {delay: 100});
        timer.start();


    },5500)
    // when answer is clicked, go here
    $("#gameScreen").on("click",".answerButton",function() {
        // this seems to be the problem: on the second time I play the game, numQuestions remains the value from the first game and continues to go down (-1,-2) and since my selector is (>0), the else statement fires.
        numQuestions--;

        var time = parseFloat($("#timer span").html());
        var correct = parseFloat($("#gameInside").data('answer'));
        var userAnswer = parseFloat($(this).html());

        if (correct==userAnswer)
            tempScore = Math.round(calculateScore(time)*100)/100;
        else
            tempScore = 0;

        score += tempScore;
        $("#score").html(Math.round(score*100)/100);

        if (numQuestions > 0) {


            var q = new question(difficulty);
            $("#gameInside").html(q.string);
            $("#gameInside").data('answer',q.answer);
            $("#answers").empty();

            for (var ii=0;ii<=3;ii++){
                $("#answers").append("<button class='answerButton'>"+q.answerArray[ii]+"</button>")
            }
            timer.reset();

        } else {

            $("#answers").empty();
            $("#gameInside").html('Game Over! Thanks for Playing!');
            timer.stop();

        }

    });

}

任何想法?感谢

编辑:

$(".numberQButton").click(function(){
        numQuestions = parseFloat($(this).html());
        $("#numQuestionsScreen").hide();
        $("#gameScreen").show();
        $("#score").html(0);
        startGame(difficulty,numQuestions,score);
});

3 个答案:

答案 0 :(得分:1)

听起来你需要在游戏重启时实例化一个新的游戏对象。

答案 1 :(得分:1)

你的问题(我认为)在于封闭。当你在javascript中声明一个函数时,任何从它自己的范围之外访问变量都会产生所谓的闭包。在这种情况下,从事件函数内部访问numQuestions,创建一个闭包。这样做的结果是,任何对事件函数中的变量numQuestions的访问都会引用变量,因为它是从您的javascript解释器遇到事件函数本身时开始的 - 即,您第一次玩游戏时。 / p>

看一下these,了解它出了什么问题。

答案 2 :(得分:1)

您在哪里定义点击监听器?如果它触发了两次,看起来你正在以这种方式定义点击监听器,在你完成一个游戏并重新开始之后,将会注册一个新的监听器,所以你最终得到2个。