C语言贪吃蛇实验报告

上传人:无*** 文档编号:93765998 上传时间:2022-05-21 格式:DOC 页数:21 大小:130KB
收藏 版权申诉 举报 下载
C语言贪吃蛇实验报告_第1页
第1页 / 共21页
C语言贪吃蛇实验报告_第2页
第2页 / 共21页
C语言贪吃蛇实验报告_第3页
第3页 / 共21页
资源描述:

《C语言贪吃蛇实验报告》由会员分享,可在线阅读,更多相关《C语言贪吃蛇实验报告(21页珍藏版)》请在装配图网上搜索。

1、C语言程序设计报告题目:贪吃蛇游戏的程序设计院系:西语学院 英语教育6班姓名:学号:整理为word格式1.1 题目:设计贪吃蛇小游戏1.2 题目的要求:玩家通过键盘控制蛇在地图上寻找食物,蛇吃下食物,可以加分,碰到四壁游戏结束。1.3 设计的步骤:l 分析设计题目的要求,即需求分析。l 总体设计,确定所需模块及模块间调用关系,定义系统中使用的数据类型。l 详细设计,确定每个模块的功能,绘制主要函数的流程图。l 编写程序代码,调试程序使其能正确运行。要求书写规范,注意采用缩进格式。函数名、变量名要见文晓意,注释要简而不失、详而不缀。设计完成的软件要便于操作和使用。l 程序测试,发现程序中存在的错

2、误并改正。l 完成报告。2 详细设计说明2.1 课程设计的要求:通过游戏程序设计,提高编程兴趣与编程思路,巩固C语言中所学的知识,合理的运用资料,实现理论与实际相结合。l 收集资料,分析课题,分解问题,形成总体设计思路;l 对于设计中用到的关键函数,要学会通过查资料,弄懂其用法,要联系问题进行具体介绍;l 上机调试,查错,逐步分析不能正常运行的原因,确保所设计的程序正确,并且能正常运行;整理为word格式l 完成课程设计报告。 2.2 程序的功能:贪吃蛇游戏是一个经典小游戏,一条蛇在封闭围墙里,围墙里随机出现一个食物,通过按键盘四个光标键控制蛇向上下左右四个方向移动,蛇头撞倒食物,则食物被吃掉

3、,蛇身体长一节,同时记10分,接着又出现食物,等待蛇来吃,如果蛇在移动中撞到墙或身体交叉蛇头撞倒自己身体游戏结束。2.3 课程设计的思想: 程序关键在于表示蛇的图形及蛇的移动。用一个小圆点来表示蛇的一节身体,身体每长一节,增加一个圆点,蛇头用四节来表示。移动时必须从蛇头开始,所以蛇不能向相反的方向移动,如果不按任意键,蛇自行在当前方向上前移,如果按与蛇运动方向相反的方向键,此游戏就会暂停,再按想前的方向键才能继续游戏,但按下有效方向键后,蛇头朝着该方向移动,一步移动一节身体,所以按下有效方向键后,先确定蛇头的位置,而后蛇的身体随蛇头移动,图形的实现是从蛇头新位置开始画出蛇,这时,由于未清屏的原

4、因,原来的蛇的位置和新蛇的位置差一个单位,所以看起来蛇多一节身体,所以将蛇的最后一节用背景色覆盖。食物的出现与消失也是画一个圆点和覆盖原来的圆点。为了便于理解,定义两个结构体:食物与蛇。2.4 设计程序中的调试过程 在调试过程中,遇到了很多的问题,比如,因为使用的刷屏函数,所以屏幕经常出现闪烁的情况,但是通过我和我的伙伴们的共同努力和学习,通过网上和书籍的查阅,我们也得到了很多的收获,我们的小组也在中真正的学会了很多的东西,这次实训给我们带来了很大的收获。可以按照程序运行的错误提示对原程序进行修改,在调试过程中有时也会遇到不懂的问题,我去图书馆或上网查阅一些资料或者是向老师请教也解决了对源程序

