【问题标题】:How can i replace an array element multiple times?如何多次替换数组元素?
【发布时间】:2018-11-18 20:18:32
【问题描述】:
console.log("Start file 1 =========================================");
function Letter (letter) {

    this.letter = letter;
    this.guess = false;
    this.answer = function () {
        if (!this.guess) {
            return "_";
        }
        else if (this.guess === true) {
            return this.letter;
        }
    }
    this.letterTest = function (guessed) {
        if (guessed === this.letter) {
            this.guess = true;
            // this.letter = guessed;
        } else {
            this.letter = "_";
        }
    }
};

module.exports = Letter;
console.log("End file 1 =========================================");


console.log("Start file 2 =========================================");
var Letter = require("./letter.js");

function Word (word) { 

    this.splitWord = [];
    for (var i = 0; i < word.length; i++) { 
        var eachLetter = new Letter (word[i]);
        this.splitWord.push(eachLetter);
    }

    this.stringRep = function () {
        var testedWord = [];
        for (var i = 0; i < this.splitWord.length; i++) {
            testedWord.push(eachLetter.answer());
        }

        testedWord = testedWord.join(" ");

        // console.log(testedWord);
        return testedWord;

};

    this.eachGuess = function (input) {
        for (var i = 0; i < this.splitWord.length; i++) {

            this.splitWord[i].letterTest(input);
        }
        }    
}

module.exports = Word;
console.log("End file 2 =========================================");


console.log("Start file 3 =========================================");
var Word = require("./word.js");
var inquirer = require('inquirer');

var remainingGuesses = 10;
var mainGame;
var currentWord;
var liveWord = [];
completeWord = null;
let countryPicker;
let testedWord;

var europe = ["Albania", "Austria", "Belgium", "Bulgaria", "Croatia", "Cyprus", "Denmark", "England", "France", "Greece", "Germany",
"Hungary", "Iceland", "Italy", "Lithuania", "Monaco", "Norway", "Poland", "Portugal", "Romania", "Serbia", "Slovakia", "Spain", "Sweden",
"Switzerland", "Ukraine"];

// Function that picks a random country
function pickCountry () {
    countryPicker = europe[Math.floor((Math.random() * europe.length) + 1)];
    var mainGame2 = new Word (countryPicker);
    mainGame = mainGame2;
    // Display word

    currentWord = mainGame.stringRep();
    currentWord = JSON.stringify(currentWord);
    console.log("Word: " + currentWord);
};

pickCountry();
// Delete this after
console.log("1: " + countryPicker);
console.log("2: " + currentWord);

inquirer.prompt([
    {
        type: "input",
        name: "game",
        message: "Guess a letter!"
    }
]).then(function(inquirerResponse) {
        liveWord = mainGame.splitWord;
        mainGame.eachGuess(inquirerResponse.game);

    for (let i = 0; i < liveWord.length; i++) {

        console.log(mainGame.splitWord[i].letter);

    }
});

我使用构造函数构建了一个刽子手游戏。 I have set it up so when a random word is chosen, each letter will be displayed as an underscore.
我使用inquirer包来索要一封信。当第一个字母被正确猜到时,它成功地将下划线替换为 liveWord 数组中的字母。问题是,它只适用于一个字母。我需要让它工作,直到猜出完整的单词。仅供参考,文件 1 和 2 仅供参考,我的问题仅在文件 3 中。无需查看前 2。有任何提示吗?

