我正在使用HTML5,CSS3和JavaScript为类编写Whack-A-Mole游戏。我遇到了一个非常有趣的错误,其中,在看起来随机的时间间隔,我的s鼠停止更改其“ onBoard”变量,结果将停止分配给棋盘。漏洞也发生了类似的事情,但在我的测试中却没有那么频繁。所有这些完全独立于用户交互。
在我取消该项目并完全从头开始之前,你们和加尔斯是我绝对的最后希望。这使我无休止。这是Codepen和我的github(如果您希望拥有图像)。
由于Codepen链接显然需要附带的代码,因此我认为这是发生问题的函数。
// Run the game
function run() {
var interval = (Math.floor(Math.random() * 7) * 1000);
if(firstRound) {
renderHole(mole(), hole(), lifeSpan());
firstRound = false;
}
setTimeout(function() {
renderHole(mole(), hole(), lifeSpan());
run();
}, interval);
}
我相信这是正在发生的。该功能以0-6秒之间的随机间隔运行。如果该函数运行太快,则传递给我的renderHole()函数的数据将被新数据覆盖,从而导致先前的孔洞和痣永远不会脱离电路板(至少是明智的选择)。
编辑:事实证明,我的问题来自于我的递归函数调用没有回报。由于来自另一种语言,我不知道在JavaScript中,如果没有其他指示,函数将返回“未定义”。但是,由于我的原始代码令人费解和混乱,并且在某些地方多余,因此我将GameAlchemist的答案标记为正确的答案。谢谢大家的帮助!
最佳答案
您在代码中到处都有一些设计错误,这些设计错误接连不断地使代码难以阅读和遵循,并且几乎无法调试。mole()
函数可能会返回痣...或不返回...或创建超时以稍后再调用自身。.mole
再次调用自身时结果将如何处理?没什么,因此它将被标记为onBoard,将不再可见。
--- >>>>有一个明确的定义,并且对mole()
负有单一责任:例如“返回一个可用的未显示的痣字符或null”。仅此而已,没有任何计数,也没有对象的标记,只是KISS(保持简单S ...):它应该始终返回一个值,并且永远不会触发超时。hole()
也是如此:返回一个空孔或为null,没有标记,没有设置超时。render
应该简化:如果无法找到再见,就去找个痣,去找个洞。如果找到了痣/孔,只需设置新的痣/孔对+事件处理程序(在单独的函数中)。您的主要run
功能将确保一次又一次地产卵。