如何用C语言编写贪吃蛇
1、了解贪吃蛇设计思路
上图中的红色空心方框(□)表示边框,是贪吃蛇的边界,贪吃
蛇不能碰到它,否则就“死掉”
,游戏结束。绿色实心方框(■)表示
贪吃蛇的活动范围,贪吃蛇可以自由移动,食物(苹果)也会随机出
现在这个区域。
我们不妨将贪吃蛇的活动范围称为
“贪吃蛇地图”
,
而
加上边框就称为“全局地图”
。
我们需要记录地图中每一个节点的信息,包括:
位置:也就是第几行几列;
类型:这个节点出现的是贪吃蛇、食物、边框,还是什么都没有
(绿色的背景)
。
索引:也就是数组下标,稍后会说明是什么意思。
所以需要定义一个结构体二维数组:
struct{
char type;
int index;
}globalMap[MAXWIDTH][MAXHEIGHT];
用一维下标和二维下标表示位置;用
type
表示类型,不同的类
型用不同的数字代表;用
index
表示索引。
直观上讲,应该将
type
定义为
int
类型,不过
int
占用四个字
节,而节点类型的取值范围非常有限,一个字节就足够了,所以为了
节省内存才定义为
char
类型。
同时,再建立一个足够大的一维数组,让贪吃蛇在数组内活动:
struct{
int x;
int y;
} snakeMap[ (MAXWIDTH-2)*(MAXHEIGHT-2) ]
x
、
y
表示行和列,
也就是
globalMap
数组的两个下标。
globalMap
数组中的索引
index
就是
snakeMap
数组的下标。
globalMap
表示了所有节点的信息,而
snakeMap
只表示了贪吃
蛇的活动区域。
通过
snakeMap
可以定位
globalMap
中的元素,
反过
来通过
globalMap
也可以找到
snakeMap
中的元素。请看下图:
图
1
:
globalMap
和
snakeMap
的初始对应关系
贪吃蛇向左移动时,
headerIndex
指向
404
,
tailIndex
指向
406
。
为什么设计的这么晦涩和复杂呢?因为这样设计有以下几个好
处:
贪吃蛇移动时不用处理所有节点,只要添加蛇头、删除蛇尾、重
建
globalMap
和
snakeMap
的对应关系就可以;
随机生成食物一次就可以成功,不用担心食物会占用边框或贪吃
蛇的位置;
贪吃蛇移动时,不用遍历数组就可以知道是否与自身相撞。
这些优点,如果你自己尝试过其他方案就会深有体会。