5、一一修改直到运行成功。2.5 设计的流程图总程序设计图如图1所示:整理为word格式欢迎词和游戏的基本操作说明开始游戏 初试化界面和蛇身 随机放置食物 方向键控制蛇的运动方向 Y 是否吃到食物 N N Y 蛇变长,并总分加10分 游戏结束,是否继续是否碰壁或结尾 Y 退出游戏 N 图1 程序设计流程图方向键控制的设计流程图如图2所示:其中upmove函数控制蛇向上运动,downmove函数控制蛇向下运动,leftmove函数控制蛇向左运动,rightmove函数控制蛇向右运动。整理为word格式开始游戏 按方向键的右键按方向键的左键按方向键的下键按方向键的上键则使用函数leftmove(sna

6、ke);则使用函数downmove(snake);则使用函数rightmove(snake);则使用函数upmove(snake);蛇向下运动蛇向左运动蛇向右运动蛇向上运动通过方向键控制蛇身去吃食物图2 方向键控制方向键控制的设计流程图蛇吃食物蛇身变长的设计流程图如图3所示:开始游戏通过控制部分控制蛇运动是否能吃到食物 N Y通过使用函数:booljudgeGO(int(*sna)17)score=(count-3)*10 使总分加10分Count+使蛇身加长 图3 蛇吃食物蛇身变长的设计流程图整理为word格式2.6 程序的总体设计思想l 利用人工绘图法,制作美观的游戏界面.l 通过随机函数

7、产生随机数,控制游戏过程食物的出现.l 定义键盘操作,控制游戏过程蛇的移动方向.l 画出边界,并判断游戏是否结束.统计游戏过程蛇吃的食物数量,计算并输出游戏成绩.3 软件的使用说明3.1 建立游戏的过程说明先打开 Microssft Visual C+ 程序,进入Microssft Visual C+ 程序后打开文件菜单,点机新键命令按钮,先建立一个Win32 Console Application工程,建立工程时可填写工程名称和你所建工成要存放的位置,点机确定按钮,再点机一个空工程类型的控制台程序,再点机完成,然后点机确定按钮,此时一个所要建立的工程就已经建立好,然后再点机文件中的新建按钮,

8、然后再建立一个C+ Source File 文件,并填写文件名称,然后点机确定按钮,此时所要建立的工程和文件都已建立完毕,此时您就可以把贪吃蛇游戏的代码复制粘贴到你刚刚建立的工程和文件里面了,然后点机组建命令中的编译和组建命令,最后点机执行命令就可进入贪吃蛇游戏中了。3.2 执行游戏的过程说明 进入贪吃蛇游行中后,首先弹出一个界面,上面出现的是欢迎词和游戏的简单说明,可点机任意键开始游戏,此游戏是由键盘的四个方向键进行控制的,吃一个点,蛇身就长长一端,总分数就加10分,如果碰壁或结尾游戏则结束,最后出先一个界面,上面显示你此次游戏的总分数。希望我这个小游戏能让你玩的开心。整理为word格式5.

9、 收获及体会在设计这个程序中我主要学会了如何运用以下有关C语言和C+的知识:1)函数定义是要做到顾名思义是很重要的,它对读程序的人正确认识程序十分重要,在修改这个程序的过程中也能很快找到程序各模块的作用,大大增加了程序的可读性。2)分析函数先从main()函数入手。Main()函数是C+源程序编译时的开始,从main()函数开始读函数可将其他函数的功能理解得更透彻。3)在做程序的时候先列框架,将这个程序所要达到的目的(功能)分析出来,选择正确的数据结构然后在将程序模块化,按照模块编写函数更加简单合理。4)我还了解了很多的库函数的作用,如字符串函数中有很多对字符串进行处理的函数,起功能我都有所了

