【问题标题】:Javascript- passing through this loopJavascript-通过这个循环
【发布时间】:2015-10-20 06:01:15
【问题描述】:

我正在制作一个刽子手游戏。我正在使用 indexOf() 函数来检查一个字母是否在一个单词中。每个字母都有一个按钮,当单击按钮时会发生以下情况(此功能适用于字母 A):

function A(event) {

  if (event.target.classList.contains("disabled")) {
    event.preventDefault();
  }

  document.getElementById("A").style.opacity = "0.5";
  event.target.classList.add("disabled");
  score = score + 1;
  document.getElementById("Score").innerHTML = score;

  for (var letter = 0; letter <= randomWord.length; letter++) {
    if (randomWord[letter].indexOf("a") !== -1) {
      document.getElementById("letter_" + letter).innerHTML = "A";
    } else {
      mistakesLeft = mistakesLeft - 1;
      document.getElementById("attempsLeft").innerHTML = mistakesLeft;
      console.log(mistakesLeft);

      if (mistakesLeft == 7) {
        document.getElementById("part-1").style.display = "block";
      } else if (mistakesLeft == 6) {
        document.getElementById("part-2").style.display = "block";
      } else if (mistakesLeft == 5) {
        document.getElementById("part-3").style.display = "block";
      } else if (mistakesLeft == 4) {
        document.getElementById("part-4").style.display = "block";
      } else if (mistakesLeft == 3) {
        document.getElementById("part-5").style.display = "block";
      } else if (mistakesLeft == 2) {
        document.getElementById("part-6").style.display = "block";
      } else if (mistakesLeft == 1) {
        document.getElementById("part-7").style.display = "block";
      } else {
        document.getElementById("part-8").style.display = "block";
      }
    }
    break;
  }
}

由于某种原因,当我的随机单词中包含“A”并且它不是第一个字母时,它不会打印到document.getElementById("letter_" + letter).innerHTML = "A";,而是继续到 else 语句并认为没有“ A”一词。如果“A”是单词的第一个字母,那么它会按照它的意思去做。我注意到问题可能是代码底部的中断(由于中断,它无法到达下一个字母) - 我该如何修复它,以便循环继续通过第一个循环,直到达到这个词没有减去任何部分的错误离开了吗?

【问题讨论】:

  • 不应该是if条件必须是.indexOf("A")
  • randomWord 是否包含您需要搜索的单词?
  • 不,randomwords 都是小写的,是的,randomWord 包含您需要猜测的单词的字符串。

标签: javascript for-loop indexof


【解决方案1】:

应该是

for (var letter = 0; letter <= randomWord.length - 1; letter++) {
    if (randomWord[letter] === 'a') {
      ...

您不必同时使用indexOf。函数 indexOf 为您搜索一个字母。另请注意randomWord.length - 1

在这个问题的范围之外,我认为您不需要为所有字母设置单独的函数。创建一个通用函数并在每次单击按钮时调用它,同时将相应的字母作为参数传递给它。

【讨论】:

  • 对fencepost错误的更惯用的修复方法是使用&lt;而不是&lt;=
  • 不幸的是,这仍然不起作用,并且与我在顶部所说的效果相同。循环只打印单词的第一个字母,当它通过 if 语句时,它也通过 else 语句
  • 创建一个小提琴,隔离产生错误的代码并给我们链接。问题不在循环中。它在别处。
  • 好的,我已经创建了一个小提琴,这是链接:jsfiddle.net/svhfogbf。我可能需要输入所有代码,所以请告诉我您是否需要所有代码。感谢您迄今为止的帮助!
  • 当我点击字母“A”时,它说 A 不是函数。你的数组有大约 1000 个元素。请仅包含与此错误相关的最少代码,并确保它在我们这里讨论的点上有效。
【解决方案2】:

这里有一个稍微整理过的版本,而不是必须更改所有处理程序的逻辑

function letterClicked(event) {
  var elem = event.target,
      ch = elem.id,
      reg = new RegEx(ch),
      found = false;

  if (elem.classList.contains("disabled")) {
    return false; //you want to return early in this case
  }

  elem.style.opacity = "0.5";
  elem.classList.add("disabled");
  score = score + 1;
  document.getElementById("Score").innerHTML = score;

  if(!(match = reg.exec(randomWord)) {
     mistakes++;
     document.getElementById("part-" + mistakes).style.display = "block";
  } else {
    do {
      document.getElementById("letter_" + match.index).innerHTML = ch;
    }while (match = reg.exec(randomWord));
  }
}

【讨论】:

  • @DisplayName 你觉得这很复杂吗?它适用于所有字母,而不仅仅是一个字母,而且行数更少。如果你使用 jquery,它可能会更简单
猜你喜欢
  • 2015-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多