javascript палач, проблема при угадывании слова - PullRequest
0 голосов
/ 05 августа 2020
  1. Привет, я делаю проект по палачу, используя только javascript, и я новичок. Я хочу сделать игру с палачом, в настоящее время у меня возникают проблемы, когда я угадываю слово, как когда пользователь угадывает алфавит. Он должен go в последовательности, например, слово для угадывания - это «кошка», в настоящее время игра делает так, что пользователь должен угадать «c» в качестве первого предположения, затем «а» в качестве второго предположения, затем t "в качестве третьего.

Я хотел бы сделать так, чтобы пользователь мог угадывать любой алфавит, не будучи последовательным. Слова взяты из файла csv


var readline = require("readline-sync");

class Word {
    constructor(word, definition){
        this.word = word
        this.definition = definition
    }
}

class WordCollection {
    constructor(pool, words){
        this.pool = [];
        this.readFile();
    }
    readFile() {
        const filePath = 'C:/FoP';
        const filename = filePath + '/input.csv';
        const fs = require('fs');



        try {
            const text =fs.readFileSync(filename, "UTF-8");

            const textByLine = text.split('\r\n');
            var wordline;

            for (var i = 0 ; (i < textByLine.length) ; i++) {
                wordline = textByLine[i].split(',');
                this.pool.push(new Word(wordline[0],wordline[1]));
            }
        } catch(err) {;
            console.log('file ' + " " + filename + " " + 'not found. Program terminated');
            process.exit();
        }        
    }
}
console.clear();

 
var numofwrong = 0;
var lettersremain;
var totallife = 9;
var lifelost = 0;
var answerArray=[];
var guess;


console.log("\n" + "-= Welcome to HangMan =-")
var namein = readline.question("\n" + "Please Enter Your Name :")

//Grab a random word from the array of words
var game = new WordCollection();
var wordrandom = game.pool[Math.floor(Math.random() * game.pool.length)];
var lastchosenword = wordrandom.word;
//console.log(wordrandom);

//Change letters into lowercase 
 var outputchosenword = wordrandom.word.toLowerCase();
 console.log(outputchosenword)
 
// Convert the word to " _ "
var outputunderlineword = new Array(outputchosenword.length);
var checkoutputunderline = new Array();
for (i = 0; i < outputunderlineword.length; i++) {
    outputunderlineword[i] = "_";
} console.log(outputunderlineword.join(" "))

//Display the Alphabets
var Alphabet = ['\nA', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
        'I', 'J', 'K', 'L', 'M','\nN', 'O', 'P', 'Q', 'R', 'S',
        'T', 'U', 'V', 'W', 'X', 'Y', 'Z'];
console.log(Alphabet.join(' '))


 
var correctans=[];
for (var i = 0; i < outputunderlineword.length; i++) {
    Enter = readline.question(namein + "'s guess (Enter 9 for lifelines or 0 to pass): ")
    if (Enter == outputchosenword[i] || Enter.match(/[^a-zA-Z]/g)) {
        console.log("Good Job! " + Enter + " is one of the letters")
        correctans.push(Enter)
        console.log(correctans)
    } 
    else if (Enter !== outputchosenword[i] ) {
        console.log("Sorry. " + Enter + " is not a part of the word.")
    }
}
вывод при угадывании буквы (летучая мышь - слово, которое нужно угадать)
-= Welcome to HangMan =-

Please Enter Your Name :hi
bat
_ _ _

A B C D E F G H I J K L M
N O P Q R S T U V W X Y Z
hi's guess (Enter 9 for lifelines or 0 to pass): b
Good Job! b is one of the letters
[ 'b' ]
hi's guess (Enter 9 for lifelines or 0 to pass): t
Sorry. t is not a part of the word.
hi's guess (Enter 9 for lifelines or 0 to pass): a
Sorry. a is not a part of the word.
вывод, когда алфавит в порядке
-= Welcome to HangMan =-

Please Enter Your Name :hi
bat
_ _ _