10、解。 5)学会了有关头文件的使用方法,及系统调配问题的解决方法等。 6)在调试过程中,遇到了很多的问题,比如,因为使用的刷屏函数,所以屏幕经常出现闪烁的情况,但是通过我和我的伙伴们的共同努力和学习,通过网上和书籍的查阅,我们也得到了很多的收获,我们的小组也在中真正的学会了很多的东西,这次实训给我们带来了很大的收获。可以按照程序运行的错误提示对原程序进行修改,在调试过程中有时也会遇到不懂的问题,我去图书馆或上网查阅一些资料或者是向老师请教也解决了对源程序一一修改直到运行成功。整理为word格式附录 部分程序代码清单#include#include#include#include#include#

11、define HEAD 300#define FOOD 400#define v_sleep 100/*改变sleep的大小可改变蛇的运动速度,此数值越小蛇的运动速度越快*/int score=0; /*定义了一个全局变量来在整个程序中统计总成绩*/*-欢迎词-*/void welc() printf(nnnnnnttt欢迎来到【贪吃蛇】小游戏nn);printf(ttt蛇身加长一段就加10分nn); printf(tt此游戏用键盘的方向键控制即可。若想退出请按Esc建。n); printf(nttt相反的方向的话是暂停。n); printf(nttt请按任意键进入游戏。); getch();

