Я разрабатываю текстовую игру палача на JavaScript. Я извиняюсь, если мой код избыточен и переработан. Я только учусь кодировать. Я ценю всех, кто может внести свой вклад в то, почему моя игра не работает полностью.
Моя конечная игра, если операторы вообще не работают. Если я правильно угадываю букву, это говорит мне, что я выиграл игру. Если я угадаю букву неправильно, это никогда не вычитает жизнь. Я не могу понять, где я ошибаюсь. Все операторы if имеют смысл, но я думаю, может быть, я неправильно их соединил?
У меня есть большой массив случайных слов разной длины
Я беру случайное слово «randomWord» с помощью math.random
Я инициализирую пустой массив 'randomWordArray' и запускаю цикл for, вставляя "_" в массив для каждой буквы слова, чтобы я мог отобразить слово, чтобы они могли угадать... пример: " _ _ _ _ _"
У меня есть 4 логических утверждения в моей функции guessLetter().
Чтобы проверить, является ли угаданная буква частью слова, и если да, замените «_» в индексе массива на правильную букву.
Чтобы проверить, не является ли это частью слова, и если не вычесть жизнь (это никогда не выполняется по какой-то странной причине, и игрок получает неограниченное количество жизней...)
Проверьте, не выбыли ли они из жизней (никогда не становится правдой, потому что жизни никогда не вычитаются)
Проверьте, не содержит ли randomWordArray символ "_", означающий, что слово угадано, игра выиграна и должна закончиться. (Это тоже не работает, и если игрок правильно угадывает букву, игра сообщает ему, что он выиграл, даже если это его первая буква.)
Я открыт для ЛЮБЫХ и ВСЕХ предложений, даже если они не связаны с моими основными проблемами, если вы видите, что я делаю что-то избыточно или если есть более эффективный способ сделать что-то, пожалуйста, дайте мне знать. Большое спасибо за ваше время.
//Random array of words
const words = [
//4 letter words
"maze", "pate", "swig", "yawn", "belt",
//5 letter words
"blush", "dwarf", "fable", "haste", "jumbo", "knave", "liver", "moose", "pilot", "quill", "smile", "thief",
//6 letter words
"affect", "bronze", "cursor", "dancer", "fossil", "fungus", "glassy", "glitch", "kitten", "lotion","anemone",
//7 letter words
"bouncing", "carpeted", "clustery", "flavored", "grapple", "lunging", "pompous",
//8 letter words
"abstract", "barbecue", "coffee", "clotting", "flounder", "hopping", "loudest", "pending"];
var randomWord = words[Math.floor(Math.random() * words.length)];
var randomWordArray =[];
var lives = 5;
for(i=0;i<randomWord.length;i++) {
randomWordArray.push(" _ ");
}
function guessLetter(randomWord, randomWordArray, lives) {
let guess = window.prompt(randomWordArray+" Lives:"+lives);
if (!guess) return; // prompt shortcut
if (guess == "end") {
window.alert("Game over");
return;
}
//check if letter is in word
for (i=0; i<randomWord.length; i++) {
if (guess == randomWord[i]) {
randomWordArray.splice(i, 1, randomWord[i]);
}
}
//check if letter isnt in word
if (randomWordArray.indexOf(guess) == -1) {
lives--;
}
//check if game should end because lives are out
if (lives==0) {
window.alert("Congrats the game is over!");
return;
}
if (randomWord.indexOf("_") == -1) {
window.alert(randomWord);
window.alert("Congrats! You've solved the word!!");
return;
}
if (lives > 0) {
guessLetter(randomWord, randomWordArray,lives);
}
}
// don't start until explicitly asked to
start.addEventListener(`click`, () => guessLetter(randomWord, randomWordArray,lives));
<button id = "start">Start</button>
Не решение вашей проблемы. Но вы можете использовать этот фрагмент, чтобы обновить свою логику wrong letter not deducting a life
let lives = 2;
let myRandomWord = 'testing';
const guessWord = (wordToGuess, myWord, lives) => {
if (wordToGuess.includes(myWord)){
console.info('Its in the word so do something with your game logic here')
}
if (!wordToGuess.includes(myWord)){
lives = lives - 1;
console.info('you lost a live');
}
console.info('current live count ', lives)
}
guessWord(myRandomWord, 'a', lives)
Я предполагаю, что вместо
if (randomWord.indexOf("_") == -1) {
Вы хотите
randomWordArray.indexOf(" _ ") == -1
P.S. также, пожалуйста, используйте let i в циклах for, иначе вы создадите глобальную переменную i, которая может пойти не так и будет очень раздражать при отладке.
P.P.S. Добавление фрагмента по просьбе Майкла.
//Random array of words
const words = [
//4 letter words
"maze", "pate", "swig", "yawn", "belt",
//5 letter words
"blush", "dwarf", "fable", "haste", "jumbo", "knave", "liver", "moose", "pilot", "quill", "smile", "thief",
//6 letter words
"affect", "bronze", "cursor", "dancer", "fossil", "fungus", "glassy", "glitch", "kitten", "lotion","anemone",
//7 letter words
"bouncing", "carpeted", "clustery", "flavored", "grapple", "lunging", "pompous",
//8 letter words
"abstract", "barbecue", "coffee", "clotting", "flounder", "hopping", "loudest", "pending"];
var randomWord = words[Math.floor(Math.random() * words.length)];
var randomWordArray =[];
var lives = 5;
for(let i=0;i<randomWord.length;i++) {
randomWordArray.push(" _ ");
}
function guessLetter(randomWord, randomWordArray, lives) {
let guess = window.prompt(randomWordArray+" Lives:"+lives);
if (!guess) return; // prompt shortcut
if (guess == "end") {
window.alert("Game over");
return;
}
//check if letter is in word
for (let i=0; i<randomWord.length; i++) {
if (guess == randomWord[i]) {
randomWordArray.splice(i, 1, randomWord[i]);
}
}
//check if letter isnt in word
if (randomWordArray.indexOf(guess) == -1) {
lives--;
}
//check if game should end because lives are out
if (lives==0) {
window.alert("Congrats the game is over!");
return;
}
if (randomWordArray.indexOf(" _ ") == -1) {
window.alert(randomWord);
window.alert("Congrats! You've solved the word!!");
return;
}
if (lives > 0) {
guessLetter(randomWord, randomWordArray,lives);
}
}
// don't start until explicitly asked to
start.addEventListener(`click`, () => guessLetter(randomWord, randomWordArray,lives));
<button id = "start">Start</button>
Я превратил ваш код в исполняемый фрагмент, но даже так: начинайте отлаживать, почти наверняка слишком рано спрашивать, и первая задача — сформировать минимально воспроизводимый пример. Для целей вопроса вам просто нужно одно слово, состоящее не более чем из двух букв (не гигантский набор слов) и никакого случайного поведения: просто используйте это одно слово. Кроме того, никогда не используйте код с бесконечным циклом ввода: я обновил его, чтобы люди могли отменить его, потому что у них не хватит терпения иметь дело с кодом, который работает вечно и из которого вы не можете выйти.