Виселица Javascript, логика окончания игры не работает должным образом

Я разрабатываю текстовую игру палача на JavaScript. Я извиняюсь, если мой код избыточен и переработан. Я только учусь кодировать. Я ценю всех, кто может внести свой вклад в то, почему моя игра не работает полностью.

Моя конечная игра, если операторы вообще не работают. Если я правильно угадываю букву, это говорит мне, что я выиграл игру. Если я угадаю букву неправильно, это никогда не вычитает жизнь. Я не могу понять, где я ошибаюсь. Все операторы if имеют смысл, но я думаю, может быть, я неправильно их соединил?

У меня есть большой массив случайных слов разной длины

Я беру случайное слово «randomWord» с помощью math.random

Я инициализирую пустой массив 'randomWordArray' и запускаю цикл for, вставляя "_" в массив для каждой буквы слова, чтобы я мог отобразить слово, чтобы они могли угадать... пример: " _ _ _ _ _"

У меня есть 4 логических утверждения в моей функции guessLetter().

  1. Чтобы проверить, является ли угаданная буква частью слова, и если да, замените «_» в индексе массива на правильную букву.

  2. Чтобы проверить, не является ли это частью слова, и если не вычесть жизнь (это никогда не выполняется по какой-то странной причине, и игрок получает неограниченное количество жизней...)

  3. Проверьте, не выбыли ли они из жизней (никогда не становится правдой, потому что жизни никогда не вычитаются)

  4. Проверьте, не содержит ли 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>

Я превратил ваш код в исполняемый фрагмент, но даже так: начинайте отлаживать, почти наверняка слишком рано спрашивать, и первая задача — сформировать минимально воспроизводимый пример. Для целей вопроса вам просто нужно одно слово, состоящее не более чем из двух букв (не гигантский набор слов) и никакого случайного поведения: просто используйте это одно слово. Кроме того, никогда не используйте код с бесконечным циклом ввода: я обновил его, чтобы люди могли отменить его, потому что у них не хватит терпения иметь дело с кодом, который работает вечно и из которого вы не можете выйти.

Mike 'Pomax' Kamermans 11.01.2023 03:31
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
1
52
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Не решение вашей проблемы. Но вы можете использовать этот фрагмент, чтобы обновить свою логику 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>

Другие вопросы по теме