实训专题报告题目:贪吃蛇游戏控制台应用及proteus 仿真的实现实训名称:专业技能实训班级:学号:学生姓名:指导教师:哈尔滨工程大学2016年02月10日哈尔滨工程大学本科生专业技能实训专题报告摘要随着计算机及通讯技术的迅猛发展,人们对小游戏的追求也越来越频繁,所以就有了本文的产生:编写C语言程序实现贪吃蛇游戏。
贪吃蛇游戏是一个深受人们喜爱的游戏,一条蛇在密闭的围墙内,在围墙内随机出现一个食物,通过按键盘上的四个光标键控制蛇向上下左右四个方向移动,蛇头撞到食物,则表示食物被蛇吃掉,这时蛇的身体长一节,同时计10分,接着又出现食物,等待被蛇吃掉,如果蛇在移动过程中,撞到墙壁或身体交叉蛇头撞到自己的身体游戏结束。
作为一个完整的程序,必须考虑人机交流与用户体验。
游戏的界面不能太丑,更不能连个简单的界面都没有。
游戏应该有个比较漂亮的界面,在有必要硬件支持和软件的支持下,游戏开发者必须最大限度的使游戏美观。
游戏的美观是一方面,游戏的内在素质是另一方面。
一个游戏的优劣,最终由玩家决定。
在游戏与玩家见面之前,游戏开发者要设计一种让玩家投入的游戏模式,并且在一定的游戏规则下进行。
在实现C语言部分的设计后,我们也完成了在proteus的环境中实现仿真,将程序进行迁移扩展,来达到通过仿真也能实现在单片机模拟环境中进行游戏。
使得游戏更具有趣味性和新鲜感。
关键词:贪吃蛇;C语言;proteus仿真哈尔滨工程大学本科生专业技能实训专题报告1系统设计与算法分析1.1需求分析与系统总体设计根据课题所在项目的要求,需要开发出一款贪吃蛇小游戏,既能实现在控制台进行操作,同时也能将代码迁移到指定环境(protues仿真)中并实现相应的功能。
这个游戏是人们生活中不可或缺的,从小到大,真正伴随我们成长的东西,游戏占有着很重要的地位.不论是一个玩具,还是一个能和伙伴一起开心的小游戏,都是能给我们留下很多美好的回忆.所以不论是什么样的游戏,只要它能迎合人们内心的某种需求,它的市场总会是好的,而贪吃蛇就是这样一个深受人们喜爱的游戏。
一条蛇在密闭的围墙内,在围墙内随机出现一个食物,通过按键上的四个光标键控制向上下左右四个方向移动,蛇头撞到食物,则表示食物被吃掉,这时蛇身体长一节,同时计10分,接着又会随机的出现食物,等待被蛇吃掉,如果蛇在移动过程中,撞到墙壁或身体交叉蛇头撞到自己的身体则游戏结束。
结合以上分析,我们可以得到整个游戏的系统流程图,如图1.1。
1哈尔滨工程大学本科生专业技能实训专题报告2图1.1 系统流程图根据系统流程图,我们大致将游戏分为六个模块:开始界面模块、创建地图边界模块、创建食物模块、创建蛇模块、蛇移动控制模块和游戏结束模块。
下面会分别进行说明。
1.2 游戏开始与结束模块设计该模块为附加模块,不是主要模块,主要是为了增加游戏趣味性而设计。
这一部分是由一个组员提出的设想,由于不是很难,所以很快就完成了。
在该模块我主要是参与了控制台游戏开始和结束界面的编写,而仿真部分的界面则是由另一组员完成的。
控制台部分的开机界面比较简单,就是以默认创建好的地图为开机界面,而关机界面,我设计成了一个哭脸,在游戏失败后显示,并完成退回到主界面的操作。
protues 仿真部分的开机关机界面也很简单。
开机动画我们仿照了3D 贪吃蛇的开机哈尔滨工程大学本科生专业技能实训专题报告3界面,是一个萌萌的蛇头慢慢出现,吃掉“snake ”的字符,由此引导玩家进入游戏界面,如下图1.2.1;关机界面则在蛇头撞到边界或蛇头位置与蛇身重合时,游戏结束并弹出结束界面“游戏结束,别气馁 再来一次”。
由于单片机程序不同于控制台,故结束界面结束后会重新进入游戏。
如下图1.2.2所示。
由于控制台部分不是本次实训的重点,故而不做重点讲解。
图1.2.1 仿真部分开机截图哈尔滨工程大学本科生专业技能实训专题报告图1.2.2仿真部分关机截图1.3 食物与蛇的创建模块基于以上需求分析,也可以将核心拆解为两个部分:也就是食物与蛇。
为了便于理解,定义两个结构体:Food与snake。
表示食物和蛇的矩形都设计为10 X 10个像素单位,食物的基本数据域为它所出现的位置,用X和y 坐标表示,则矩形块用函数rectangle(x,y,x+10,y+10)或rectangle(x,y,x+10,y-10)可以画出。
由于每次只出现一个食物,而食物被吃掉后,才出现下一个食物,所以设定yes 表示是否要出现一个食物的变量。
蛇的一节身体为一个矩形块,这样表示每个矩形块只需起点坐标x和y。
身体是不断增长的,所以用数组存放每一节的坐标,最大设定为N=200 ,node表示当前节数。
另外还需要保存蛇移动方向的变量direction 和表示生命的变量 life ,一但life 为1,则蛇死,游戏结束。
所以程序功能的实现就是数组的操作。
第一部分是Food结构体的创建:#define N 200struct Food{int x; /* 食物的横坐标 */int y; /* 食物的纵坐标 */int yes; /* 判断是否出现食物的变量 */ } food; /* 食物的结构体 */4哈尔滨工程大学本科生专业技能实训专题报告第二部分是snake结构体的创建:struct snake{int x[N]; /* 蛇的横坐标 */int y[N]; /* 蛇的纵坐标 */int node; /* 蛇的节数 */int direction; /* 蛇移动方向 */int life; /* 蛇生命,0活着,1死亡 */ }snake;1.4创建地图边界模块游戏界面:用点表示墙壁边界,利用void write_dat(unsigned char dat)函数及void set_xy(unsigned char x,unsigned char y)函数和数组的结合对游戏边界进行初始化,并利用void write_hanzi(unsigned char x,unsigned char y,unsigned char code *dat)函数及void write_shuzi(unsigned char x,unsigned char y,unsigned char code *dat)函数对屏幕右侧得分、等级进行显示;由于这个模块我没有直接参与,所以不做过多的介绍。
1.5蛇移动控制模块用LCD屏右侧的四个开关LEFT、RIGHT、UP、DOWN控制蛇移动的方向, PAUSE开关控制游戏的暂停。
游戏初始等级为低级,随着分数的增加等级会升至中级、高级,根据等级给定相关食物的分数,每吃到一个食物加上相应分数,并在显示屏右侧显示得分和等级。
如下图1.5.1。
这一部分,我只负责蛇死亡的判定部分,在这里不做详细说明,详情在下面才测试5哈尔滨工程大学本科生专业技能实训专题报告部分再提及。
图1.5.1 蛇移动算法流程图2 系统实现与测试整个系统是在我们小组四个人的共同努力下完成的,所以下文的介绍也有所侧重,主要针对我个人完成的部分进行介绍。
2.1游戏功能的实现在这部分,我分别从主要功能、界面功能、操作功能三方面进行介绍。
2.1.1主要功能6哈尔滨工程大学本科生专业技能实训专题报告(1)进入游戏界面,在游戏过程随着蛇吃到食物的数量增加,游戏难度随之加大即蛇的行进速度变快。
(2)当游戏难度加大时,玩家等级增加,同时吃到食物的分值增加,显示器右侧的显示玩家得分和游戏等级情况。
2.1.2界面功能(1)在游戏界面有一个显示当前等级情况的窗口,方便用户来了解自己的等级。
(2)在游戏界面有一个显示当前得分情况的窗口,方便用户来了解自己的战绩。
2.1.3操作功能游戏的主要操作是UP、DOWN、LEFT、RINGT、PAUSE五个按钮,分别表示向上、下、左、右移动和游戏暂停。
2.2蛇移动模块的实现该模块主要以判定为主,首先要先判断,在蛇前进的四个方向上有没有食物,以向上为例:if (status == w){nexthead->x = head->x;nexthead->y = head->y - 1;if (nexthead->x == food->x && nexthead->y == food->y)//如果下一个有食物//eatFood(nexthead);else //如果没有食物//noFood(nexthead);}7哈尔滨工程大学本科生专业技能实训专题报告这样在四个方向分别进行判断后即可确定蛇的移动方向。
2.3蛇死亡方式的实现蛇的死亡方式分为两种:一种为咬到自身儿死亡;一种为撞到游戏边界(墙)而死亡。
下面分别进行介绍。
首先为咬到自身死亡,我设置为函数dead1():int dead1() //咬到自身死亡{snake * s0;s0 = head->next;while (s0 != NULL){if (s0->x == head->x && s0->y == head->y){return 1;}s0 = s0->next;}return 0;}然后是第二种死亡方式,撞墙而死,我设置为函数dead2():void dead2() //撞墙而死{if (head->x == 0 || head->x == length || head->y == 0 || head->y == height) {gameOver = 1;end();}}2.4等级模块的实现为了增加游戏的趣味性,我们给游戏设计了自带加速功能,每五个食物点为一个等级,依次设置低级、中级、高级的等级,每上升一个等级,贪吃蛇的行进速度就会加快,得到的分值也会有相应的递增(低级每吃到一个食物得1分,中级3分,高级6分),使用户享受更加刺激的体验。
这部分不是我一个人完成的,还有小组另一个人,我们两个共8哈尔滨工程大学本科生专业技能实训专题报告9同完成的。
最后实现的界面如下图2.4.1。
图2.4.1 游戏低、中、高等级截图3 结论两周的实训时间真的过得很快,在这么短的时间内,我的C 语言知识得到了温习,编程能力得到了很大幅度的提高,我觉得这次实习真的很重要,而且是恰逢其时,当然通过自己编程的过程,也有了一些心得:编程要的是正确的结果,体会的是艰辛的过程,收获的是好心情。
首先编程的时候你不能觉得这是一个繁琐的过程,在遇到出错的时候要有信心解决,不要害怕出错,不能忽略细节,尤其是对标点以及输入输出函数,要正确使用。
其次,编程要有一个扎实的知识储备,没把课本看好,没把例题看好,不会编出正确的程哈尔滨工程大学本科生专业技能实训专题报告序,同时,如果不多看程序,不断吸收别人的编程思想,就不会编出精彩的程序;当然也不能忽略与别人讨论与请教,在这过程中,我们可以相互交流编程想法,找到解决问题的最佳路径,这种团结协作的精神也是必须要有的。