A B C D E F G H I J K L M
N O P Q R S T U V W X Y Z
hi's guess (Enter 9 for lifelines or 0 to pass): b
Good Job! b is one of the letters
[ 'b' ]
hi's guess (Enter 9 for lifelines or 0 to pass): a
Good Job! a is one of the letters
[ 'b', 'a' ]
hi's guess (Enter 9 for lifelines or 0 to pass): t
Good Job! t is one of the letters        
[ 'b', 'a', 't' ]
Пробовал вот так, но выдает ошибку
var correctans=[];
while (outputchosenword[i] !== Enter || (lifelost = 9)) {
    Enter = readline.question(namein + "'s guess (Enter 9 for lifelines or 0 to pass): ")
    if ((outputchosenword.includes(Enter) || Enter.match(/[^a-zA-Z]/g))) { 
        console.log("Good Job! " + Enter + " is one of the letters")
        correctans.push(Enter)
        console.log(correctans)
    } else {
        console.log("Sorry. " + Enter + " is not a part of the word.")
    }
} 
while (outputchosenword[i] !== Enter || (lifelost = 9)) {
                               ^

ReferenceError: Enter is not defined
После попытки советов :) Это все, что пришло, я не уверен, что мне делать после этого. Типа застрял: \
while (lifelost <= totallife && !isEntireWordFound) {
    function guessLetter(wordguess, enter){
   if(wordguess.includes(enter)){
      var regex = new RegExp(enter,"g");
      return wordguess.replace(regex,"");
   }
   return wordguess;
}

wordguess = guessLetter(wordguess,enter);
console.log("after guessing 'h' word = ",wordguess);

    var enter = readline.question(namein + "'s guess (Enter 9 for lifelines or 0 to pass): ")
    if (outputchosenword.includes(enter)) { 
        console.log("Good Job! " + enter + " is one of the letters");
        correctans.push(enter);
        console.log(correctans);
    } 
     
    else {
        console.log("Sorry. " + enter + " is not a part of the word.");
        lifelost++;
    }
} 

1 Ответ

1 голос
/ 05 августа 2020

Ваш призыв к пользователю ввести букву находится в пределах l oop букв слова, вам нужно отделить это. В псевдокоде

while user has not correctly guessed word or run out of lives
   get user guess
   if users guess matches any letter in the word
        do something
   else
        do something else

Не имея возможности (легко) протестировать этот код, вы, вероятно, захотите что-то вроде ниже

var correctans=[];
var lifelost = 0
var totalLife = 9;
var isEntireWordFound = false; // set this to true somewhere!!

while (lifelost <= totallife && !isEntireWordFound) {
    var enter = readline.question(namein + "'s guess (Enter 9 for lifelines or 0 to pass): ")
    if (outputchosenword.includes(enter)) { 
        console.log("Good Job! " + enter + " is one of the letters");
        correctans.push(enter);
        console.log(correctans);
    } else {
        console.log("Sorry. " + enter + " is not a part of the word.");
        lifelost++;
    }
} 

Это, конечно, не хватает той части, где вы видите, что они правильно угадали все слово и вашу часть о «пасе» или «спасательном круге» - но, надеюсь, это поможет вам двигаться в правильном направлении. Обратите внимание, как этот код почти точно соответствует псевдокоду выше !!

Давайте посмотрим, как вы можете определить, угадал ли пользователь слово. Не так просто, как может показаться на первый взгляд из-за повторяющихся букв - ie, вы не можете просто посчитать, что количество угаданных букв равно длине слова!

Один простой способ - удалить все вхождения угадываемая буква из слова, и когда длина этого слова становится равной нулю, угадывается все слово

var word = "hello";

function guessLetter(word, chr){
   if(word.includes(chr)){
      var regex = new RegExp(chr,"g");
      return word.replace(regex,"");
   }
   return word;
}

word = guessLetter(word,"h");
console.log("after guessing 'h' word = ",word);
word = guessLetter(word,"l");
console.log("after guessing 'l' word = ",word);
word = guessLetter(word,"o");
console.log("after guessing 'o' word = ",word);
word = guessLetter(word,"e");
console.log("after guessing 'e' word = ",word);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...