3.2 Snake结构体
Snake结构体描述了游戏中的贪吃蛇,包括贪吃蛇蛇身的节数、蛇身在每一节屏幕上的坐标位置,以及蛇的移动方向和生命状态等信息。结构体成员Joint表示当前贪吃蛇蛇身的节数。常量MAX_JOINT表示游戏所允许的贪吃蛇蛇身的最大节数。结构体中用一个两维数组x[MAX_JOINT]和y[MAX_JOINT]保存蛇身每一节位于屏幕上的行、列坐标。结构体成员direction表示蛇当前的移动方向,约定1,2,3,4分别代表右、左、上、下4个方向,对应着程序中的四个宏观量MV_RIGHT、MV_LEFT、MV_UP、MV_DOWM。成员life描述蛇的生命状态,life=0,表示活着,life=1,表示死亡。Snake结构体定义如下:
struct Snake { };
int x[MAX_JOINTS]; /*保存蛇身每一节位于屏幕上的列坐标*/ int y[MAX_JOINTS]; /*保存蛇身每一节位于屏幕上的列坐标*/ int joint; /*蛇的节数*/ int direction; /*蛇的移动方向*/
int life; /*蛇的生命,0表示活着,1表示死亡*/
9 / 14
3.3游戏中使用的宏常量表
宏常量 MAX_JOINTS RIGHT LEFT DOWN UP ESC MV_RIGHT MV_LEFT MV_UP MV_DOWM
数值 200 0x4d00 0x4b00 0x5000 0x4800 0x011b 1 2 3 4 含义 贪吃蛇的最大节数 键盘 按键的键值 键盘 按键的键值 键盘 按键的键值 键盘 按键的键值 键盘Esc按键的键值 蛇向右方向移动 蛇向左方向移动 蛇向上方向移动 蛇向下方向移动
4.算法分析
依据所需要处理的任务要求,规划输入数据和输出结果,决定存放数据的数据结构。
C语言中数据结构集中体现在数据类型上,因此在进行C语言程序设计时,应统筹规划程序中所使用的变量,数组,指针等,以及它们的类型等。这点是很重要的,如果在此期间选择不合适的变量或者数组,将来修改就十分困难。
程序通过不断扫描游戏者键盘的输入来决定蛇的运动方向,并随时侦测蛇头位置判断蛇是否吃到食物。吃到食物则按照游戏规则增长蛇的长度,并更新分数,同时在游戏场景中随机生成新食物,如此循环;当蛇的头部撞击到游戏场景边界或者蛇身时,游戏结束。游戏者也可以通过按Esc键直接退出游戏。
10 / 14
主函数main()通过调用函数InitGraph()实现图形系统初始化,调用函数DrawFence()实现绘制围墙等游戏场景,调用函数GamePlay()实现具体的贪吃蛇游戏,调用函数PrScore()来显示和更新游戏者所得分数,最后通过调用函数Closegraph()结束游戏。
其中,函数GamePlay()是实现贪吃蛇游戏的关键函数。首先,随机出现新食物,设置蛇的初始状态及其运动方向,并将初始得分记零;然后,通过while循环来检测游戏者的键盘输入,以控制蛇的运动方向。当蛇头撞到围墙或自己身体时,则调用函数GameOver()结束游戏。需注意的是,由于蛇的头部为两节,第三节蛇身不可能拐过来,因此游戏程序从蛇的第四节开始判断是否撞到自己或围墙。
4.1各模块简介
设计关键所在——蛇不停移动的:
蛇的不停移动,就是蛇的下一节取代前一节的位置,在计算机中就是蛇下一节的位置坐标变成前一节的位置坐标。在上文中,已定义蛇的位置坐标为数组类型,一组坐标对应一节的位置,假设有i+1节,由0到i节,第i节的坐标取第i-1节的坐标,第i-1节的坐标取第i-2节的坐标……直到第1节取第0节的坐标。而第0节的坐标,即蛇头的坐标要往某个方向变化,变化量为蛇每节的长度。蛇的这种坐标轮换需要循环语句使其继续下去。
1.main()主函数
主函数是程序的主流程,首先定义使用到的常数、全局变量及函数原型说明,然后初始化图形系统。
2.画面函数DrawFence()
主界面就是一个密封的围墙,用两个循环语句分别在水平方向和垂直方向输出连续的宽度和高度均为10个单位的矩形小方块,围成密闭图形,表示围墙,为了醒目,设置为淡青颜色,用函数setlinestyle(SOLID_LINE,0,THICK_WIDTH)设置线型宽度为3个像素。设置3个像素的围墙线,蛇在贴墙走的时候,会擦掉部分围墙线,使线变细,图形变得不好看,如果不想这种情况出现,则将线型宽度设置为1个像素。
11 / 14
3.游戏具体过程函数GamePlay()
这个函数是游戏的主要部分,难点在表示蛇的新位置并消除前一次的图形。采用的方法是每次移动的时候从最后一节开始到倒数第二节(因蛇头为两节),将前一节的坐标赋值给后一节的坐标,移动后只要把最后一节用背景色去除即可,因为新位置0到n-l节还是要出现在画面上的。然后蛇头按照方向键来更改位置。
另外,食物的随机出现要确保它的位置在10的倍数位置上,因为蛇的坐标都是以10为模的,这样的话就可以让蛇吃到,蛇吃到食物的判断是蛇头的坐标和食物的坐标相等。
其算法过程为:
(1)设置初始值。为防止食物总出现在一个位置上,要设置随机数发生器,真正产生随机数。初始时,蛇只有蛇头,设定一个开始的方向。
(2)循环执行,直到按Esc键退出。 (3)没有按键的情况下,循环执行。
如果没有食物,随机出现食物;如果有食物,则显示食物,蛇移动身体,根据蛇的方向改变坐标值,并判断蛇是否撞到了墙或自己吃了自己,如果出现这两种情况之一,则蛇死,调用游戏结束函数GameOver(),结束本次游戏,重新开始。如果蛇吃到了食物,蛇身体长一节,数组元素增加一个,身体节数、分数都进行相应的改变。在新位置画出蛇。
(4)如果有按键,则识别键值。如果按键为Esc键则结束游戏,程序运行结束;如果所按键为方向键,则根据该键改变代表蛇方向的变量direction的值,要考虑相反方向键无效。
4.游戏结束函数GameOver()
游戏结束,清除屏幕,输出分数,显示游戏结束信息。 5.PrScore()输出分数
在指定位置利用sprintf()将整数转换为字符串,用outtextxy()输出,bar()函数的应用是为了覆盖原来的值。
6.Closegraph ()图形结束
在显示游戏结束信息的画面时,按任意键关闭图形系统,程序结束。
12 / 14
相关推荐: