javascript - Hangman 游戏仅匹配第一个角色,而不是全部

标签 javascript jquery indexof

我正在使用 jQuery 创建一个 Hangman 游戏。我在使用 indexOf 时似乎无法重复字母。当我选择正确的字母时,它只会填充第一个插槽,而不会填充第二个插槽,即使您单击同一个字母两次也是如此。

示例:

姓名:“鲍勃”
输入的字符:“b”
结果:“b__”
预期结果:“b_b”

我尝试将其转换为使用循环,但它变成了无限循环。

// Band Names array
var bandNames = ["AJJ", "Bob Dylan", "The Front Bottoms", "The Hotelier"];

var correctLetters = [];
var placeHolder = [];

// creates a random number between 1 and the length of the band array.
var randomNumber = Math.floor(Math.random() * bandNames.length);

// picks a random band based of the length of the randomband array
var selectedBand = bandNames[randomNumber];

// add place holder based on length of band name
for (i = 0; i < selectedBand.length; i++) {
    placeHolder.push("<li></li>");
}

$(document).keypress(function(e) {
  var letterClicked = String.fromCharCode(e.which);

  if (selectedBand.indexOf(letterClicked) > -1) {
    // adds correct letter to the array
    correctLetters.push(letterClicked);

    placeHolder[selectedBand.indexOf(letterClicked)] = letterClicked;
    //  combines the array
    var joinArray = placeHolder.join("");

    // appand 
    $('#current-container').html("").append(joinArray);

    if (joinArray == selectedBand) {
      alert("you win");
      location.reload();
    }
  }
});

如何找到所有字符?

最佳答案

indexOf 将仅返回找到的第一个索引。您可以做的是使用 mapplaceHoldermapselectedBand 并替换所有值匹配按下的键。

这是一个工作示例。

var bandNames = ["AJJ", "Bob Dylan", "The Front Bottoms", "The Hotelier"];
var randomNumber = Math.floor(Math.random() * bandNames.length);
var selectedBand = bandNames[randomNumber];

var correctLetters = [];
var placeHolder = [];

for (i = 0; i < selectedBand.length; i++) {
  selectedBand[i] === " " ? placeHolder.push(" ") : placeHolder.push("_");
}

$('#current-container').html(placeHolder);

$(document).keypress(function(e) {
  var letterClicked = String.fromCharCode(e.which);

  selectedBand.split("").map((letter, index) => {
    if (letter.toLowerCase() === letterClicked) {
      placeHolder[index] = selectedBand[index];
    }
  });

  $('#current-container').html(placeHolder);

  if (placeHolder.join("") == selectedBand) {
    setTimeout(() => {
      alert("you win");
    });
    location.reload();
  }
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<div id="current-container">
</div>

注意:我使用了setTimeout来显示警报,因为否则警报会在赢得游戏之前单击的最后一个字母显示在屏幕上之前显示。

关于javascript - Hangman 游戏仅匹配第一个角色,而不是全部,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57649766/

相关文章:

javascript - ASP.NET MVC/JQuery/Javascript:搜索(并尝试加载)新数据后, View 不会刷新

jquery - Bootstrap保持 Accordion 打开页面重新加载

javascript - 未捕获的类型错误 : Undefined is not a function on indexOf

java - 实现我自己的 indexOf 方法的递归版本

javascript - 使用indexOf查看AngularJS中的对象是否存在匹配

javascript - 内容可编辑在刷新时丢失其选项卡/新行

javascript - jquery mobile获取href var值

javascript - 提醒滚动条顶部位置(滚动顶部)不起作用

javascript - cufon 不工作

javascript - 使用 JavaScript 计算 li 元素和视口(viewport)之间的距离