javascript贪吃蛇算法



------
贪吃蛇算法中贪吃蛇身子的数据结构用啥好呢?
------
哈哈,这个俺也不懂。
------
期待中。。。
------
up
------
期待
------
只要两个变量即可,一个变量存蛇头,一个变量存蛇尾,蛇身不用管。
移动就是把蛇尾移动到旧蛇头的位置,旧蛇头则向前一步。
吃蛋变长就是蛇尾后面再加一块DIV做为新的蛇尾。
------
ls的不错,这样就不必要用数组存储整个蛇身的坐标.

------
似乎有问题吧,如果转弯过,蛇头 蛇尾中有多种可能路径
------
应该是存蛇身坐标,但是每次移动只关心头尾,尾trip掉,根据上下左右,选择在蛇头那个方位添加新蛇头坐标.
var snake = [{x0,y0},{x1,y1},{x2,y2},{x3,y3}]
  蛇尾 ---> 蛇头
------
接上,蛇头移动只有四种情况

左移
{x3-1,y3}
右移
{x3+1,y3}
上移
{x3,y3-1}
下移
{x3,y3+1}
------
记录坐标是最好的吧,判断也方便
------
期待中。。。
------
学习中
------
关注。。。

------
关注关注
------
学习了!!!
------
纯支持帖。
------
引用 6 楼 cuixiping 的回复:
只要两个变量即可,一个变量存蛇头,一个变量存蛇尾,蛇身不用管。
移动就是把蛇尾移动到旧蛇头的位置,旧蛇头则向前一步。
吃蛋变长就是蛇尾后面再加一块DIV做为新的蛇尾。

------
引用 6 楼 cuixiping 的回复:
只要两个变量即可,一个变量存蛇头,一个变量存蛇尾,蛇身不用管。
移动就是把蛇尾移动到旧蛇头的位置,旧蛇头则向前一步。
吃蛋变长就是蛇尾后面再加一块DIV做为新的蛇尾。

------
走一格之后要重新获得蛇尾的坐标以供第2步的时候用
怎么判断新蛇尾与旧蛇尾的位置关系
------
引用 19 楼 cuixiping 的回复:
引用 6 楼 cuixiping 的回复:
只要两个变量即可,一个变量存蛇头,一个变量存蛇尾,蛇身不用管。
移动就是把蛇尾移动到旧蛇头的位置,旧蛇头则向前一步。
吃蛋变长就是蛇尾后面再加一块DIV做为新的蛇尾。

直走一格为例:
○○○○○○○○○○○○○●
 ○○○○○○○○○○○○○●
转弯走一格为例:



○○○○○○○○○○●
 


○○○○○○○○○○○●

你看看,中间的蛇身都不用动,所以说只要两个变量。
尾巴○移到旧的头●的位置,旧的头●则往前进方向走一格。

------
如果要考虑碰撞自身的话,也不用存全部坐标,只存头尾和每个拐点的坐标即可
------
学习了~~
------
就没了?

------
关注..
------
学习一下
------
有意思,学习
------
up
------
引用 3 楼 zswang 的回复:
链表(数组)

如:
JScript codevar nodes= [
{color:"red"}
,{color:"blue"}
,{color:"green"}
];

nodes.push({color:"#ff00ff"});

------
oo 这些天怎么这么过人讨论贪吃蛇
------
记录坐标是最好的吧,判断也方便
------
http://blog.csdn.net/sunxing007/archive/2009/05/14/4187038.aspx
蛇身我用的是array,数组中每个元素是一个json对象,像这样:{x:0,y:0,color:'red'},
------
FGFDHG
------
引用 22 楼 hdt 的回复:
如果要考虑碰撞自身的话,也不用存全部坐标,只存头尾和每个拐点的坐标即可

------
这个方法很好么,学习
------
我的意思是蛇的绘制只需要考虑两个变量,不好意思,没有考虑到游戏中的其他逻辑。
针对游戏,用一个一维数组记录从蛇尾到蛇头的逐个坐标,每个坐标用一个整数表示。
从蛇尾到蛇头来存,或者反过来,都可以。
如果从蛇尾到蛇头来存,蛇尾是arr[0],蛇头是arr[arr.length-1]
  蛇每移动一步,则在数组arr.shift()一下,arr.push(iNew)一下即可。