【问题讨论】:

    标签: javascript node.js npm inquirer


    【解决方案1】:

    您的代码中有几个问题:

    1. letterTest 方法中,当猜测与字母不同时,您将letter 属性设置为下划线。这是错误的,因为那样你就再也不会知道正确的字母是什么了。删除这个。为 guess 属性设置正确的值就足够了

    2. stringRep 方法中,您在循环中引用变量eachLetter,这与循环无关。相反,您应该使用this.splitWord[i]

    3. 没有允许用户进行第二次猜测的循环,所以它只工作一次是正常的。需要有一个循环来减小变量 remainingGuesses 的值,而您目前还没有使用它。

    4. 您不应显示splitWord。这与第 1 点有关。相反,您应该显示 stringRep(),这会考虑到字母是否已经根据 guessed 属性被猜到。这正是您需要输出的内容。

    5. 缺少检测单词是否完全找到的逻辑。在这种情况下,一条消息将是合适的,并且应该中断猜测周期(未实现)。

    为了方便循环,我建议使用async/await 语法来处理inquirer 返回的promise。

    这是您的代码,上面列出的点已更正。为了使它在这个 sn-p 小部件中可运行,我没有像您那样将它拆分为模块,也没有包含inquirer(我在内联对其进行了简化替换)。

    我也没有尝试进行许多其他改进,以便您仍然可以识别自己的工作。所有更改均已注释:

    function Letter (letter) {
        this.letter = letter;
        this.guess = false;
        this.answer = function () {
            if (!this.guess) {
                return "_";
            }
            else { // No need to check whether this.guess is true here. It is the logical consequence...
                return this.letter;
            }
        }
        this.letterTest = function (guessed) {
            if (guessed === this.letter) {
                this.guess = true;
            }
            // Don't change this.letter, as you will forever forget what the correct letter is!
            // (code was deleted from here)
        }
    }
    
    function Word (word) { 
        this.splitWord = [];
        for (var i = 0; i < word.length; i++) { 
            var eachLetter = new Letter (word[i]);
            this.splitWord.push(eachLetter);
        }
        this.stringRep = function () {
            var testedWord = [];
            for (var i = 0; i < this.splitWord.length; i++) {
                // Don't push eachLetter, but use the i-variable as index! 
                testedWord.push(this.splitWord[i].answer());
            }
            testedWord = testedWord.join(" ");
            return testedWord;
        }
    
        this.eachGuess = function (input) {
            for (var i = 0; i < this.splitWord.length; i++) {
                this.splitWord[i].letterTest(input);
            }
        }    
    }
    
    // Simplified implementation of inquirer for this snippet only:
    var inquirer = {
        prompt([{type, name, message}]) {
            return new Promise((resolve) => {
                const input = document.querySelector(`[name=${name}]`);
                input.value = "";
                input.placeholder = message;
                input.onchange = e => resolve({ [name]: input.value });
            });
        }
    }
    
    var remainingGuesses = 10;
    var mainGame;
    var currentWord;
    var liveWord = [];
    completeWord = null;
    let countryPicker;
    let testedWord;
    
    var europe = ["Albania", "Austria", "Belgium", "Bulgaria", "Croatia", "Cyprus", "Denmark", "England", "France", "Greece", "Germany",
    "Hungary", "Iceland", "Italy", "Lithuania", "Monaco", "Norway", "Poland", "Portugal", "Romania", "Serbia", "Slovakia", "Spain", "Sweden",
    "Switzerland", "Ukraine"];
    
    function pickCountry () {
        countryPicker = europe[Math.floor((Math.random() * europe.length) + 1)];
        var mainGame2 = new Word (countryPicker);
        mainGame = mainGame2;
        currentWord = mainGame.stringRep();
        currentWord = JSON.stringify(currentWord);
        console.log("Word: " + currentWord);
    }
    
    pickCountry();
    // Delete this after
    console.log("1: " + countryPicker);
    console.log("2: " + currentWord);
    
    (async function () { // Use an async function to allow the use of AWAIT
        while (remainingGuesses--) { // You need a loop to repeat guess/response cycle
            // Use AWAIT -- simpler to use than THEN
            const inquirerResponse = await inquirer.prompt([{
                type: "input",
                name: "game",
                message: "Guess a letter!"
            }]);
            const liveWord = mainGame.splitWord;
            mainGame.eachGuess(inquirerResponse.game);
            // Don't display splitWord here, but stringRep:
            const output = mainGame.stringRep();
            console.log(output);
            // Detect that the word has been found, and exit if so
            if (!output.includes("_")) {
                console.log("You found it!");
                return;
            }
        }
        // The maximum number of guesses was not enough to find the word
        console.log('What a pity. You ran out of guesses.');
    })();
    Letter: 
    <input name="game">
    <button>Guess</button>

    【讨论】:

    • 感谢您的帮助!
    • 我按照硬件的说明编写了构造函数。我遇到的唯一问题是文件 3 .prompt 中的最后一段代码,因此更改前两个并不是一个真正的选择。
    【解决方案2】:

    我不会帮你解决问题中的代码,调试、重写某人的代码很烦人(尤其是当它很长时)。

    但我给你举个例子:

    const words = [
      'Azerbaijan', 'America', 'blablabla', 'Argentina', 'lambada', 'Australia', 'schmetterling', 'krankenwagen', 'kugelschreiber'
    ];
    
    let word, result, charIndexes;
    
    const start = () => {
      word = words[parseInt(Math.random()*words.length)];
      charIndexes = {};
      result = new Array(word.length+1).join('_');
    
      word.split('').forEach((char, i) => {
        char = char.toLowerCase();
        if (!charIndexes[char]) charIndexes[char] = []
        charIndexes[char].push(i);
      });
      
      info.innerHTML = '';
      output.innerHTML = result;
      input.focus();
    };
    
    const checkChar = (char) => {
      result = result.split('');
      if (charIndexes[char]) {
        const indexes = charIndexes[char];
        indexes.forEach(i => {
          result[i] = word.charAt(i);
        });
        delete charIndexes[char];
      }
      result = result.join('');
      output.innerHTML = result;
      if (Object.keys(charIndexes).length === 0) {
        info.innerHTML = 'Congratulations!';
      }
    };
    
    const input = document.getElementById('letter');
    const output = document.getElementById('word');
    const info = document.getElementById('info');
    
    input.onkeyup = (e) => {
      const char = e.key.toLowerCase();
      input.value = '';
      checkChar(char);
    };
    
    start();
    <input type="text" id="letter" value=""> 
    <button onclick="start()">reset</button>
    <br/><br/>
    <div id="word"></div>
    <div id="info"></div>

    【讨论】:

    • 你的解决方案看起来很漂亮:)
    猜你喜欢
    • 2016-09-16
    • 1970-01-01
    • 1970-01-01
    • 2014-12-17
    • 2019-10-14
    • 2011-02-23
    • 2017-04-28
    • 1970-01-01
    • 2013-07-04
    相关资源
    最近更新 更多