贪吃蛇算法中贪吃蛇身子的数据结构用啥好呢?

解决方案 »

  1.   

    链表(数组)如:
    var nodes = [
        {color: "red"}
        ,{color: "blue"}
        ,{color: "green"}
    ];nodes.push({color: "#ff00ff"});
      

  2.   

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

  3.   

    应该是存蛇身坐标,但是每次移动只关心头尾,尾trip掉,根据上下左右,选择在蛇头那个方位添加新蛇头坐标.
    var snake = [{x0,y0},{x1,y1},{x2,y2},{x3,y3}]
                 蛇尾         --->        蛇头
      

  4.   

    接上,蛇头移动只有四种情况左移
    {x3-1,y3}
    右移
    {x3+1,y3}
    上移
    {x3,y3-1}
    下移
    {x3,y3+1}
      

  5.   

    http://blog.csdn.net/sunxing007/archive/2009/05/14/4187038.aspx
    蛇身我用的是array,数组中每个元素是一个json对象,像这样:{x:0,y:0,color:'red'},
      

  6.   

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

  7.   

    我写过一个MFC的,在这里 http://toonyxm.cn/myblog/article.asp?id=176,算是给楼主提供一种思路吧。// SnakeBody.h : CSnakeBody 类头文件    
    //   
      
    #pragma once    
       
    // 蛇体    
    struct Snake    
    {    
        int Sx;                       // 蛇体节点X坐标    
        int Sy;                       // 蛇体节点Y坐标    
        int SNum;                     // 蛇体节点序号    
        Snake *previous;    
        Snake *next;    
    };    
       
    class CSnakeBody    
    {    
    // 构造    
    public:    
        CSnakeBody();    
        ~CSnakeBody();    
       
    //参数    
    public:    
        int SnakeCount;               // 蛇体长度    
        //Snake Snakes;               // 创建蛇    
        int UserMove;                 // 用户移动方向 0-自动移动 1-左 2-上 3-右 4-下    
       
    private:    
        Snake *SHead;                 // 蛇头    
        Snake *Tail;                  // 蛇尾    
       
       
    //实现    
    public:    
        void Move(int state);         // 蛇体移动 0-自动移动 1-左 2-上 3-右 4-下    
        bool Offend();                // 碰撞判断    
        Snake GetSnake(int num);      // 节点获取    
        void SetMap();                // 刷新地图    
        void Start();                 // 开始游戏    
        void AddSnake(int x,int y);   // 增加蛇    
        //int DeleteAllSnake();       // 释放蛇    
    };  
      

  8.   

    我的贪吃蛇 (34 楼 为修改后的代码)http://topic.csdn.net/u/20090729/09/32164988-96af-4c15-a9d4-b873764b0535.html
      

  9.   

    这个贪食蛇用ABAP这么写啊?????
      

  10.   

    “贪吃的蛇”是一个低分辨率点阵下实现的游戏。最初是在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个点全部重画会消耗运算资源。画一点、擦一点的方式最节省运算资源。这就是为什么“贪吃的蛇”游戏规则里不允许吃到自己身体的原因。
      

  11.   

    简单的贪食蛇,写起来非常简单,代码也很少。
    给一个我周五写的简单贪食蛇(长按前进方向键可加速前进,代码简洁没OO)【贪食蛇v1在线试玩点这里】截图:

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

  12.   

    http://blog.csdn.net/cuixiping/archive/2009/08/08/4425159.aspx
      

  13.   

    看了flash版的贪食蛇之后,相信没有人对玩js版的感兴趣。
      

  14.   

     Hoye不错噢,呵呵,这个贴挺起
      

  15.   


    利用它还可以用来实现地震预警呢 ^_^刚刚Beenz贴了一个贪吃蛇的:
    http://topic.csdn.net/u/20091204/10/857ff1a1-5434-446c-a3be-7262df8d81b3.html