Выход из функции через confirm
Есть функция-игра "Угадай число", в ней за 10 попыток пользователь должен угадать рандомное число. Если угадал-alert выводит "Вы угадали!" В этом же случае должно появиться сообщение через confirm "Начать новую игру?". У меня получается так, что если пользователь нажимает "отмена", игра все равно продолжается. Как сделать, чтобы при нажатии на отмену игра заканчивалась?
let guessNumber = (function () {
let randomNum = parseInt(Math.random() * 1000);
console.log(randomNum);
let attempts = 9;
let userNum = prompt('Введите число. У Вас 10 попыток');
return function () {
if (userNum) {
if (isNaN(userNum)) {
alert('Можно вводить только числа');
userNum = +prompt('Введите число');
}
if (attempts === 0) {
alert('Попытки закончились');
return;
}
if (userNum == randomNum) {
alert('Верно, Вы угадали загаданное число!');
confirm('Начать новую игру?');
attempts = 9;
randomNum = parseInt(Math.random() * 1000);
userNum = +prompt('Введите число');
} else if (userNum < randomNum) {
alert('Ваше число меньше! Осталось попыток: ' + attempts);
userNum = +prompt('Введите число');
} else if (userNum > randomNum) {
alert('Ваше число больше! Осталось попыток: ' + attempts);
userNum = +prompt('Введите число');
}
attempts--;
guessNumber();
}
}
})();
Ответы (2 шт):
confirm() возвращает только true или false. Можно сразу его и отправить на проверку if. Если отменят, вернется false, а !false → true (восклицательный знак при необходимости приводит к логическому типу и переворачивает полученное значение)
test();
function test() {
if (!confirm('Начать новую игру?')) {
console.log("Игра завершена.");
return;
}
console.log("Игра продолжается!");
}
В контексте вашей функции это выглядит так:
if (userNum == randomNum) {
alert('Верно, Вы угадали загаданное число!');
if (!confirm('Начать новую игру?')) return;
attempts = 9;
randomNum = parseInt(Math.random() * 1000);
userNum = +prompt('Введите число');
return guessNumber();
}
В вопросе вы там забыли вызвать guessNumber();
Но получается, старт игры одинаково прописан и во время получения функции-замыкания, и после confirm. Тут вместо замыкания можно использовать отдельную функцию, запускающую игру. Псевдокод:
startGame();
function startGame(attempts = 9) {
let randNum = Math.random() * 1000 | 0;
guessNumber(attempts, randNum);
}
function guessNumber(attempts, randNum) {
// Вместо замыкания, числа прилетают в виде параметров.
let userNum = +prompt('Введите число');
// prompt, alert, ляляля
if (угадали) return confirm() ? startGame() : null; // см. → Тернарный Оператор
guessNumber(--attempts, randNum);
}
Синхронная функция "confirm" не только выведет сообщение на экран, но и результатом своей работы вернёт true или false в зависимости от того, что нажал пользователь (Ок или Отмена) Так что Вам необходимо получать результат работы функции и обрабатывать его
const answer = confirm('Ок или Отмена?');
if(answer === true) console.log('Нажали Окей')
else console.log('Нажали отмена')
Ссылка на документацию по функции: https://www.w3schools.com/jsref/met_win_confirm.asp
Так же мой вариант исполнения. Но с рекурсией:
//"Правильная" функция рандомного числа от min до max
const randomInteger = (min, max) => Math.round(min - 0.5 + Math.random() * (max - min + 1));
const minNumber = 1, maxNumber = 1000;
const guessNumber = (attempts = 10, randomNum = randomInteger(minNumber, maxNumber)) => {
if (attempts === 0) {
alert('Попытки закончились');
return;
}
console.log(`Загаданное число: ${randomNum}`);
const userNum = Number(prompt(`Введите число от ${minNumber} до ${maxNumber}. У Вас ${attempts} попыток`));
if (userNum < 0 || userNum > maxNumber || userNum < minNumber) {
alert(`Можно вводить только положительные числа от ${minNumber} до ${maxNumber}`);
return guessNumber(attempts, randomNum);
}
if (userNum === randomNum) {
alert('Верно, Вы угадали загаданное число!');
if(confirm('Начать новую игру?')) {
return guessNumber();
}
} else {
alert(`Ваше число ${(userNum < randomNum ? 'меньше' : 'больше')}! Осталось попыток: ${attempts -1}`);
return guessNumber(--attempts, randomNum);
}
}
guessNumber();