如何用C语言编写贪吃蛇

2025-12-30 08:32:53

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

表示行和列,

也就是

 globalMap 

数组的两个下标。

globalMap 

数组中的索引

 index 

就是

 snakeMap 

数组的下标。

globalMap 

表示了所有节点的信息,而

 snakeMap 

只表示了贪吃

蛇的活动区域。

通过

 snakeMap 

可以定位

 globalMap 

中的元素,

反过

来通过

 globalMap 

也可以找到

 snakeMap 

中的元素。请看下图:

1

globalMap 

 snakeMap 

的初始对应关系

贪吃蛇向左移动时,

headerIndex 

指向

 404

tailIndex

指向

406

为什么设计的这么晦涩和复杂呢?因为这样设计有以下几个好

处:

贪吃蛇移动时不用处理所有节点,只要添加蛇头、删除蛇尾、重

 globalMap 

 snakeMap 

的对应关系就可以;

随机生成食物一次就可以成功,不用担心食物会占用边框或贪吃

蛇的位置;

贪吃蛇移动时,不用遍历数组就可以知道是否与自身相撞。

这些优点,如果你自己尝试过其他方案就会深有体会。

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