为什么即使我没有点击图案的全长,循环仍然是正确的?

How come the loop is still true even though I haven't clicked the full length of the pattern?

提问人:LuckyTiger 提问时间:8/11/2023 最后编辑:Heretic MonkeyLuckyTiger 更新时间:8/12/2023 访问量:55

问:

我正在做一个在线课程,我的任务是用 JavaScript 编写一个 Simon 游戏。我的代码可以工作,但我无法理解为什么 checkAnswer 函数中的循环在一个新的级别上是正确的,即使它没有我的模式的完整长度。


防爆 1 级

const gamePattern = ['blue'];

我点击蓝色

2级

const gamePattern = ['blue', 'red'];

我点击蓝色。循环检查是否相同。但是在这里我还没有点击第二种颜色,循环仍然可以。关于循环,我有什么不明白的地方?userClickedPattern

这是我的代码。

"use strict";

// Declared Variables
const buttonColours = ["red", "blue", "green", "yellow"];
let userClickedPattern = [];
const gamePattern = [];
let level = 0;

// Plays the sound of the input color
function playSound(name) {
  const sound = new Audio("/sounds/" + name + ".mp3");
  sound.play();
}

// Function that randomly selects the next color to be clicked
function nextSequence() {
  const randomNumber = Math.floor(Math.random() * 4);
  const randomChosenColour = buttonColours[randomNumber];

  $("#" + randomChosenColour)
    .fadeOut(100)
    .fadeIn(100);

  playSound(randomChosenColour);

  level++;

  // Updates the level text
  $("h1").text(`Level ${level}`);
  return gamePattern.push(randomChosenColour);
}

// User click function
$("div[type='button']").click(function(e) {
  const userChosenColour = e.currentTarget.id;

  playSound(userChosenColour);

  // Makes the button greyed out when clicked
  function animatePress(currentColour) {
    $("#" + currentColour).addClass("pressed");

    setTimeout(() => {
      $("#" + currentColour).removeClass("pressed");
    }, 100);
  }

  userClickedPattern.push(userChosenColour);
  animatePress(userChosenColour);

  checkAnswer(userClickedPattern);

  return;
});

// Runs once to start the game
$(document).keypress(function() {
  if (level === 0) {
    // Runs the nextSequence
    nextSequence();
  }
});

function checkAnswer(currentLevel) {
  for (let i = 0; i < currentLevel.length; i++)
    if (gamePattern[i] !== currentLevel[i]) {
      $("h1").css("color", "red");
      $("h1").text("GAME OVER");

      return;
    }

  if (currentLevel.length === gamePattern.length) {
    setTimeout(nextSequence, 1000);
    userClickedPattern = [];
  }
}

JavaScript jQuery 数组循环

评论

0赞 Justinas 8/11/2023
你做了什么来调试你的问题?
0赞 LuckyTiger 8/11/2023
你是什么意思?代码有效。只是我不明白为什么只点击一种颜色的循环仍然是正确的。
0赞 fnostro 8/12/2023
这不是循环。想想它被调用的频率。
1赞 LuckyTiger 8/12/2023
我想我想通了。是不是for中的“userPattern.length”(let i = 0; i < userPattern.length; i++),所以如果userPattern.length在一键后长度仅为1,但gamePattern.length为2,则无关紧要,因为循环仅将userPattern[0]与gamePattern[0]进行比较并运行一次
2赞 trincot 8/12/2023
这段代码不是很清楚。全局变量的混合,缩进并不总是一致的,游戏逻辑与输入/输出问题的混合,...等。你迷失了它并不奇怪。也许可以考虑尽可能地将游戏逻辑与输入/输出关注点分开,并尽可能避免全局变量。

答: 暂无答案