Почему эти два оператора If не совпадают? - PullRequest
0 голосов
/ 30 ноября 2018

Я только начал изучать Javascript.Сейчас я прохожу онлайн-курс и столкнулся с первой проблемой, которую я не понимаю.

Я хочу проверить, сколько догадок у меня осталось в игре Hangman:

const Hangman = function(word, remainingGuesses) {
  this.word = word.toLowerCase().split('')
  this.remainingGuesses = remainingGuesses
  this.guessedLetters = []
}

Hangman.prototype.getPuzzle = function() {
  let puzzle = ''

  this.word.forEach((letter) => {
    if (this.guessedLetters.includes(letter) || letter === ' ') {
      puzzle += letter
    } else {
      puzzle += '*'
    }
  })

  return puzzle
}

правильное if утверждение в видео таково:

Hangman.prototype.makeGuess = function(guess) {

  const isUnique = !this.guessedLetters.includes(guess)
  const isBadGuess = !this.word.includes(guess)

  if (isUnique) {
    this.guessedLetters.push(guess)
  }

  if (isUnique && isBadGuess) {
    this.remainingGuesses--
  }
}

Но это ниже, как я написал оператор if:

Hangman.prototype.makeGuess = function(guess) {


  if (!this.guessedLetters.includes(guess)) {
    this.guessedLetters.push(guess)
  }

  if (!this.guessedLetters.includes(guess) && !this.word.includes(guess)) {
    this.remainingGuesses--
  }
}

Остальные догадки вычисляются неправильно, если я делаю операторы if вторым способом.Подскажите, пожалуйста, в чем разница?

Ответы [ 3 ]

0 голосов
/ 30 ноября 2018

Проблема здесь:

if (!this.guessedLetters.includes(guess)) {
    this.guessedLetters.push(guess)
}

Если this.guessedLetter не включает guess, он добавляется в список (с push).

if (!this.guessedLetters.includes(guess)

Вы только что изменили this.guessedLetters.Итак, теперь, когда вы проверяете снова, guess всегда присутствует, поэтому это условие никогда не выполняется.

0 голосов
/ 30 ноября 2018

В вашем примере попробуйте проанализировать последовательность случаев, когда guessedLetters не содержит guess:

// if the guessedLetters doesn't contain guess ...
if (!this.guessedLetters.includes(guess)) {
    // ... then you add it
    this.guessedLetters.push(guess)
}

// and it already contains guess so the first clause of the if
// is always false
if (!this.guessedLetters.includes(guess) && !this.word.includes(guess)) {
    this.remainingGuesses--
}

В оригинале они сначалавычисляют оба флага isUnique и isBadGuess, и только тогда они изменяют guessedLetters и remainingGuesses.Предложение if проверяет неизмененную коллекцию guessedLetters.

0 голосов
/ 30 ноября 2018

В последнем примере вы изменяете массив guessedLetters с помощью метода push().Это может привести к другому результату метода includes() того же массива.

Попробуйте удалить его самостоятельно, если вы переведете его на «нормальный» английский:

  1. Если догадки нет в списке догадок, добавьте ее в список догадок.
  2. Если догадки нет в списке догадок и нет в списке слов, уменьшите оставшиеся догадки

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

Вы можете сделать этокак это вместо

if (!this.guessedLetters.includes(guess)) {
    this.guessedLetters.push(guess)

    if (!this.word.includes(guess)) {
       this.remainingGuesses--
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...