12、/*-*/*-人工画图程序-*/void drawpt(int a,int x,int y) /*利用人工绘图程序来画出蛇运动的范围*/ if(x=0) printf(tt); return ; if(y=0) printf(ttt); return ; if(x=16) printf(n); return ; if(y=16) printf(t);整理为word格式 if(x0&x0&y16) if(a=0) printf();/*用空心圆来表蛇改运动的总范围*/ else printf();/*用实心圆来蛇的长度和食物的出现地点*/ return ; void draw(int (*sna

13、)17) int i,j;system(cls); /*刷屏工具*/for(i=0;i17;i+) /*区域范围的大小*/ for(j=0;j17;j+) drawpt(snaij,j,i); printf (ttt总成绩为%d分,score);/*-*/*-取随机数,出现食物用-*/int randno() /*利用这个随机函数来控制食物的随机出现*/ srand(time(NULL); return rand()%15+1;/*随机函数出现食物时的范围,防止食物出现在范围之外*/*-*/*-判断游戏是否结束-*/bool judgeGO(int (*sna)17) int x,y,i=0,

14、max=0,count=0; for(x=0,y=0;y17;y+) if(snaxy=HEAD)/*判断头部是否在最外层的*/ return false; for(x=16,y=0;y17;y+) if(snaxy=HEAD) return false; for(y=0,x=0;x17;x+) if(snaxy=HEAD) return false;整理为word格式 for(y=16,x=0;x17;x+) if(snaxy=HEAD) return false; for(x=0;x16;x+) for(y=0;y16;y+) if(maxsnaxy) if(snaxy!=HEAD&sna

15、xy!=FOOD) max=snaxy;/*这个也是求头部之后的*/ for(i=0;imax;i+) for(x=1;x16;x+) for(y=1;y16;y+) if(snaxy=i+1) count+;/*这个判断想了好久的*/ score=(count-3)*10;/*计算蛇的总成绩*/ if(count!=max)/*判断身体部分是否连续*/return false; return true;/*-*/*-游戏结束显示-*/void gameover() system(cls); printf(nnnnnnnn); printf(tttt); printf(游戏结束nn);prin

16、tf(tttt);printf (此次总成绩为%d分nn,score); printf(tttt);printf (请您再接再厉nn);printf(ttt); printf(按Esc键退出,按任意键重新开始。n);/*-*/*全程标记法,从尾巴开始123456.HEAD,食物是FOOD。*/void marksn()整理为word格式 void downmove(int (*sna)17);/*用键盘的方向键的下键来控制蛇向下运动*/ void upmove(int (*sna)17);/*用键盘的方向键的上键来控制蛇向上运动*/ void leftmove(int (*sna)17);/*

17、用键盘的方向键的左键来控制蛇向左运动*/ void rightmove(int (*sna)17);/*用键盘的方向键的右键来控制蛇向右运动*/ int judgeF(int (*sna)17,int keym); int snake1717=0;/*-各种东西初始化-*/ int x=1,y=7,key,key1; snake11=1; snake12=2; snake13=3; snake23=HEAD; while(snakexy!=0) x=randno(); y=randno(); snakexy=FOOD; draw(snake);/*-*/*-控制的部分-*/ while(jud

18、geGO(snake) key=getch(); switch(key) case 72: while(!kbhit()&key1!=80&judgeGO(snake)/*这个函数kbhit()自己查一下吧控制输入很好*/ if(judgeF(snake,key) draw(snake); Sleep(v_sleep);/*Sleep函数在着是个延迟函数,也可在呈现头改变v_sleep的大小来控制蛇的运动速度*/ continue; upmove(snake);/*用键盘的方向键的上键来控制蛇向上运动*/ draw(snake); key1=key;/*这里的key1是就来标记上一步的方向,这

19、样相反的方向就暂停了*/ Sleep(v_sleep);/*Sleep函数在着是个延迟函数,也可在呈现头改变v_sleep的大小来控制蛇的运动速度*/ break; case 80:整理为word格式 while(!kbhit()&key1!=72&judgeGO(snake) if(judgeF(snake,key) draw(snake); Sleep(v_sleep);/*Sleep函数在着是个延迟函数,也可在呈现头改变v_sleep的大小来控制蛇的运动速度*/ continue; downmove(snake);/*用键盘的方向键的下键来控制蛇向下运动*/ draw(snake); k

20、ey1=key; Sleep(v_sleep);/*Sleep函数在着是个延迟函数,也可在呈现头改变v_sleep的大小来控制蛇的运动速度*/ break; case 75: while(!kbhit()&key1!=77&judgeGO(snake) if(judgeF(snake,key) draw(snake); Sleep(v_sleep);/*Sleep函数在着是个延迟函数,也可在呈现头改变v_sleep的大小来控制蛇的运动速度*/ continue; leftmove(snake);/*用键盘的方向键的左键来控制蛇向左运动*/ draw(snake); key1=key; Slee

21、p(v_sleep);/*Sleep函数在着是个延迟函数,也可在呈现头改变v_sleep的大小来控制蛇的运动速度*/ break; case 77: while(!kbhit()&key1!=75&judgeGO(snake) if(judgeF(snake,key) draw(snake); Sleep(v_sleep);/*Sleep函数在着是个延迟函数,也可在呈现头改变v_sleep的大小来控制蛇的运动速度*/ continue; rightmove(snake);/*用键盘的方向键的右键来控制蛇向右运动*/ draw(snake); key1=key; 整理为word格式 Sleep(

22、v_sleep);/*Sleep函数在着是个延迟函数,也可在呈现头改变v_sleep的大小来控制蛇的运动速度*/ break; case 27: exit(0); default: switch(key1) case 72: while(!kbhit()&judgeGO(snake) upmove(snake);/*上键函数控制蛇向上运动*/ draw(snake); break; case 80: while(!kbhit()&judgeGO(snake) downmove(snake);/*下键函数控制蛇向下运动*/ draw(snake); break; case 75: while(!

23、kbhit()&judgeGO(snake) leftmove(snake);/*左键函数控制蛇向左运动*/ draw(snake); break; case 77: while(!kbhit()&judgeGO(snake) ) rightmove(snake);/*右键函数控制蛇蛇向右运动*/ draw(snake); break; /*-*/*-是否继续游戏-*/ gameover();/*判断游戏是否继续的函数*/ if(getch()=27) exit(0); else 整理为word格式 marksn(); getch(); /*-*/*-*/*-上下左右移动神马的-*/void

24、downmove(int (*sna)17)/*控制蛇向下运动的函数*/ int x=0,y=0,mark=0; for(x=0;x16;x+) for(y=0;y16;y+) if(snaxy!=0&snaxy!=HEAD&snaxy!=FOOD) snaxy=snaxy-1;/前面已经说了,12345.标记法,减去1的话,除了头部以外其他的就移动了。 for(x=0;x16;x+) for(y=0;y16;y+) if(marksnaxy) if(snaxy!=HEAD&snaxy!=FOOD) mark=snaxy;/这个是求头部之后的值。 for(x=0;x16;x+) for(y=0

25、;y16;y+) if(snaxy=HEAD) snax+1y=HEAD;/头部的移动, snaxy=mark+1;/头部的赋值。 return; void upmove(int (*sna)17)/*控制蛇向上运动的函数*/ int x=0,y=0,mark=0;整理为word格式 for(x=0;x16;x+) for(y=0;y16;y+) if(snaxy!=0&snaxy!=HEAD&snaxy!=FOOD) snaxy=snaxy-1; for(x=0;x16;x+) for(y=0;y16;y+) if(marksnaxy) if(snaxy!=HEAD&snaxy!=FOOD)

26、 mark=snaxy; for(x=0;x16;x+) for(y=0;y16;y+) if(snaxy=HEAD) snax-1y=HEAD; snaxy=mark+1; return; void leftmove(int (*sna)17)/*控制蛇向左运动的函数*/ int x=0,y=0,mark=0; for(x=0;x16;x+) for(y=0;y16;y+) if(snaxy!=0&snaxy!=HEAD&snaxy!=FOOD) snaxy=snaxy-1; for(x=0;x16;x+)整理为word格式 for(y=0;y16;y+) if(marksnaxy) if(

27、snaxy!=HEAD&snaxy!=FOOD) mark=snaxy; for(x=0;x16;x+) for(y=0;y16;y+) if(snaxy=HEAD) snaxy-1=HEAD; snaxy=mark+1; return; void rightmove(int (*sna)17)/*控制蛇向右运动的函数*/ int x=0,y=0,mark=0; for(x=0;x16;x+) for(y=0;y16;y+) if(snaxy!=0&snaxy!=HEAD&snaxy!=FOOD) snaxy=snaxy-1; for(x=0;x16;x+) for(y=0;y16;y+) i

28、f(marksnaxy) if(snaxy!=HEAD&snaxy!=FOOD) mark=snaxy; for(x=0;x16;x+) 整理为word格式 for(y=0;y16;y+) if(snaxy=HEAD) snaxy+1=HEAD; snaxy=mark+1; return; int judgeF(int (*sna)17,int keym) int randno(); int x,y,mark=0,i=randno(),j=randno(); for(x=0;x16;x+) for(y=0;y16;y+) if(marksnaxy) if(snaxy!=HEAD&snaxy!=

29、FOOD) mark=snaxy; for(x=0;x16;x+) for(y=0;y16;y+) if(snaxy=HEAD) if(snax-1y=FOOD&keym=72) snax-1y=HEAD; snaxy=mark+1; while(snaij!=0) i=randno(); j=randno(); snaij=FOOD; return 1; if(snax+1y=FOOD&keym=80) snax+1y=HEAD; snaxy=mark+1;整理为word格式 while(snaij!=0) i=randno(); j=randno(); snaij=FOOD; return

30、 1; if(snaxy+1=FOOD&keym=77) snaxy+1=HEAD; snaxy=mark+1; while(snaij!=0) i=randno(); j=randno(); snaij=FOOD; return 1; if(snaxy-1=FOOD&keym=75) snaxy-1=HEAD; snaxy=mark+1; while(snaij!=0) i=randno(); j=randno(); snaij=FOOD; return 1; return 0;/*-*/*-主函数没什么内容-*/int main(void) welc(); marksn(); return 0;运行结果:整理为word格式初始界面如图4所示:图4游戏开始如图5所示:图5结束界面如图6所示:图6 友情提示:本资料代表个人观点,如有帮助请下载,谢谢您的浏览! 整理为word格式

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!