Виселица 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
Что такое двойные вопросительные знаки (??) в JavaScript?
Что такое двойные вопросительные знаки (??) в JavaScript?
Как безопасно обрабатывать неопределенные и нулевые значения в коде с помощью Nullish Coalescing
Асинхронная передача данных с помощью sendBeacon в JavaScript
Асинхронная передача данных с помощью sendBeacon в JavaScript
В современных веб-приложениях отправка данных из JavaScript на стороне клиента на сервер является распространенной задачей. Одним из популярных...
Принципы ООП в JavaScript
Принципы ООП в JavaScript
Парадигма объектно-ориентированного программирования имеет 4 основных принципа,
Laravel с Turbo JS
Laravel с Turbo JS
Turbo - это библиотека JavaScript для упрощения создания быстрых и высокоинтерактивных веб-приложений. Она работает с помощью техники под названием...
Слишком много useState? Давайте useReducer!
Слишком много useState? Давайте useReducer!
Современный фронтенд похож на старую добрую веб-разработку, но с одной загвоздкой: страница в браузере так же сложна, как и бэкенд.
Типы данных JavaScript
Типы данных JavaScript
В JavaScript существует несколько типов данных, включая примитивные типы данных и ссылочные типы данных. Вот краткое объяснение различных типов данных...
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>

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