先上成品图:
承接简单贪吃蛇C语言版高级版(一):基本框架搭建,上一篇文章是基于二维地图设计的基本框架,但是在后续的编写中发现在简单的模型下使用二维地图会让一个语句非常的长,耐读性不强。但是在复杂的情况下二维的优势便会显现,这篇文章对贪吃蛇重新设计,因为模型较为简单,所以用一维字符数组来存储。而且上一篇文章中将地图类写的非常复杂,让整个程序的逻辑有些难懂。这篇会尽量拆开,让每一个变量负责一个特定的功能。就该程序的基本架构,可以参考我的另一篇博文,里面会详细介绍每个框架的功能并图示出来----->BFS寻路算法初探
该程序的主要部分如图
1.struct StateMap_Base 定义一个状态图的基本结构
2.struct Snake_Base 定义一个蛇的基本结构
3.void init() 设置初始化函数
4.int* readConnectedMap() 定义一个函数:读取状态图
5.void SearchAround() 定义一个函数:读取周围的点并将未搜索的点加入搜索列表
6.void SearchPath() 定义一个函数:以地图上一个点为基点,将其他点连接到基点的信息存储入路径图
7.void ShowMap() 定义一个函数:打印地图
8.void Seed() 定义一个函数:随机置放果实
9.void Eat() 定义一个函数:实现移动蛇并吃掉果实的显示
其余变量含义:
1.
#define row 20 //20行
#define col 20 //20列 这两句设定了地图大小
2.
vector toSearchList; 该vector容器存储将要搜索的点
3.
vector storeList; 该vector容器存储所有点的搜索情况
4.
vector body; 该vector容器存储蛇身的坐标
5.
vector Step_un;
vector Step; 这两个vector都是记录移动步骤,因为路径寻找方式是从目标点出发逆向追溯基点,所以路径首先导出时是逆的,存在Step_un中,再倒正存入Step
6.
int head; 记录蛇头的坐标
int fruit; 记录果实的坐标
bool EatenFlag; 标记果实是否被吃
bool IsFristInit; 标记是否是第一次初始化
7.图中声明框中的信息
StatueMap_Base StatueMap; 实例化状态图
char MainMap[col*row]; 定义主地图,人可直接观察的地图
int ConnectedMap[col*row][4]; 定义连通图
int PathMap[col*row]; 定义路径图
该程序中的贪吃蛇是在理论上的二维地图中行动,但是程序中使用的是一维数组MainMap[col*row]来存储的,在移动中通过坐标索引来映射物理地图。
程序基本思路如下:
初始化地图,初始化蛇
通过SearchPath()计算地图上各点连向基点的信息,存储在路径图PathMap中
通过追踪目标点(果实)在PathMap中的信息,可以逆向找到由果实到基点(蛇头)的路径
移动,吃掉,变长,刷新果实
循环
下面是几个图的定义:
下篇文章将详细介绍各个函数。