2 ошибки в моей игре по угадыванию случайных чисел в javascript

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

Я сделал это с помощью цикла for, но я хотел попробовать другой вариант и использовать счетчик декремента. Я пытался использовать материал if/else из внутренней функции внутри цикла while. Код мне кажется правильным.

const guessingGame = (tries) => {
    const answer = Math.floor(Math.random() * 11)
    let guess = null
    let status = "playing"
    function makeGuess() {
        if (guess === answer) {
            status = "won"
        } else if (tries === 0) {
            status = "lost"
        } else {
            tries--
            if (tries === 1) {
                console.info(tries + ' guess left')
            } else {
                console.info(tries + ' guesses left')
            }
        }
    }
    while (status === "playing") {
        if (!guess) {
            guess = prompt('Guess a number between 1 and 10')
            makeGuess()
        } else if (guess > answer) {
            guess = prompt('Lower')
            makeGuess()
        } else if (guess < answer) {
            guess = prompt('Higher')
            makeGuess()
        } else {
            break
        }
    }
    console.info("Game Over.  You " + status + "!  The answer was " + answer + ".")
}
  1. Эта игра должна вызываться/запускаться с одним аргументом, допустимым количеством попыток. Если я правильно угадаю ответ, журнал консоли в конце должен содержать статус = «выиграл». Но когда я выигрываю, он включает статус = "играет".

  2. Когда я угадываю неправильное количество попыток, я должен проиграть. Но когда я вижу в консоли "Осталось 0 догадок", игра выдает еще одну догадку, и я могу ее взять, эффективно делая попытки -1, я думаю. Когда я делаю еще одно неправильное предположение, статус правильно меняется на «потерянный», а последнее сообщение консоли верное.

Вы проверили tries === 0 перед tries--, поэтому получаете 0 guesses left.

Ricky Mo 30.05.2019 05:39

А guess на самом деле строка, а не число, поэтому guess === answer никогда не бывает правдой. На следующей итерации после того, как вы угадали правильно, он попадает в else{break} со статусом playing. Вы либо хотите Number(guess) === . answer, либо просто guess == answer.

Ricky Mo 30.05.2019 05:44

Это было именно то, что мне было нужно, Рики Мо. Большое спасибо. Я исправил эти две вещи, и все работает именно так, как я себе представлял. Как сказал Амадан, моя последняя попытка исправить эти две проблемы оказалась довольно странной. Теперь, когда я знаю, в чем заключались две проблемы, я собираюсь реструктурировать/упростить его.

Patrick C 30.05.2019 06:03
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
3
118
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Результатом prompt является строка; таким образом, guess — это строка. Результатом Math.floor является число, поэтому answer является числом.

> и < — операторы принуждения: если один из операндов — число, то и другой преобразуется в число. Это означает, что guess < answer и guess > answer работают так, как вы надеетесь.

Тем не менее, вы, очевидно, слышали, как люди говорят «никогда не используйте ==, всегда используйте ===», и приняли это близко к сердцу. Причина поговорки в том, что == также является оператором принуждения, и, как следствие, иногда вещи, которые не выглядят равными, в конечном итоге оказываются равными. Однако здесь вам действительно нужно было использовать принудительное ==, потому что 1 == '1' (хотя 1 и '1' — разные типы), но строгое 1 === '1' оказывается false!

Таким образом, вы сначала проверяете, строго ли guess равно answer. Так как их типы разные, это невозможно, так что вы идете дальше. Вы проверяете, находится ли guess над ответом, затем вы проверяете, находится ли он под answer, оба они также возвращают false. Единственный оставшийся вариант — break из цикла, и "winner" никогда не будет напечатано.


Помимо этого, ваша самая большая проблема на самом деле логика. Размещение различных тестов и действий несколько сомнительно. Например, можно было бы ожидать, что проверка, равна ли guessanswer, будет рядом с проверкой, чтобы увидеть, больше она или меньше. Тест на tries был бы наиболее удобен прямо в петле while; но у вас есть бесконечный цикл и независимый тест для tries. Вы вводите первое предположение с уникальной подсказкой, но оно находится внутри бесконечного цикла, несмотря на то, что это может произойти только один раз. У вас есть функция с именем makeGuess, но эта функция выполняет два или три разных действия, ни одно из которых на самом деле не делает предположений.

Вместо того, чтобы сразу начинать работать над кодом, а затем исправлять проблемы по мере их появления, попробуйте сначала представить себе, каким будет процесс. Как бы это сделал человек? потом код записи.


Вот основная идея той же игры:

answer = imagineAnswer()
guess = askForFirstGuess()
status = "lost"
while (--tries) {
  if (guess > answer) {
    guess = askForHigherGuess()
  } else if (guess < answer) {
    guess = askForLowerGuess()
  } else {
    status = "won"
    break
  }
}
reportGameEnd(status)

Попался Амадан. Спасибо за ваше время. Я пробовал это разными способами, намного ближе к тому, что вы предлагаете, но у меня по-прежнему были две проблемы, поэтому я продолжал пробовать разные идеи. Это была последняя, ​​последняя попытка перед обращением за помощью.

Patrick C 30.05.2019 06:02
Ответ принят как подходящий
  1. Вы проверили tries === 0 перед tries--, поэтому у вас осталось 0 догадок. Вы должны уменьшить перед проверкой.

  2. Догадка на самом деле является строкой, а не числом, поэтому guess === answer никогда не бывает правдой. Следующая итерация после того, как вы угадали правильно, попадает в else{break}, а status все еще играет. Вы либо хотите Number(guess) === answer, либо просто guess == answer.

  3. По Math.floor(Math.random() * 11) вы фактически генерируете 0-10. Вы хотите Math.floor(Math.random() * 10) + 1 за 1-10. Просто помните, что Math.floor(Math.random() * n) дает вам n возможных результатов, которые представляют собой целое число в диапазоне [0,n). Затем выполните любой расчет, который вы хотите сопоставить с желаемым выходным значением.

const guessingGame = (tries) => {
    const answer = Math.floor(Math.random() * 10) + 1
    let guess = null
    let status = "playing"
    function makeGuess() {
        tries--;
        if (guess === answer) {
            status = "won"
        } else if (tries === 0) {
            status = "lost"
        } else {
            
            if (tries === 1) {
                console.info(tries + ' guess left')
            } else {
                console.info(tries + ' guesses left')
            }
        }
    }
    while (status === "playing") {
        if (!guess) {
            guess = Number(prompt('Guess a number between 1 and 10'))
            makeGuess()
        } else if (guess > answer) {
            guess = Number(prompt('Lower'))
            makeGuess()
        } else if (guess < answer) {
            guess = Number(prompt('Higher'))
            makeGuess()
        } else {
            break
        }
    }
    console.info("Game Over.  You " + status + "!  The answer was " + answer + ".")
}
guessingGame(5);

Другие вопросы по теме