欢迎加入我们的QQ群,无论你是否工作,学生,只要有c / vc / c++ 编程经验,就来吧!158427611
原文地址
很久以前自己写过贪吃蛇游戏。。用的QT。
当时没想太多就写了...现在 把当时写贪吃蛇用到的小蛇的算法大致梳理一遍。
因为时隔一年多之久,当时用QT写的游戏,所以现在只能大概归纳一下了。而且可能把以前的算法优化了一下。呵呵。。。一切尽在不言中。
【代码也附上 】
【游戏初始化】
我的贪吃蛇把游戏区域画作一个二维数组,建立游戏坐标。假设 Area[x][y];
int Area[x][y] = {0};//空白区域什么都没有;
Area[x][y] = 1;的时候就是此坐标有蛇或者有果子。
初始化的时候初始小蛇只有两节长,位于坐标系中间。
【游戏分解】
贪吃蛇 共两部分
【1】果子
果子的算法很简单,就是随机生成一个坐标点,显示果子,并排除已经有蛇的方位(Area[x][y] 已经是1的点)。
很简单不多说了。
【2】小蛇
小蛇部分算法:简单的说就是 正常移动情况下(头部 + 1,尾部 - 1),吃果子的情况下(头部 + 1 ,尾部不变);
详细步骤:
定于小蛇身体单元结构体
struct SnakItem{
int x; //x坐标
int y; //y坐标
};
定义小蛇身体数组SnakBody[](Vector,其实双向链表或者队列最佳,因为涉及前插和后删,能前后操作方便的数据结构最佳,这里我省事就不特别计较了);
定于小蛇身体长度int SnakLength = 2;
【a】根据上下左右方向,对小蛇的头部进行上下左右移动,判断是否触及边缘,触及边缘就游戏结束;
【b】不触及边缘则,获取对应方向的前进坐标 Area[x][y],判断是否和果子出现坐标相同,如果不同,则是做移动操作,走【c】步骤,否则则是走【d】步骤;
【c】蛇移动情况,前进坐标Area[x][y] = 1,并 生成 SnakItem实例,插入蛇身体实例头部SnakBody.insert(0,SnakItem)位置,获取蛇身体尾部SnakBody[SnakLegtj]的SnakItem 成员x1,y1,在x1,y1坐标 Area[x1][y1] = 0,并删除最后一个蛇身体Item。(SnakBody.ersa(最后一个))这样完成蛇移动动作;
【d】蛇吃果子情况,一样获取方向前进坐标Area[x][y],生成SnakItem实例,插入蛇身体头部位置,到这里和移动一样,不同的是,不需要删除尾部Item。这样完成吃果子的动作。
算法思想就这样啦。
把之前的【贪吃蛇游戏】代码附上啦
[由于现在没有QT环境,自己也没看着工程来解释算法了,可能算法中提到的数据结构。算法和具体工程代码有出入]
欢迎加入我们的QQ群,无论你是否工作,学生,只要有c / vc / c++ 编程经验,就来吧!158427611