如果从蛇头到蛇尾来存,蛇头是arr[0],蛇尾是arr[arr.length-1]
  蛇每移动一步,则在数组arr.unshift(iNew)一下,arr.pop()一下即可。

------
真是超级棒的啊

------
嗯 好好学习一下..

------
这么经典的程序应该有吧
------
进来看看
------
学习!
------
学习一下先。。。。
------
学习学习啊。
------
标记,学习
------
关注一下!
------
学习
------
围观一下,一会拿电脑实现一下。
------
蛇身和食物用户不同颜色表示,蛇身是到食物后变自身颜射,颜色相同则表示碰撞,不同则是食物
------
UP
------
进来学习一下。
------
学习了
------
链表,初始化时要设定每一节身体的坐标
蛇移动仅仅是头指向尾,断开尾的链接,根据走向更新新头的坐标。
吃掉食物仅仅是把头指向食物,作为新的头。
------
单向链表为蛇,食物可以当成只有一个元素的单向链表来初始化
------
扩展的话可以把食物都做成单向链表,也就是食物也是多个组成,嘿嘿,实现的方式不会有任何变化。
------
我的贪吃蛇 (34 楼 为修改后的代码)

http://topic.csdn.net/u/20090729/09/32164988-96af-4c15-a9d4-b873764b0535.html


------
小游戏实现起来真复杂啊~~
------
旁观
------
学习!
------
这个贪食蛇用ABAP这么写啊?????
------
这个有点意思。
------
.
------
我发现人才真多。。。。
------
原来js如此强大,游戏也可以做。依旧努力的学习中……
------
期待

------
“贪吃的蛇”是一个低分辨率点阵下实现的游戏。最初是在Apple II的40×40色块分辨率下实现的。
实现这个游戏最好的办法是创建一个模拟的点阵显示环境。
如果用什么链表之类的东西来描述,不仅麻烦,而且不够真实。

你要创建一个W×H的点阵显示空间。记录这个空间的是W×H个元素的一维数组(相当于显示缓冲区)。

一维数组的索引和二维坐标的转换公式是这样的:

I=Y×W+X (i是从0到N的一维数组索引)
Y=I\W (Y是从0开始计算的垂直坐标)
X=I Mod W (X是从0开始计算的水平坐标)

在点阵里画一个点,一般是使元素大于0。擦除一个点一般是使元素等于0。
(如果你吃饱了撑的,也可以规定擦除是某个特定值比如99,0是有效点)

每当完成一个“周期”之后,将这个一维数组在界面上成像(相当于RAMDAC将显示缓冲区输出为视频信号)。
成像的方法有许多方式。你可以用O和X在文本显示;也可以用漂亮的明暗图片在网页里显示。这个就属于细节问题了。

实现了“点阵显示环境”和“画点、擦点”的函数之后。就可以实现“贪吃的蛇”了。

实现贪吃的蛇简单说就是:画当前周期的最新点,擦L个周期前的旧点(L就是蛇的长度)。做个FIFO很好解决。你可能会习惯在FIFO里存储一个x,y坐标。但明智的办法是存储一维显示缓冲区数组的索引,因为它不需要坐标转换。

当前点和擦除点之间的点并不重画,因为它们已经存在于点阵显示上。但假如蛇的轨迹穿过这些点,会导致它们在L个周期后被擦掉。那个年代的电脑运算速度特别慢,如果要保证将L个点全部重画会消耗运算资源。画一点、擦一点的方式最节省运算资源。这就是为什么“贪吃的蛇”游戏规则里不允许吃到自己身体的原因。

------
支持,哈哈,这个不错
------
此贴不能倒,呵呵!
------
简单的贪食蛇,写起来非常简单,代码也很少。
给一个我周五写的简单贪食蛇(长按前进方向键可加速前进,代码简洁没OO)

