2013-12-24 4 views
0

Я попытаюсь изо всех сил задать этот вопрос без огромной стены кода. В основном я написал очень простую математическую игру. В этой игре вы выбираете сложность, количество вопросов, которые вы хотите, и игра начинается. Он спрашивает, сколько вопросов, а затем вы получаете оценку, а затем игра окончена. Однако вы можете перезапустить игру. Когда вы перезагружаетесь, он просто возвращает вас на главный экран, после чего вы можете снова выбрать свои параметры. Единственная проблема заключается в том, что нам нужно отслеживать количество вопросов, оставшихся в викторине, в первый раз, это хорошо работает. Мы передаем numQuestions в игру. Во второй раз, однако, даже если я прохожу numQuestions=10, значение остается 0 с первого раза, когда я играл в игру. Вот игровая функция:переменная не обновляется при перезапуске функции (javascript)

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); 
}); 
+2

Где вы звоните: startGame? Где определены ваши numQuestions? – AbhinavRanjan

+0

отредактировал: Кажется, что после одной игры он начинает стрелять как правильно, так и неправильно, как будто есть две версии переменной ... Я что-то прикрутил –

+0

Можете ли вы также включить основную структуру html? Это поможет устранить неполадки. –

ответ

1

Вы проблема (я думаю) лежит в закрытии. Когда вы объявляете функцию в javascript, любой доступ к переменной извне ее собственной области создает то, что называется закрытием. В этом случае доступ к numQuestions осуществляется изнутри вашей функции события, создавая закрытие. Эффект от этого заключается в том, что любой доступ к переменной numQuestions внутри ваших функций события ссылается на переменную, как это было с момента, когда ваш интерпретатор javascript натолкнулся на функцию события, то есть в первый раз, когда вы играете в свою игру.

Посмотрите на these, чтобы узнать, где это происходит.

+0

Я вижу, это, безусловно, проблема. У меня есть кое-какие занятия –

1

Это звучит, как вам нужно создавать новый объект игры, когда игра возобновляется.

1

Где вы определяете прослушиватель нажатий? Если он срабатывает два раза, кажется, что вы определяете прослушиватель нажатий таким образом, что после того, как вы закончите одну игру и начнете все, новый слушатель будет зарегистрирован, так что вы получите 2 в конце.

Смежные вопросы