Как заставить функцию ждать, пока другая остановит выполнение (Simon Game) javascript

1

Im, делающий Simon Game, и Ive уже добавил логику, но я не знаю, как приостановить выполнение, пока игрок не нажал на плитку. Ive создал функцию под названием user() которая записывает вход пользователей и выталкивает их в массив userSeq. Затем я выполнил функцию checkTurn() чтобы проверить, что следующий ход (компьютер или пользователь). Если его пользователи повернутся, я хочу, чтобы в остальном ждать завершения функции user() а затем вызвать callcheckClicks() чтобы проверить, callcheckClicks() ли пользователи с компьютерами, а затем перейти на новый уровень. Пожалуйста помоги!

Heres ссылка: https://codepen.io/Teo03/pen/yPvbwY

$(document).ready(function() {
  var green = document.getElementById("green");
  var red = document.getElementById("red");
  var yellow = document.getElementById("yellow");
  var blue = document.getElementById("blue");
  var tile = document.getElementsByClassName("tile");
  //audio for every click
  var audio = [
    new Audio("https://s3.amazonaws.com/freecodecamp/simonSound1.mp3"),
    new Audio("https://s3.amazonaws.com/freecodecamp/simonSound2.mp3"),
    new Audio("https://s3.amazonaws.com/freecodecamp/simonSound3.mp3"),
    new Audio("https://s3.amazonaws.com/freecodecamp/simonSound4.mp3")
  ];
  // record the round
  var round = 0;
  // record the random presses
  var compSeq = [];
  //record user clicks
  var userSeq = [];
  //if it false computer moves
  var turn = false;
  //round number
  var round = 0;
  //count how many moves user does
  var playerIndex = 0;

  //start
  $(".start").click(function() {
    round++;
    turn = false;
    $("#round")
      .html("Round: " + round)
      .show();
    $(".start, .reset").hide();
    checkTurn();
  });

  function addNewRandomNumber() {
    var random = Math.floor(Math.random() * 4) + 1;
    computer(random);
    console.log("random" + random);
  }

  // call the computer to make an action
  function callComp() {
    addNewRandomNumber();
    enableClicks();
    turn = true;
    checkTurn();
  }

  function callCheckClicks() {
    checkClicks();
  }

  //check every time the user clicks if the user clicks are the same as the computer's
  function checkClicks() {
    console.log("random clicks: " + compSeq);
    //if user guess is correct
    if (userSeq[playerIndex] == compSeq[playerIndex]) {
      if (userSeq[playerIndex].length == compSeq[playerIndex].length) {
        // if they are then it computer turn
        callComp();
      } else {
        playerIndex += 1;
        $(".start")
          .html("Next")
          .show();
        // user is right, he can continue inputting another clicks if the sequence has
        checkTurn();
      }
    } else {
      resetUserVariables(); // user is wrong
    }
  }
  //reset playerIndex
  function resetUserVariables() {
    playerIndex = 0;
  }
  //press a random button
  function computer(ran) {
    switch (ran) {
      case 1:
        blink(green);
        audio[0].play();
        compSeq.push(1);
        break;
      case 2:
        blink(red);
        audio[1].play();
        compSeq.push(2);
        break;
      case 3:
        blink(blue);
        audio[2].play();
        compSeq.push(3);
        break;
      case 4:
        blink(yellow);
        audio[3].play();
        compSeq.push(4);
        break;
      default:
        return;
    }
    console.log("random clicks: " + compSeq);
    enableClicks();
    turn = true;
    checkTurn();
  }
  //blink a tile
  function blink(tile) {
    $(tile).fadeOut("slow", function() {
      $(this).fadeIn("slow", function() {
        return;
      });
    });
  }

  //user input
  function user() {
    if ($(this).is("#green")) {
      userSeq.push(1);
      audio[0].play();
      blink(green);
      playerIndex++;
    } else if ($(this).is("#red")) {
      userSeq.push(2);
      audio[1].play();
      blink(red);
      playerIndex++;
    } else if ($(this).is("#blue")) {
      userSeq.push(3);
      audio[2].play();
      blink(blue);
      playerIndex++;
    } else if ($(this).is("#yellow")) {
      userSeq.push(4);
      audio[3].play();
      blink(yellow);
      playerIndex++;
    }
    turn = false;
    checkTurn();
    console.log("user clicks: " + userSeq);
  }

  //add an event listener for user clicks
  function enableClicks() {
    for (var i = 0; i < tile.length; i++) {
      tile[i].addEventListener("click", user, false);
    }
  }
  //disable clicks when is computer turn
  function disableClicks() {
    for (var i = 0; i < tile.length; i++) {
      tile[i].removeEventListener("click", user, false);
    }
  }
  //check who turn is next
  function checkTurn() {
    if (turn === false) {
      //call computer
      callComp();
    } else {
      callCheckClicks();
    }
  }
  //document.ready().
});
html * {
  text-align: center;
  background-color: #d3d3d3;
}

