Javascript Snake游戏(在保持响应能力的同时防止逆转)



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

以前,我有以下问题。说蛇向右走。如果玩家连续多次快速改变方向,例如向下按然后向左按,那么蛇就会回到自己身上并反转方向。一旦我添加了碰撞检测代码,这将导致游戏结束,玩家会输,因为蛇向内撞到了自己身上。这个问题之所以成为可能,是因为方向可以在一个间隔内多次改变,例如,从右到下,然后从下到左。

这个问题是通过添加一个bool来解决的,该bool将存储是否允许方向更改此间隔。如果这个间隔的方向还没有改变,那么就允许改变方向。若它已经在这个间隔中更改了,那个么它将不得不等到下一个间隔才能再次更改。这防止了蛇向内进入自己,因为它保证了蛇的方向在每个间隔只能改变一次。但这造成了另一个问题,即在每个间隔中,第一次按键后的每一次按键都不会注册。

现在,问题是游戏不再有反应了。如果蛇要向右移动,那么快速连续地向右发送垃圾邮件就没有理由不符合玩家的期望。就目前情况来看,第二个右键有时不会注册,因为它被按下得太快(与按下下键的间隔相同)。因此,通过这种方式解决一个大问题,我又制造了另一个烦恼。我怎样才能两全其美。我如何在恢复反应能力的同时摆脱向内进入自己的可能性?

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

听起来游戏要么在下一个间隔中按照新的方向进行操作,要么方向丢失,直到用户再次按下。

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

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

祝好运

我遇到了完全相同的问题!很烦人!我最终实现了一个队列,其中最近的按键存储在一个队列中,对于每个"tick",我检查队列中是否有元素,如果有,则将其移位一次(使用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 });
}

最新更新