#javascript
Вопрос:
Я работал над простым веб-сайтом «камень, ножницы, бумага» из проекта Odin и пытался создать способ, чтобы игра останавливалась и сбрасывалась, как только кто-то наберет 5 баллов. В результате я создал новую функцию и установил остальную часть игры в другую функцию. Когда я играю в игру в первый раз, она отлично работает и вызывает функцию воспроизведения снова, чтобы начать новую игру. Во второй игре (и в других последующих играх) Я сталкиваюсь с проблемой, что игра проходит один ход 3 или 2 раза вместо одного раза. Я зашел в инструменты разработчика и увидел, что вместо завершения стека вызовов игра начинает пропускать возможность выбора для меня и использует мой последний выбор в качестве ответа на следующий ход.
Он должен идти: fullGame(), нажать кнопку выбора, чтобы начать playRound (), playerPlay (), computerPlay (), просмотреть условия, чтобы узнать, кто выиграл, game (), и если условия выполнены, playAgain() в противном случае вернет строку
Но во второй игре он перейдет прямо из game() в функцию playRound (), и я не понимаю, почему, поскольку я сделал это так, что в него можно играть только при нажатии кнопки.
Любая помощь будет признательна.
function fullGame(){ i = 0; //player score variable j = 0; //computer score variable console.log("Hello"); //test to see if script runs console.log(i,j); function computerPlay(){ //computer choice function const choices = ["rock", "paper", "scissors"]; //array of choices return choices[Math.floor(Math.random() * choices.length)]; //chooses random value from array } function playRound(e, compChoice, playerChoice){ //round function function game(){ if(i === 5){ console.log(i); playAgain(); return "You won the Match!" } else if (j === 5){ console.log(j); playAgain(); return "You lost the Match!" } else{ console.log("next round") return "Next Round!" } } function playerPlay(){ if(e.srcElement.textContent === "Rock") { return "rock"; } else if(e.srcElement.textContent === "Paper") { return "paper"; } else if(e.srcElement.textContent === "Scissors") { return "scissors"; } } compChoice = computerPlay(); playerChoice = playerPlay(); console.log(playerChoice); console.log(compChoice); if (playerChoice === "rock" amp;amp; compChoice === "scissors"){ //if player wins conditionals console.log("You Win!"); i ; console.log(i, j); game(); return "You won the round!"; } else if (playerChoice === "paper" amp;amp; compChoice === "rock"){ //if player wins conditionals console.log("You Win!"); i ; console.log(i, j); game(); return "You won the round!"; } else if (playerChoice === "scissors" amp;amp; compChoice === "paper"){ //if player wins conditionals console.log("You Win!"); i ; console.log(i, j); game(); return "You won the round!"; } else if (playerChoice === compChoice){ //if the round is a tie console.log("Tie"); console.log(i, j); game(); return "The round is a tie!"; } else{ console.log("You Lose."); //if computer wins the round j ; console.log(i, j); game(); return "You lost the round!"; } } const bttn = document.querySelectorAll("button"); bttn.forEach(bttn =gt; bttn.addEventListener("click", playRound)); } function playAgain(){ alert("Would you like to play again?"); fullGame(); } fullGame();
Комментарии:
1. Если вы помещаете
bttn.forEach(bttn =gt; bttn.addEventListener("click", playRound));
внутрьfullGame
, то каждый раз , когда вы звонитеfullGame
, вы привязываете другого прослушивателя событий. Если вы не хотитеplayRound
, чтобы выполнение выполнялось более одного раза за клик, не помещайте эту строку внутри функции, которая будет вызываться несколько раз.