我会尽量在没有大量代码的情况下提出这个问题。基本上我写了一个非常简单的数学测验游戏。在这个游戏中你选择一个难度,你想要的问题数量,游戏开始。它询问了一些问题,然后你得到一个分数然后游戏结束了。但是,您可以重新开始游戏。当您重新启动时,它只会返回主屏幕,然后您可以再次选择您的选项。唯一的问题是,我们需要跟踪测验中剩余的问题数量,第一次,它运作良好。我们将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);
});
答案 0 :(得分:1)
听起来你需要在游戏重启时实例化一个新的游戏对象。
答案 1 :(得分:1)
你的问题(我认为)在于封闭。当你在javascript中声明一个函数时,任何从它自己的范围之外访问变量都会产生所谓的闭包。在这种情况下,从事件函数内部访问numQuestions
,创建一个闭包。这样做的结果是,任何对事件函数中的变量numQuestions
的访问都会引用变量,因为它是从您的javascript解释器遇到事件函数本身时开始的 - 即,您第一次玩游戏时。 / p>
看一下these,了解它出了什么问题。
答案 2 :(得分:1)
您在哪里定义点击监听器?如果它触发了两次,看起来你正在以这种方式定义点击监听器,在你完成一个游戏并重新开始之后,将会注册一个新的监听器,所以你最终得到2个。