Javascript 大虫子打鼹鼠游戏!能帮我修一下吗?

Javascript 大虫子打鼹鼠游戏!能帮我修一下吗?,javascript,jquery,html,css,Javascript,Jquery,Html,Css,我正在用HTML5、CSS3和JavaScript为班级编写一个打鼹鼠游戏。我遇到了一个非常有趣的错误,在看似随机的时间间隔内,我的鼹鼠停止改变他们的“板载”变量,因此,将停止分配给董事会。类似的情况也发生在洞上,但在我的测试中并不经常发生。所有这些都完全独立于用户交互 在我放弃这个项目,从头开始之前,你们是我最后的希望。这让我非常沮丧。这是我的照片,如果你喜欢的话 由于Codepen链接显然需要附带代码,因此我认为这是出现问题的函数 // Run the game function r

我正在用HTML5、CSS3和JavaScript为班级编写一个打鼹鼠游戏。我遇到了一个非常有趣的错误,在看似随机的时间间隔内,我的鼹鼠停止改变他们的“板载”变量,因此,将停止分配给董事会。类似的情况也发生在洞上,但在我的测试中并不经常发生。所有这些都完全独立于用户交互

在我放弃这个项目,从头开始之前,你们是我最后的希望。这让我非常沮丧。这是我的照片,如果你喜欢的话

由于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中,如果没有其他指示,函数返回“未定义”。然而,我认为游戏炼金术士的答案是正确的,因为我的原始代码是复杂和混乱的,而且有些地方是多余的。谢谢大家的帮助

您在代码中到处都犯了一些设计错误,这些错误一个接一个地使代码难以阅读和理解,并且很难调试。
mole()
函数可能返回一个mole。。。或者不。。。或者创建一个超时以稍后调用自己。。当
mole
再次调用自身时,将如何处理结果?没有,因此它将被标记为“板载”,不再被看到。
--->>>对
mole()
有一个清晰的定义和单一的责任:例如“返回一个可用的未显示mole字符或null”。仅此而已,不计数,不标记对象,只需亲吻(保持简单s…):它应该始终返回一个值,并且永远不会触发超时。
对于
hole()
:返回一个空闲孔或null,没有标记,没有设置超时


渲染
应该简化:找一个鼹鼠,找一个洞,如果找不到,再见。如果发现一个mole+孔,只需设置新的mole/孔耦合+事件处理程序(在单独的函数中)。您的主
运行
功能将确保一次又一次地尝试繁殖鼹鼠

您是否尝试将+1000添加到interval以确保它永远不为0?您是否可以将资产上载到某个位置,并使用指向它们的外部链接更新代码笔?请注意,在第124行中,您有
curHole.board&&holecoount>=10
。你是说
curMole.board
?@Stiliyan资产已经上传。是的,这正是我的意思。谢谢你接电话。这支笔已经更新了。此外,我确实增加了间隔时间,以防止0秒的更新,但是即使静态间隔为3000秒,问题仍然会发生。“这只是需要一点愚蠢的运气。”斯蒂里扬纠正,我不是那个意思。我的意思是检查孔的div上的数据摩尔。这就是笔被更新的内容。我只是想澄清一下,如果我把事情弄得太复杂了,我道歉;一天中的这个时候我已经筋疲力尽了。因此,基本上,我应该删除mole()和hole()的计数,将renderHole()更改为仅显示组合,并在成功放置mole后为单击侦听器逻辑创建单独的函数?我们在这里学习。你的设计很好,事实上,你只需要保持它的简单,分解成非常简单的函数,只做一件简单的事情来描述。也许还可以改进名称:
getNextMole
getNextHole
而不是
mole
/
hole