【发布时间】:2021-09-19 22:37:58
【问题描述】:
我仍然是一个 JS 初学者,试图掌握 jQuery 并开始将 Simon Game 编码为一个项目。您有 4 个彩色空间,它们应该以随机序列点亮并播放声音,从长度为 1 的序列开始。玩家通过单击方块重新创建该序列。如果成功,随机序列长度将增加1,如果你犯了错误,你必须重新开始。
我正处于简单地创建长度为 5 的随机序列并直观地显示该序列的阶段。这就是我想出的:
var sequence = [];
$("button").click(startGame);
function startGame() {
for (let index = 0; index < 5; index++) {
sequence.push(nextColour());
touchField(index);
// playSound();
}
}
function nextColour() {
var randomNumber = Math.floor(Math.random() * 4) + 1;
if (randomNumber === 1) {
var nextColour = "red";
} else if (randomNumber === 2) {
var nextColour = "blue";
} else if (randomNumber === 3) {
var nextColour = "green";
} else {
var nextColour = "yellow";
}
return nextColour
};
function touchField(index) {
$("." + sequence[index]).addClass("active");
setTimeout(function() {
$("." + sequence[index]).removeClass("active")
}, 300);
}
.active {
border: 1rem solid purple;
}
.red {
border: 1px solid red;
}
.blue {
border: 1px solid blue;
}
.green {
border: 1px solid green;
}
.yellow {
border: 1px solid yellow;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<img class="red" src="https://via.placeholder.com/50" alt="">
<img class="blue" src="https://via.placeholder.com/50" alt="">
<img class="green" src="https://via.placeholder.com/50" alt="">
<img class="yellow" src="https://via.placeholder.com/50" alt="">
所以问题是,“.active”类几乎同时从所有方格中添加和删除 - 这使得无法区分任何类型的序列。所以我想我可以使用“setTimeout();”。但这并不妨碍它这样做。我相信发生的事情是,直到确实执行超时后要评估的表达式,代码才会继续运行,因此几乎同时添加“.active”和超时 5 次 - 这导致它们几乎同时删除。理想情况下,在删除“.active”和将“.active”添加到下一个方块之间有足够的时间。我还尝试将 setTimeout 添加到“touchSquare()”函数调用中。它也不起作用 - 我相信出于同样的原因,它只是继续执行。我希望你能看到我的问题。 ^^
我看过其他问题,但答案似乎忽略了浏览器在到达 setTimeout 后继续执行代码的事实,例如这里:
How to delay execution in between the following in my javascript
如果您将其复制粘贴到控制台中,它根本不会做它应该做的事情,因为在识别出 setTimeout 之后代码会继续执行。我希望我能让我的问题对你有意义,这是我第一次在 StackOverflow 上发布问题。如果我能以任何方式改进我提出问题的方式,我非常感谢建设性的批评!
【问题讨论】:
-
setTimeout用于在指定延迟后运行回调。它确实不阻止执行该语句之后的代码。请参阅Window.setTimeout()的文档。 This tutorial 解释了阻塞与非阻塞代码,这在您的案例中是混淆的根源。 -
欢迎。您经常会遇到的一个主题是 jQuery 不再是必需品,它实际上会成为您学习和现代应用程序开发的障碍。浏览器已经标准化,JavaScript 几乎可以完成 jQuery 开箱即用的所有功能。先学 JS。
-
这能回答你的问题吗? What is the JavaScript version of sleep()?
-
为什么只暂停 300 毫秒。 3000 不是更有意义吗?
-
@zipzit,我不确定这有什么关系。此外,三秒在 UI 中是永恒的,更不用说一堆三秒的间隔了。
标签: javascript html jquery