Javascript Snake游戏(防止反向,同时保持响应能力)

时间:2017-11-14 01:57:19

标签: javascript

我有一个蛇游戏已经完成了"除了一个非常严重的烦恼。

以前,我遇到了以下问题。 说蛇是正确的。如果玩家快速连续多次改变方向,例如通过向下按下然后向左,则蛇将回到自身并反向。一旦我添加了碰撞检测代码,这将导致游戏结束并且玩家失败,因为蛇通过向内进入自身而与自身相撞。这个问题是可能的,因为方向可以在一个间隔内多次改变,例如,从右到下,然后从下到左。

通过添加bool来修复此问题,该bool将存储是否允许方向更改此间隔。如果方向尚未改变此间隔,则允许方向改变。如果已经更改了此间隔,则必须等到下一个间隔才能再次更改。这阻止了蛇向内进入自身,因为它保证了蛇的方向每个间隔只能改变一次。但是这造成了另一个问题,即在每个区间中,第一个按键后的每个按键都不会注册。

现在,问题在于游戏不再具有响应性。如果蛇走向右边,那么没有理由认为快速连续发送垃圾邮件并不能做到玩家所期望的。就目前而言,第二个权利有时不会注册,因为它被按下太快(按下按下的同一间隔)。因此,通过这种方式解决一个大问题,我创造了另一个烦恼。我如何充分利用这两个世界。如何在恢复响应能力的同时避免进入自己的可能性?

如果有必要,我可以提供代码,但我认为即使在抽象中,问题也很清楚。

2 个答案:

答案 0 :(得分:1)

听起来游戏要么在下一个间隔中对新方向起作用,要么在用户再次按下之前方向丢失。

你试过排队下一个方向吗?例如,在每个间隔,您可以检查队列以查看是否有新的方向。如果有,改变方向。如果没有,继续当前方向。

这可能会在您对用户的输入仍然准确的同时实现您想要的响应能力。

祝你好运

答案 1 :(得分:0)

我有完全相同的问题!很烦人!我最终实现了一个队列,其中最近的按键存储在一个队列中,并且每个按键都会被记录下来。我检查队列中是否有任何元素,如果是,则移动一次(使用Array.shift返回移位的值),然后将蛇的方向设置为队列中的方向,如下所示:

if (dir_queue.length) {
    let d = dir_queue.shift();

    dx = d.dx;
    dy = d.dy;
}
// move snake
x += dx;
y += dy;

方向被推向了目录。在keydown事件处理程序中排队,如下所示:

var key = evt.keyCode;
if (key === KEY.UP || key === KEY.DOWN || key === KEY.LEFT || key === KEY.RIGHT) {
    switch (key) {
        case 37:
            dx = dx || -1; dy = 0;
            break;
        case 38:
            dx = 0; dy = dy || -1;
            break;
        case 39:
            dx = dx || 1; dy = 0;
            break;
        case 40:
            dx = 0; dy = dy || 1;
    }
    // push to dir. queue
    dir_queue.push({ dx: dx, dy: dy });
}