javascript – 不使用网格的蛇类游戏算法,这些网段的移动速度可能比其尺寸慢

前端之家收集整理的这篇文章主要介绍了javascript – 不使用网格的蛇类游戏算法,这些网段的移动速度可能比其尺寸慢前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我正在努力做到this guy is doing,但我认为他的要求可能比我少,因为那篇文章中的答案似乎不适合我的游戏.让我内联他的算法让我的问题更容易理解:

The easiest solution is to loop from tail to head and set the position of the current to the next segment’s position,ie: segment[i].position = segment[i - 1].position

我认为我们的要求之间的关键区别是我想在每个刻度上移动每个部分小于它自己的宽度/高度.例如:

假装这些正方形是水平对齐的(我把它画成未对齐的,因为我认为这样可以更容易地看到正在发生的事情).红色H是头部的当前位置.红色T是尾部当前的位置.黑色H’是头部应该在下一个位置的位置.所以蛇从右到左移动.如果我使用上述算法,这些段是否会重叠或开始分开?让我一步一步地演绎出来:

>创建H’.position
> T.position = H.position
> H.position = H’.position

结果将成为:

我可以使用什么算法来确保所有碎片以相同的速度移动并保持彼此相同的距离?

我会提出我的想法,但我对此持怀疑态度,因为我的研究没有显示其他人使用此信息:

每个段将存储它的坐标和方向. EG:[[50,50,LEFT],[100,LEFT]].头部是索引0,尾部是索引1.蛇移动的速度是10,即使段是50×50.

每个刻度我都会这样做:

>如果按下鼠标,则用按下的方向覆盖nextDirection变量.否则,nextDirection就是最后一次滴答.在这个例子中,让我们假设有人按了UP.
>迭代数组并将方向应用于每个刻度. EG:[[40,[90,LEFT]]
>将方向从头部移动到尾部,并将头部的新方向设置为nextDireciton. EG:[[40,UP],LEFT]]
>重复每个滴答.

这个算法看起来好像有效吗?我问的部分原因是因为它比其他人的算法更复杂,所以我觉得我做错了.而且,我对他的算法的思考越多,它看起来就越少.

重写我的问题

假装蛇的每个部分是一个20×20像素的矩形.每个刻度,我希望头部在某个方向上移动5个像素.如何确保所有段保持相互接触?

@ Rafe在评论中的描述如下:

Consider the ordered set of locations occupied by the snake at step t,with the leftmost being the tail and the rightmost being the head: {A,B,C,D,E}. At step t+1,the ordered set of locations occupied by the snake is {B,E,F} where the tail has moved from A to B and the head has moved from E to F.

我不认为这个算法有效,因为:

Yes but if the width of A = B = C = D = E = F = 20px. Shifting {A,E} so that it becomes {B,F} just added 20px to the right side and removed 20px from the left side. Doesn’t this mean he moved 20px,not 5px? I want to move 5px,not 20px If you’re saying that’s accomplished with your suggestion,please explain how. I don’t see it.

最佳答案
我知道你忽略了网格,但是如果让蛇向前移动一些数字会使你的大块大小均匀分布呢?

假设您只向前移动了块的宽度/高度的一半.

现在你可以优化一下.

>启动一个在整个游戏中运行的计数器.
>显示构成蛇的块(n = 0).我们称之为snake_even.
>下一步(n = 1),通过将它们全部向前移动1/2单位来创建构成下一条蛇的块.我们称之为snake_odd.
>对于所有次要移动,您可以显示snake-even或snake_odd,但是您可以通过将头部更改为新位置,从snake_odd(n)创建snake_even(n 2),或者从snake_odd(n)创建snake_odd(n 2)并写在尾巴上.
>每当蛇吃东西时,将长度加到你所在的snake_xxxx上,然后将长度加到另一个上.

如果你想只向前移动1/5的高度,你会做同样的事情,但你有五个数组来跟踪而不是两个.

基于您添加的示例的附加信息(每步移动5像素的20×20像素段):

将一条4段蛇向右移动.分段大小为20×20像素,每次移动移动5像素.我将蛇定义为坐标列表(x,y).我将用’H’标记头部,并且蛇将在列表中向右移动,如果需要则循环回到开头.

// n = 0
snake_0 => H(60,0),(40,(20,(0,0)

// Snake is moving to the right.
// n = 1 -- construct snake_1 from snake_0 and display that one (n % 4 = 1)
snake_1 => H(65,(45,(25,(5,0)

// n = 2 -- construct snake_2 from snake_1 and display that one (n % 4 = 2)
snake_2 => H(70,(50,(30,(10,0)

// n = 3 -- construct snake_3 from snake_2 and display that one (n % 4 = 3)
snake_3 => H(75,(55,(35,(15,0)

// n = 4 -- Now just move the head,and re-use all but the tail of snake_0
snake_0 => (60,H(80,0)

// n = 5
snake_1 => (65,H(85,0)

// n = 6
snake_2 => (70,H(90,0)

// etc.

现在,我忘记考虑的一件事是每个细分市场需要移动的方向.这可以存储在坐标旁边.但我认为那部分你可能已经理解了.

原文链接:https://www.f2er.com/js/429764.html

猜你在找的JavaScript相关文章