【贪食蛇v1在线试玩点这里】

截图:



但是如果要做到很好的视觉效果,就难了。比如,
如果想让蛇不再是方块的蛇,而是仿真的蛇,则蛇头、蛇尾各有4个方向的不同图片,蛇身每段都应该有水平和竖直两种状态,蛇体转弯拐角处用圆形连接又有很多种情形,复杂着呢。
------
http://blog.csdn.net/cuixiping/archive/2009/08/08/4425159.aspx
------
学习了,还是蛮有用的!
------
看了flash版的贪食蛇之后,相信没有人对玩js版的感兴趣。
------
用面向对象的方式封装,
封装一组节对象


------
苗苗
------
用面向对象的方式封装, 
封装一组节对象 

------
学习!
------
up
------
这也可以算的?
------
顶顶顶
------
谢谢 研究去
------
学习
------
有没有完整代码 ,借我玩哈 !
------
学习中
------
如何实现转弯?
------
Mark
------
Hoye不错噢,呵呵,这个贴挺起
------
真的有强人.
------
学习了
------
想法很不错~~~~~!
  很期待,
 看来要多学学JS方面技术了 这么强大~~~~~~
------
学。
------
引用 70 楼 cuixiping 的回复:
简单的贪食蛇,写起来非常简单,代码也很少。
给一个我周五写的简单贪食蛇(长按前进方向键可加速前进,代码简洁没OO)

【贪食蛇v1在线试玩点这里】

截图:



但是如果要做到很好的视觉效果,就难了。比如,
如果想让蛇不再是方块的蛇,而是仿真的蛇,则蛇头、蛇尾各有4个方向的不同图片,蛇身每段都应该有水平和竖直两种状态,蛇体转弯拐角处用圆形连接又有很多种情形,复杂着呢。

------
引用 67 楼 kitegirl 的回复:
“贪吃的蛇”是一个低分辨率点阵下实现的游戏。最初是在Apple II的40×40色块分辨率下实现的。
实现这个游戏最好的办法是创建一个模拟的点阵显示环境。
如果用什么链表之类的东西来描述,不仅麻烦,而且不够真实。

你要创建一个W×H的点阵显示空间。记录这个空间的是W×H个元素的一维数组(相当于显示缓冲区)。

一维数组的索引和二维坐标的转换公式是这样的:

I=Y×W+X (i是从0到N的一维数组索引)
Y=I\W (Y是从0开始计算的垂直坐标)
X=I Mod W (X是从0开始计算的水平坐标)

在点阵里画一个点,一般是使元素大于0。擦除一个点一般是使元素等于0。
(如果你吃饱了撑的,也可以规定擦除是某个特定值比如99,0是有效点)

每当完成一个“周期”之后,将这个一维数组在界面上成像(相当于RAMDAC将显示缓冲区输出为视频信号)。
成像的方法有许多方式。你可以用O和X在文本显示;也可以用漂亮的明暗图片在网页里显示。这个就属于细节问题了。

实现了“点阵显示环境”和“画点、擦点”的函数之后。就可以实现“贪吃的蛇”了。

实现贪吃的蛇简单说就是:画当前周期的最新点,擦L个周期前的旧点(L就是蛇的长度)。做个FIFO很好解决。你可能会习惯在FIFO里存储一个x,y坐标。但明智的办法是存储一维显示缓冲区数组的索引,因为它不需要坐标转换。

当前点和擦除点之间的点并不重画,因为它们已经存在于点阵显示上。但假如蛇的轨迹穿过这些点,会导致它们在L个周期后被擦掉。那个年代的电脑运算速度特别慢,如果要保证将L个点全部重画会消耗运算资源。画一点、擦一点的方式最节省运算资源。这就是为什么“贪吃的蛇”游戏规则里不允许吃到自己身体的原因。


------
引用 65 楼 daxian520 的回复:
原来js如此强大,游戏也可以做。依旧努力的学习中……

------
好一個完整的~!~學習學習~!

------
学习。
------
学习中。。。。值得期待
------
学习中.............
桂ICP备07017180号