完整版C语言贪吃蛇设计思路和代码详解

时间:2022-07-14 07:18:15 阅读: 最新文章 文档下载
说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。


完整版C语言贪吃蛇设计思路和代码详解

到了本章,你已经学完了大部分C语言的基础知识,详细讲解贪吃蛇代码的条件就具备了。

本教程教你编写的贪吃蛇不依赖TC环境,不依赖任何第三方库,可以在VC 6.0VS等常见IDE中编译通过,请看下图:

更多效果图请查看:游戏初始化、游戏进行中、游戏结束。

请大家先把贪吃蛇的源码下载下来浏览一下,我们再具体分析,这样将会有更好的效果。

贪吃蛇源代码下载:提取密码:81qm 贪吃蛇设计思路

上图中的红色空心方框(?)表示边框,是贪吃蛇的边界,贪吃蛇不能碰到它,否则就“死掉”,游戏结束。绿色实心方框(?)表示贪吃蛇的活动范围,贪吃蛇可以自由移动,食物(苹果)也会随机出现在这个区域。我们不妨将贪吃蛇的活动范围称为“贪吃蛇地图”,而加上边框就称为“全局地图”。

我们需要记录地图中每一个节点的信息,包括: 位置:也就是第几行几列;

类型:这个节点出现的是贪吃蛇、食物、边框,还是什么都没有(绿色的背)

索引:也就是数组下标,稍后会说明是什么意思。 所以需要定义一个结构体二维数组: struct{ char type; int index;






}globalMap[MAXWIDTH][MAXHEIGHT];

用一维下标和二维下标表示位置; type 表示类型,不同的类型用不同的数字代表; index 表示索引。

直观上讲,应该将 type 定义为int类型,不过int占用四个字节,而节点类型的取值范围非常有限,一个字节就足够了,所以为了节省内存才定义为char型。

同时,再建立一个足够大的一维数组,让贪吃蛇在数组内活动: struct{ int x; int y;

} snakeMap[ (MAXWIDTH-2)*(MAXHEIGHT-2) ]

xy 表示行和列,也就是 globalMap 数组的两个下标。globalMap 数组中的索引 index 就是 snakeMap 数组的下标。

globalMap 表示了所有节点的信息,而 snakeMap 只表示了贪吃蛇的活动区域。通过 snakeMap 可以定位 globalMap 中的元素,反过来通过 globalMap 也可以找到 snakeMap 中的元素。请看下图:

1:globalMap snakeMap 的初始对应关系

贪吃蛇向左移动时,headerIndex 指向 404tailIndex指向 406 为什么设计的这么晦涩和复杂呢,因为这样设计有以下几个好 :

贪吃蛇移动时不用处理所有节点,只要添加蛇头、删除蛇尾、重建 globalMap snakeMap 的对应关系就可以;

随机生成食物一次就可以成功,不用担心食物会占用边框或贪吃蛇的位置; 贪吃蛇移动时,不用遍历数组就可以知道是否与自身相撞。






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




本文来源:https://www.wddqw.com/doc/6a4cee6a50e79b89680203d8ce2f0066f433647c.html