贪吃蛇算法中贪吃蛇身子的数据结构用啥好呢?
解决方案 »
- js输出的html代码里的js不执行
- 请问document.implementation和document.implementation.createDocument是什么意思?
- 问些简单的常用的东西
- javascript 两个对话框的问题
- 【广州】招聘java软件工程师
- 雪地跪求一个jquery或js问题。在线等待,高手进。
- 哪位高手懂得 163 或者新浪的网站 一打开时 在屏幕中间回出现一个flash 然后播放结束后,自动飞到右下角.200分
- 怎样在客户端往指定的URL上传文件到服务器???
- 关于IFRAME的使用方法
- 再请教:如何得到浏览器的窗口的尺寸?
- 困扰了几天的问题,请高人帮忙解决一下,谢谢!
- Extjs4 使用外部的拍照插件的问题!!
var nodes = [
{color: "red"}
,{color: "blue"}
,{color: "green"}
];nodes.push({color: "#ff00ff"});
移动就是把蛇尾移动到旧蛇头的位置,旧蛇头则向前一步。
吃蛋变长就是蛇尾后面再加一块DIV做为新的蛇尾。
var snake = [{x0,y0},{x1,y1},{x2,y2},{x3,y3}]
蛇尾 ---> 蛇头
{x3-1,y3}
右移
{x3+1,y3}
上移
{x3,y3-1}
下移
{x3,y3+1}
蛇身我用的是array,数组中每个元素是一个json对象,像这样:{x:0,y:0,color:'red'},
针对游戏,用一个一维数组记录从蛇尾到蛇头的逐个坐标,每个坐标用一个整数表示。
从蛇尾到蛇头来存,或者反过来,都可以。
如果从蛇尾到蛇头来存,蛇尾是arr[0],蛇头是arr[arr.length-1]
蛇每移动一步,则在数组arr.shift()一下,arr.push(iNew)一下即可。
如果从蛇头到蛇尾来存,蛇头是arr[0],蛇尾是arr[arr.length-1]
蛇每移动一步,则在数组arr.unshift(iNew)一下,arr.pop()一下即可。
//
#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(); // 释放蛇
};
实现这个游戏最好的办法是创建一个模拟的点阵显示环境。
如果用什么链表之类的东西来描述,不仅麻烦,而且不够真实。你要创建一个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个方向的不同图片,蛇身每段都应该有水平和竖直两种状态,蛇体转弯拐角处用圆形连接又有很多种情形,复杂着呢。
利用它还可以用来实现地震预警呢 ^_^刚刚Beenz贴了一个贪吃蛇的:
http://topic.csdn.net/u/20091204/10/857ff1a1-5434-446c-a3be-7262df8d81b3.html