Реализация бота для угадывания числа
Стояла следующая задача:
Написать простой игровой бот, который умеет следующее:
предлагает пользователю ввести свой вариант отгадки;
если пользовательское число больше, чем загаданное, то бот выводит “Меньше!” и предлагает ввести новый вариант;
если пользовательское число меньше, чем загаданное, то бот выводит “Больше!” и предлагает ввести новый вариант;
если пользователь вводит правильное число, то бот выводит “Правильно!”;
если пользователь ввел не число, то выводит “Введи число!”;
если пользователь нажимает “Отмена”, то игра заканчивается.
Подсказка: пригодятся стандартные JS-функции: prompt, alert, Math.random и parseInt.
Я реализовал вот так:
min = Math.ceil(1);
max = Math.floor(50);
var number = Math.floor(Math.random() * (max - min)) + min
console.log(number);
function start() {
while (true) {
let userNumber = prompt('Enter the number');
console.log(typeof(parseInt(userNumber)));
if (isNaN(userNumber)) {
alert('Enter please number');
continue;
}
if (userNumber === null) {
alert('Bye bye :)');
break;
}
if (parseInt(userNumber) === number) {
alert('You win');
break;
} else if (parseInt(userNumber) > number) {
alert('Your number more');
} else if (parseInt(userNumber) < number) {
alert('Your number less');
}
}
}
start();
Вопрос: можно ли было это реализовать как-то проще? Без break и continue?
Ответы (1 шт):
- Саму логику проверок особо не укоротить, потому что всё равно нужно рассмотреть все варианты
- Вместо
continueможно использоватьelse, но это принципиально ничего не меняет - "
while (true)+break" лично я очень не люблю, но использование вместо этого "while+ флаг" опять-таки меняет что-то лишь на уровне субъективного восприятия
Так как логика рассмотрения всех вариантов схожа (проверка + текст + "продолжать/не продолжать"), то их можно описать в одном стиле заранее, а в цикле проверять их по очереди. Решение при этом проще не выглядит - просто немного другой подход:
min = Math.ceil(1);
max = Math.floor(50);
var number = Math.floor(Math.random() * (max - min)) + min
console.log(number);
const handlers = [
{ check: value => value === null, toContinue: false, text: "Bye bye :)" },
{ check: value => isNaN(parseInt(value)), toContinue: true, text: "Enter please number" },
{ check: value => parseInt(value) === number, toContinue: false, text: "You win" },
{ check: value => parseInt(value) > number, toContinue: true, text: "Your number more" },
{ check: value => parseInt(value) < number, toContinue: true, text: "Your number less" }
];
let isGuessing = true;
while (isGuessing) {
const value = prompt("Enter the number");
const matchedHandler = handlers.find(handler => handler.check(value));
isGuessing = matchedHandler.toContinue;
alert(matchedHandler.text);
}
Условие isNaN(value) заменил на isNaN(parseInt(value)), чтобы пустые строки, а также строки, состоящие из пробелов, тоже как-то обрабатывались: isNaN на них возвращает false