Как по желанию любого из 2-х игроков выйти из цикла while () в игре "Угадай число" (js)
Игра на 2-х человек: комп рандомно загадывает число от 0 до 10. Игроки по очереди пытаются угадать загаданное число.
В моем варианте:
- выход из игры совершается только после 4-х нажатий клавиши ' q ' или ESC или Отмена (пока не отработается цикл while);
- если верный ответ дан с первого раза, то мой скрипт дает еще ввести числа оставшиеся 3 раза, чтоб игра окончательно завершилась (хотя идея такая: угадал число - игра закончилась).
var vopros = parseInt(Math.random() * 10);
var igrok1 = '№1';
var igrok2 = '№2';
let otvet1, otvet2;
function game(otvet, gamer) {
for (let i = 1; i <= 1; i++) {
var otvet = +prompt("Выход клавиша q. Угадай число от 0 до 10. Ход игрока : " + gamer);
if (otvet = "q" || otvet == 'esc' || otvet == null) {
break;
}
if (otvet == vopros) {
alert("Число угадал игрок " + gamer);
break;
} else if (otvet > vopros) {
alert("Чет-то много");
} else if (otvet < vopros) {
alert("Слишком мало");
}
} //for():end
} //function (): end
let n = 0
while (n < 4) {
//искусственно ограничил кол-во попыток, чтоб не было бесконечного цикла
game(otvet1, igrok1);
n++
game(otvet2, igrok2);
n++
} //while ( ): end
alert("Было загадано:" + vopros);
Мои попытки:
- применил цикл FOR в надежде применить выход из игры через break.
- применил WHILE с лимитом (n<4), чтоб не уходить в бесконечный цикл.
Сложность в том, что не знаю как сделать, чтоб:
- по желанию любого из игроков выйти из игры в любой момент: будь то по нажатию клавиши ' q ' или ESC или Отмена.
- в случае правильного ответа, игра должна сразу прекратиться.
Как можно упростить код для игры на 2 игрока; мои познания не позволяют перейти ту волшебную границу, чтоб раз - и код стал миниатюрным и быстрым.
Мой начальный вариант - до применения function () был такой:
var vopros = parseInt(Math.random() * 10);
var igrok1;
var igrok2;
while (true) {
var otvet1 = prompt("Выход клавиша q! Угадай число от 0 до 10. Ход игрока №1: ");
if (otvet1 == "q") {
break;
}
otvet1 = parseInt(otvet1); //иначе будет otvet1= Number, и не отработает выход q
if (otvet1 == vopros) {
alert("Число угадал игрок №1");
break;
} else if (otvet1 > vopros) {
alert("Чет-то много");
} else if (otvet1 < vopros) {
alert("Слишком мало");
}
var otvet2 = prompt("Выход клавиша q! Угадай число от 0 до 100. Ход игрока №2: ");
if (otvet2 == "q") {
break;
}
otvet2 = parseInt(otvet2); //иначе будет otvet2 = Number, и не отработает выход через q
if (otvet2 == vopros) {
alert("Число угадал игрок2");
break;
} else if (otvet2 > vopros) {
alert("Чет-то много");
} else if (otvet2 < vopros) {
alert("Слишком мало");
}
} //while ( ): end
alert("Было загадано:" + vopros);
Ответы (2 шт):
while (n < 4) {
//искусственно ограничил кол-во попыток, чтоб не было бесконечного цикла
game(otvet1, igrok1);
n++
game(otvet2, igrok2);
n++
}
Этот цикл вызывает обе функции по очереди, т.к. в функции game() еще и твой цикл for() в игре отсутствует поочередность у игроков, сначала идут все попытки у 1 игрока, а потом у 2 игрока.
По поводу выхода из игры при вводе в prompt буквы q, именно при вводе буквы, а не при нажатии на клавишу q, обработка событий клавиатуры это уже совсем другая история, и другая тема. А по поводу почему не выходит при вводе q, потому что указан +prompt + приводит все что ты напишешь в prompt к числу, а приведенная к числу строка дает NaN.
Открой в браузере этот файл(без бесконечного цикла) открой отладчик, поставь кучу точек остановки, и смотри что чему равно, так и только так нужно начинать дебажить. А вообще если что то не получается, то зачастую лучше вернутся к началу и переписать все заново.
var vopros = parseInt(Math.random() * 10);
var igrok1 = '№1';
var igrok2 = '№2';
let otvet1, otvet2;
function game(otvet, gamer) {
for (let i = 1; i <= 1; i++) {
var otvet = prompt("Выход клавиша q. Угадай число от 0 до 10. Ход игрока : " + gamer);
if (otvet == "q" || otvet == 'esc' || otvet == null) {
return false;
}
otvet = +otvet;
if (otvet == vopros) {
alert("Число угадал игрок " + gamer);
return false;
} else if (otvet > vopros) {
alert("Чет-то много");
} else if (otvet < vopros) {
alert("Слишком мало");
}
} //for():end
return true;
} //function (): end
let n = 0;
while (n < 4) {
//искусственно ограничил кол-во попыток, чтоб не было бесконечного цикла
n++
if (!game(otvet1, igrok1))
break;
n++
if (!game(otvet2, igrok2))
break;
} //while ( ): end
alert("Было загадано:" + vopros);