Как я могу заменить букву-заполнитель на букву, если она была правильно угадана?

Каждый раз, когда я использую этот код, он говорит, что я угадал не ту букву. Мне нужно, чтобы он мог заменить угаданную букву знаком подчеркивания, если он есть в слове.

function guess(){
  for (var j = 0; j < words.length; j++) {
    if (words[j] === userGuesses) {
      underScores[j] = userGuesses
      randomWord--
    } else {
      return 'wrong letter'
    }
  }
}

Вот мой полный код, или, по крайней мере, то, что у меня есть до сих пор. Мне нужно, чтобы буквы тоже остались, и мне нужно выяснить, как заставить их проигрывать игру, а затем отображать слово после 3 неправильных догадок, не получая слова.

console.log('HANGMAN\nTry to solve the puzzle by guessing letters using guess(letter).\nIf you miss a letter you get a strike.\nGet 3 strikes and you lose the game.\nTo select difficulty, type difficulty(difficulty).\nDifficulties:\nEasy\nMedium\nHard\nExtreme\nTo start game type start().')

const easyWords = [
  'DOG',
  'CAT',
  'HELLO',
  'FISH',
  'RED',
  'FOOD'
]

const mediumWords = [
  'I LIKE THE COLOR PINK',
  'MY FISHES NAME IS BEN',
  'THE GREATEST SHOWMAN IS THE BEST MOVIE',
  'OK GOOGLE HOW TO PASS IMD',
  'I WORK AT LANDMARK CINEMAS',
  'LEGO BATMAN IS THE ONLY GOOD BATMAN MOVIE'
]

const hardWords = [
  'THIS IS AN EXAMPLE OF A HARDER PHRASE THIS PROJECT IS SO HARD',
  'IVE BEEN STARING AT THIS PROJECT FOR 4 HOURS TODAY I DONT KNOW IF I CAN DO THIS ANYMORE',
  'I REALLY MISS MY DOG HER NAME IS CASSY AND SHES A SHIH TZU AND BARKS A LOT',
  'MY FAVOURITE SONG IS CALLED MASTERPIECE THEATRE PART 3 BY MARIANAS TRENCH',
  'I BOUGHT THE HEDLEY TICKETS 5 MONTHS BEFORE THE ALLEGATIONS CAME OUT',
  'CAN SOMEONE PLEASE HELP ME WITH THIS PROJECT OH  MY GOD'
]

const extremeWords = [
  'LOREM IPSUM DOLOR SIT AMET, CONSECTETUR ADIPISCING ELIT, SED DO EIUSMOD TEMPOR INCIDIDUNT UT LABORE ET DOLORE MAGNA ALIQUA. UT ENIM AD MINIM VENIAM, QUIS NOSTRUD EXERCITATION ULLAMCO LABORIS NISI UT ALIQUIP EX EA COMMODO CONSEQUAT. DUIS AUTE IRURE DOLOR IN REPREHENDERIT IN VOLUPTATE VELIT ESSE CILLUM DOLORE EU FUGIAT NULLA PARIATUR. EXCEPTEUR SINT OCCAECAT CUPIDATAT NON PROIDENT, SUNT IN CULPA QUI OFFICIA DESERUNT MOLLIT ANIM ID EST LABORUM',
  'According to all known laws of aviation, there is no way a bee should be able to fly. Its wings are too small to get its fat little body off the ground. The bee, of course, flies anyway because bees don`t care what humans think is impossible. Yellow, black. Yellow, black. Yellow, black. Yellow, black.'
]