h1 {
  font-size: 60px;
  padding-bottom: 10px;
}

h3 {
  display: none;
  padding-bottom: 30px;
}

.circle {
  background: #d3d3d3;
  width: 320px;
  height: 320px;
  border-radius: 50%;
  border: 10px solid gray;
  margin: auto;
}

.tile {
  height: 150px;
  width: 150px;
  float: left;
  cursor: pointer;
}

#red {
  background-color: red;
  border-top-right-radius: 100%;
}

#green {
  background-color: green;
  border-top-left-radius: 100%;
}

#blue {
  background-color: blue;
  border-bottom-right-radius: 100%;
}

#yellow {
  background-color: yellow;
  border-bottom-left-radius: 100%;
}

btn {
  padding-top: 40px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script>
<h1 class="text-center">Simon Game</h1>
<div class="container text-center">
  <h3 id="round">Round: </h3>
  <div class="circle">
    <div class="tile" onclick="user()" id="green"></div>
    <div class="tile" onclick="user()" id="red"></div>
    <div class="tile" onclick="user()" id="yellow"></div>
    <div class="tile" onclick="user()" id="blue"></div>
  </div>
  <a class="btn start btn-default">Start</a>
  <a class="btn reset btn-default" onclick="reset()">Reset</a>

  <!-- container !-->
</div>
  • 1
    Ваш код настолько сложен для чтения .. пожалуйста, выберите подозрительные части
  • 0
    Я думаю, что проблема в функции checkTurn (), потому что каждый раз после того, как компьютер играет, он вызывает эту функцию, выполняет код в операторе else и вызывает checkClicks (), не дожидаясь завершения функции user (), и я не знаю, как ждать там ввода пользователя.
Теги:

1 ответ

0

Я считаю, что вы ищете setTimeout()

Это занимает 2 параметра, вашу функцию и количество миллисекунд.

Например, если вы хотите выполнить функцию через три секунды события onclick...

<button onclick="setTimeout(myFunction, 3000);">Try it</button>

<script>
function myFunction() {
    alert('Hello');
}
</script>

Затем используйте обещание, как описано здесь: Javascript - Подождите истинного окончания функции, которая использует setTimeout

Еще одно замечание - поток программы. В настоящее время вы используете checkTurn метод, который вызывает callCheckClicks метод, который вызывает checkClicks и checkClicks вызывает checkTurn снова. При этом ваша программа будет терпеть крах, поскольку она непрерывно циклы навсегда. Для этого вам нужно активировать if/else в вашем checkClicks чтобы

turn = true;
checkTurn();

Выглядеть как

function checkClicks() {
  console.log("random clicks: " + compSeq);
  //if user guess is correct
  if (userSeq[playerIndex] == compSeq[playerIndex]) {
    if (userSeq[playerIndex].length == compSeq[playerIndex].length) {
      // if they are then it computer turn
      callComp();
    } else {
      playerIndex += 1;
      $(".start")
        .html("Next")
        .show();

      // user is right, he can continue inputting another clicks if the sequence has
      turn=true;

      checkTurn();

    }
  } else {
    resetUserVariables(); // user is wrong
  }
}

Надеюсь, это то, что вы ищете.

  • 0
    но, как я уже сказал, я не знаю, как ждать ввода пользователя, а затем продолжать выполнение функции checkClick (), чтобы увидеть, совпадает ли ввод пользователя с компьютером
  • 0
    @ То есть, пожалуйста, смотрите редактирование.
Показать ещё 8 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню