Выход из функции через 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 шт):

Автор решения: OPTIMUS PRIME

confirm() возвращает только true или false. Можно сразу его и отправить на проверку if. Если отменят, вернется false, а !falsetrue (восклицательный знак при необходимости приводит к логическому типу и переворачивает полученное значение)

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);
}
→ Ссылка
Автор решения: c_k_rim

Синхронная функция "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();
→ Ссылка