const words = [
  'DOG',
  'CAT',
  'HELLO',
  'FISH',
  'RED',
  'FOOD',
  'I LIKE THE COLOR PINK',
  'MY FISHES NAME IS BEN',
  'THE GREATEST SHOWMAN IS THE BEST MOVIE',
  'OK GOOGLE HOW TO PASS IMD',
  'I WORK AT LANDMARK CINEMAS',
  'LEGO BATMAN IS THE ONLY GOOD BATMAN MOVIE',
  'THIS IS AN EXAMPLE OF A HARDER PHRASE THIS PROJECT IS SO HARD',
  'IVE BEEN STARING AT THIS PROJECT FOR 4 HOURS TODAY I DONT KNOW IF I CAN DO THIS ANYMORE',
  'I REALLY MISS MY DOG HER NAME IS CASSY AND SHES A SHIH TZU AND BARKS A LOT',
  'MY FAVOURITE SONG IS CALLED MASTERPIECE THEATRE PART 3 BY MARIANAS TRENCH',
  'I BOUGHT THE HEDLEY TICKETS 5 MONTHS BEFORE THE ALLEGATIONS CAME OUT',
  'CAN SOMEONE PLEASE HELP ME WITH THIS PROJECT OH  MY GOD',
  'LOREM IPSUM DOLOR SIT AMET, CONSECTETUR ADIPISCING ELIT, SED DO EIUSMOD TEMPOR INCIDIDUNT UT LABORE ET DOLORE MAGNA ALIQUA. UT ENIM AD MINIM VENIAM, QUIS NOSTRUD EXERCITATION ULLAMCO LABORIS NISI UT ALIQUIP EX EA COMMODO CONSEQUAT. DUIS AUTE IRURE DOLOR IN REPREHENDERIT IN VOLUPTATE VELIT ESSE CILLUM DOLORE EU FUGIAT NULLA PARIATUR. EXCEPTEUR SINT OCCAECAT CUPIDATAT NON PROIDENT, SUNT IN CULPA QUI OFFICIA DESERUNT MOLLIT ANIM ID EST LABORUM',
  'ACCORDING TO ALL KNOWN LAWS OF AVIATION, THERE IS NO WAY A BEE SHOULD BE ABLE TO FLY. ITS WINGS ARE TOO SMALL TO GET ITS FAT LITTLE BODY OFF THE GROUND. THE BEE, OF COURSE, FLIES ANYWAY BECAUSE BEES DON`T CARE WHAT HUMANS THINK IS IMPOSSIBLE. YELLOW, BLACK. YELLOW, BLACK. YELLOW, BLACK. YELLOW, BLACK.'
]

var randomWord = []
const underScores = []
const remainingLetters = words.length
const wrongLetter = []
const wrongGuessesLeft = 3
const userGuesses = []
const letter = []

function start(){
  return('Select difficulty by typing [difficulty](), else if type play() to randomize.')
}

function easy(){
  randomWord = easyWords[Math.floor(Math.random() * easyWords.length)]
  for (var i = 0; i < randomWord.length; i++) {
    underScores[i] = '_'
  }
  return(underScores)
}

function medium(){
  randomWord = mediumWords[Math.floor(Math.random() * mediumWords.length)]
  for (var i = 0; i < randomWord.length; i++) {
    underScores[i] = '_'
  }
  return(underScores)
}

function hard(){
  randomWord = hardWords[Math.floor(Math.random() * hardWords.length)]
  for (var i = 0; i < randomWord.length; i++) {
    underScores[i] = '_'
  }
  return(underScores)
}

function extreme(){
  randomWord = extremeWords[Math.floor(Math.random() * extremeWords.length)]
  for (var i = 0; i < randomWord.length; i++) {
    underScores[i] = '_'
  }
  return(underScores)
}

function play(){
  randomWord = words[Math.floor(Math.random() * words.length)]
  for (var i = 0; i < randomWord.length; i++) {
    underScores[i] = '_'
  }
  return(underScores)
}

function guess(){
  for (var j = 0; j < words.length; j++) {
    if (words[j] === userGuesses) {
      underScores[j] = userGuesses
      randomWord--
    } else {
      return 'wrong letter'
    }
  }
}

person Morgan    schedule 02.03.2018    source источник
comment
Установите точки останова в функции guess и проверьте, какие значения находятся в userGuesses и words[j].   -  person Sven Writes Code    schedule 02.03.2018


Ответы (1)


Решение регулярного выражения может выглядеть так:

  • когда пользователь угадывает букву, вы можете push попасть в массив userGuesses.
  • создайте регулярное выражение, которое будет искать любые буквы, не входящие в массив: [^ABC ] будет соответствовать символам отличным, кроме A, B, C и пробела.
  • replace все совпадения со знаком подчеркивания

var str = "IVE BEEN STARING AT THIS PROJECT FOR 4 HOURS TODAY I DONT KNOW IF I CAN DO THIS ANYMORE";
var userGuesses = ['A', 'B', 'C', ' '];

var regex = new RegExp('[^' + userGuesses.join("") + ']', 'g');

document.body.innerHTML = str.replace(regex, '_');

Циклический подход (который выглядел так, как будто вы шли к нему) может выглядеть примерно так:

  • когда пользователь угадывает букву, вы можете push попасть в массив userGuesses.
  • loop through the actual answer string
    • if the character is included in the userGuesses array, put that character in the finalString
    • иначе поставить подчеркивание

var str = "IVE BEEN STARING AT THIS PROJECT FOR 4 HOURS TODAY I DONT KNOW IF I CAN DO THIS ANYMORE";
var userGuesses = ['A', 'B', 'C', ' '];
var finalString = "";

for (var i = 0; i < str.length; i++) {
  if (userGuesses.includes(str[i])) {
    finalString += str[i];
  } else {
    finalString += "_";
  }
}

document.body.innerHTML = finalString;

person Sven Writes Code    schedule 02.03.2018