Глобальная переменная в угадайке - PullRequest
0 голосов
/ 29 сентября 2018

Я пытаюсь сделать стандартную игру по угадыванию чисел, которую MDN предоставляет в своем руководстве по JS.Я попытался немного изменить его, создав различные функции для разных сценариев.

Кажется, глобальная переменная var userGuess = parseInt(guessField.value) не работает, поскольку ваше предыдущее предположение всегда выглядит как NaN.

Также, когда игра сбрасывает, работают функции showWin() и showLoss(), но не функция showError().

Я очень плохо знаком с JS и вообще программирую, так что, скорее всего, где-то есть глупая ошибка, если кто-нибудь сможет помочь мне в этой проблеме, это будет высоко оценено!

var randNum = Math.floor(Math.random() * 100) + 1;
var guessField = document.querySelector('.guessField');
var guessSubmit = document.querySelector('.guessSubmit');
var guesses = document.querySelector('.guesses');
var lastResult = document.querySelector('.lastResult');
var lowOrHi = document.querySelector('.lowOrHi');

var guessCount = 1;
var resetButton;
var userGuess = parseInt(guessField.value);

function checkGuess() {

  if(guessCount === 1) {
    guesses.textContent = "Previous Guesses: ";
  }
  guesses.textContent += userGuess + ' ';

  if(userGuess === randNum) {
    showWin();
  } else if(guessCount === 10) {
    showLoss();
  } else {
    showError();
  }

  guessCount++;
  guessField.value = '';
  guessField.focus();
}

guessSubmit.addEventListener('click', checkGuess);

function showWin() {
  lastResult.textContent = 'You won nice job schmuck';
  lastResult.style.backgroundColor = 'green';
  gameOver();
}

function showError() {

  lastResult.textContent = 'Sorry, wrong guess';
  if(userGuess > randNum) {
    lowOrHi.textContent = 'Your guess was too high';
  } else if(userGuess < randNum) {
    lowOrHi.textContent = 'Your guess was too low';
  }
}

function showLoss() {
  lastResult.textContent = 'You lost, you schmuck';
  lastResult.style.backgroundColor = 'red';
  gameOver();
}

function gameOver() {
  guessField.disabled = true;
  guessSubmit.disabled = true;
  resetButton = document.createElement('button');
  resetButton.textContent = 'New Game';
  document.body.appendChild(resetButton);
  resetButton.addEventListener('click', resetGame);
}

function resetGame() {
  guessCount = 1;
  var resetParas = document.querySelectorAll('.resultParas');

  for(i = 0; i < resetParas.length; i++) {
    resetParas[i].textContent = '';
  }

  guessField.disabled = false;
  guessSubmit.disabled = false;
  resetButton.parentNode.removeChild(resetButton);
  lastResult.style.backgroundColor = 'white';
  randNum = Math.floor(Math.random() * 100) + 1;
}
<h1>Guessing Game</h1>
<p>Type in a number between 1 and 100 and I will tell you if it is too high or low.</p>
<form>
  <label for="guessField">Enter a guess: </label>
  <input type="text" id="guessField" class="guessField"/>
  <input type="button" value="Submit Guess" class="guessSubmit"/>
</form>

<div class='resultParas'>
  <p class="guesses"></p>
  <p class="lastResult"></p>
  <p class="lowOrHi"></p>
</div>

1 Ответ

0 голосов
/ 29 сентября 2018

В вашем скрипте вы вызываете

parseInt(guessField.value) // effectively that is parseInt("") when it's empty

Вызов parseInt() с пустой строкой возвращает NaN;

MDN в их примере использования:

var userGuess = Number(guessField.value);

Number("") возвращает числовое значение 0.

Вам также необходимо обновлять значение userGuess каждый раз, когда вы звоните checkGuess().Итак, вам нужны следующие изменения:

// ... code
var userGuess = Number(guessField.value);

// ... the rest of code

function checkGuess() {
    userGuess = Number(guessField.value)

    // ... rest of code
}
// rest of code

Конечно, вам не нужно использовать Number(), вы также можете выполнить некоторую другую проверку условий, но Number() - это элегантный способ принять любое числоили пустая строка.

ОБНОВЛЕНИЕ Новый jsbin здесь.

Для части resetGame(): вы выбрали .resultParas, например:

var resetParas = document.querySelectorAll('.resultParas');

Затем вы перебрали результаты этого и заменили .textContent этих элементов.Но это были не простые текстовые узлы, это были узлы парапграфа с текстовыми узлами внутри.Я изменил это на:

var resetParas = document.querySelector('.resultParas').children;

Это должно работать!Я добавил несколько комментариев в jsfiddle для более подробного объяснения.

...