【游戏算法之贪吃蛇】我想的贪吃蛇算法

欢迎加入我们的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 

你可能感兴趣的:(数据结构,游戏,C++,算法,qt)