Это первое приложение, которое я написал. Я видел здесь миллион игр, генерирующих случайные числа, 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 + ".")
}
Эта игра должна вызываться/запускаться с одним аргументом, допустимым количеством попыток. Если я правильно угадаю ответ, журнал консоли в конце должен содержать статус = «выиграл». Но когда я выигрываю, он включает статус = "играет".
Когда я угадываю неправильное количество попыток, я должен проиграть. Но когда я вижу в консоли "Осталось 0 догадок", игра выдает еще одну догадку, и я могу ее взять, эффективно делая попытки -1, я думаю. Когда я делаю еще одно неправильное предположение, статус правильно меняется на «потерянный», а последнее сообщение консоли верное.
А guess
на самом деле строка, а не число, поэтому guess === answer
никогда не бывает правдой. На следующей итерации после того, как вы угадали правильно, он попадает в else{break}
со статусом playing
. Вы либо хотите Number(guess) === . answer
, либо просто guess == answer
.
Это было именно то, что мне было нужно, Рики Мо. Большое спасибо. Я исправил эти две вещи, и все работает именно так, как я себе представлял. Как сказал Амадан, моя последняя попытка исправить эти две проблемы оказалась довольно странной. Теперь, когда я знаю, в чем заключались две проблемы, я собираюсь реструктурировать/упростить его.
Результатом prompt
является строка; таким образом, guess
— это строка. Результатом Math.floor
является число, поэтому answer
является числом.
>
и <
— операторы принуждения: если один из операндов — число, то и другой преобразуется в число. Это означает, что guess < answer
и guess > answer
работают так, как вы надеетесь.
Тем не менее, вы, очевидно, слышали, как люди говорят «никогда не используйте ==
, всегда используйте ===
», и приняли это близко к сердцу. Причина поговорки в том, что ==
также является оператором принуждения, и, как следствие, иногда вещи, которые не выглядят равными, в конечном итоге оказываются равными. Однако здесь вам действительно нужно было использовать принудительное ==
, потому что 1 == '1'
(хотя 1
и '1'
— разные типы), но строгое 1 === '1'
оказывается false
!
Таким образом, вы сначала проверяете, строго ли guess
равно answer
. Так как их типы разные, это невозможно, так что вы идете дальше. Вы проверяете, находится ли guess
над ответом, затем вы проверяете, находится ли он под answer
, оба они также возвращают false
. Единственный оставшийся вариант — break
из цикла, и "winner"
никогда не будет напечатано.
Помимо этого, ваша самая большая проблема на самом деле логика. Размещение различных тестов и действий несколько сомнительно. Например, можно было бы ожидать, что проверка, равна ли guess
answer
, будет рядом с проверкой, чтобы увидеть, больше она или меньше. Тест на 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)
Попался Амадан. Спасибо за ваше время. Я пробовал это разными способами, намного ближе к тому, что вы предлагаете, но у меня по-прежнему были две проблемы, поэтому я продолжал пробовать разные идеи. Это была последняя, последняя попытка перед обращением за помощью.
Вы проверили tries === 0
перед tries--
, поэтому у вас осталось 0 догадок. Вы должны уменьшить перед проверкой.
Догадка на самом деле является строкой, а не числом, поэтому guess === answer
никогда не бывает правдой. Следующая итерация после того, как вы угадали правильно, попадает в else{break}
, а status
все еще играет. Вы либо хотите Number(guess) === answer
, либо просто guess == answer
.
По 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);
Вы проверили
tries === 0
передtries--
, поэтому получаете0 guesses left
.