gpt4 book ai didi

javascript - 如何多次替换数组元素?

转载 作者:行者123 更新时间:2023-11-30 14:17:18 25 4
gpt4 key购买 nike

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);

}
});

我使用构造函数构建了一个刽子手游戏。我已将其设置为当选择一个随机单词时,每个字母将显示为下划线。
我用inquirer包要了一封信。当第一个字母被猜对时,它成功地将下划线替换为 liveWord 数组中的字母。问题是,它只适用于一个字母。我需要让它工作,直到猜出完整的单词。仅供引用,文件 1 和 2 仅供引用,我的问题仅在文件 3 中。无需查看前 2 个。有什么提示吗?

最佳答案

您的代码中存在几个问题:

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

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

  3. 没有允许用户进行第二次猜测的循环,因此它只能正常工作一次。需要有一个循环来减少您目前尚未使用的变量 remainingGuesses 的值。

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

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

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

这是您的代码,上面列出的点已更正。为了使其在此代码段小部件中可运行,我没有像您那样将其拆分为多个模块,也没有包含 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>

关于javascript - 如何多次替换数组元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53365043/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com