贪吃蛇课程设计实验报告模板.doc





《贪吃蛇课程设计实验报告模板.doc》由会员分享,可在线阅读,更多相关《贪吃蛇课程设计实验报告模板.doc(25页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、 荆楚理工学院 课程设计成果 学院: 计算机工程学院 _班级: 计算机科学与技术一班 学生姓名: 焦润 学号:07 设计地点(单位):A5201 设计题目:贪吃蛇游戏 完成日期: 2015 年 07 月 05 日 指导教师评语:_ 成绩(五级计分制)_教师签名_ 目录一、需求分析31.1设计目的31.2设计内容3二、概要设计4三、详细设计5四、测试分析12五、用户使用说明15六、总结156.1、需求分析方面156.2、数据结构156.3、遇到的问题157、附录(程序源代码)16一、 需求分析1.1设计目的 贪吃蛇是家喻户晓的益智类小游戏,选择这个题目一是为了将我们所学的知识加以运用,二是一直以
2、来贪吃蛇这个小游戏就比较吸引人,它的实现对于以前的我们而言都是很神秘的。我们希望通过自己所学的知识把它剖析开来,真真正正地了解它的本质和精髓。同时更进一步地掌握c语言、c+(本实验是用c+进行开发的)以及数据结构的理论知识与实际应用,熟悉基本的游戏软件开发过程。根据分析后的贪吃蛇结构设计出相应的游戏流程,主要内容包括:游戏开始,定义活动范围(Map),随机出现食物,方向控制,游戏结束,分数以及难度的显示。1.2设计内容1.通过输入地图长度、宽度,划出snake活动的区域,同时选择游戏难度,游戏难度通过移动速度来决定。2.食物的随机生成3. 用键盘上的WASD键对snake的活动方向进行控制。蛇
3、身方向的处理,控制蛇头的移动,定一个双向链表,用来保管每次移动完以后,每一节蛇身的位置,下一次的时候,每一个蛇身读取前一个蛇身的坐标,就可以实现蛇的整体移动。移动完以后,新的坐标被保管进数组,如此一直循环下去。选择的数据结构:双向链表、队列、广度优先搜索4.撞墙和撞到本身,撞墙判断蛇头坐标是否到边界。撞到本身,做一个循环判断蛇头的坐标是否和其他蛇身相等。流程图如下:二、概要设计功能块各函数列表:bool Auto:bfs(int sx,int sy,int ex,int ey)/广度优先搜索函数,用于搜索路径void snake:add_head(int xx,int yy)/增加蛇头结点vo
4、id snake:del_tail()/删除蛇尾结点void Map:initMap()/初始化地图void Map:outputMap()/打印出游戏当前的状态void move:get_food()/随机生成食物int move:movesnake()/移动蛇身bool move:turn_dir(char op)/snake移动方向控制bool game()/开始游戏,设置地图,并选择游戏模式void welcome()/进入游戏结构体细分功能:struct point int x,y,step;/储存搜索状态 int path900;struct snake_node int x;/蛇
5、头结点横坐标 int y;/蛇头结点纵坐标 int rank;/第几个蛇结点;三、详细设计/广度优先搜索函数bool Auto:bfs(int sx,int sy,int ex,int ey) /BFS在选择 自动 后,调用该函数搜索 point in,out; int i,j,step,x,y,way,len; int d42=-1,0,1,0,0,-1,0,1; int g84=0,1,2,3, 0,3,1,2, 3,2,0,1, 1,2,0,3, 1,3,0,2, 2,1,3,0, 2,0,3,1, 3,1,0,2; memset(vis,0,sizeof(vis); memset(pa
6、th,0,sizeof(path); list:iterator it=s.l.begin(); for(;it!=s.l.end();it+) x=it-x; y=it-y; visxy=it-rank; in.x=sx; in.y=sy; in.step=0; len=s.l.size(); while(!q.empty() q.pop(); q.push(in); while(!q.empty() out=q.front(); q.pop(); if(out.x=ex & out.y=ey) for(j=0;jout.step;j+) pathj=out.pathj; return tr
7、ue; step=out.step+1; way=rand()%8; for(i=0;i=len ) visxy=visout.xout.y+1; in.x=x; in.y=y; in.step=step; for(j=0;jrank+1; l.push_front(temp); /以下 用于改变蛇头图标 和 第二个蛇结点图标 if(m.dir=up) f.mapxxyy=30; else if(m.dir=down) f.mapxxyy=31; else if(m.dir=lef) f.mapxxyy=17; else f.mapxxyy=16; if(l.size()1) list:ite
8、rator it; it=l.begin(); it+; xx=it-x; yy=it-y; f.mapxxyy=body; /删除蛇尾结点函数void snake:del_tail() int xx,yy; list:iterator it; it=l.end(); it-; xx=it-x; yy=it-y; f.mapxxyy= ; /将蛇尾变为 l.erase(it);/初始化地图函数void Map:initMap() for(int i=0;imap_len;i+) for(int j=0;jmap_wide;j+) if(i=0 | i=map_len-1 | j=0 | j=m
9、ap_wide-1) mapij=#; else mapij= ; /打印函数void Map:outputMap() for(int i=0;imap_len;i+) for(int j=0;j1)-2)printf(t当 前 得 分 : %d,m.num); if(i=(map_len1) printf(t当 前 难 度 : %d,m.lv); if(i=(map_len1)+2)printf(t 最 高 分 : %d,Best_score); puts(); /随机生成食物函数void move:get_food() struct empty_gard int x,y; temp900;
10、 int tnum=0; for(int i=1,len=map_len-1;ilen;i+) /把空格找出来 for(int j=1,wide=map_wide-1;jx; int y=s.l.begin()-y; if(dir=up) x-; /根据方向移动蛇 if(dir=down) x+; if(dir=lef) y-; if(dir=rig) y+; if(f.mapxy!= & f.mapxy!=food) f.outputMap();PlaySound(TEXT(death.wav), NULL, SND_ASYNC | SND_NODEFAULT); /播放音乐的 puts(n
11、nttGAME OVER!nn); puts(nnPlay Again? YES press Y ; NO press OtherKeynn); if(m.numBest_score) Best_score=m.num; char op; op=getch(); if(op=Y | op=y) return 1; else return 0; else if(f.mapxy=food) PlaySound(TEXT(eat.wav), NULL, SND_ASYNC | SND_NODEFAULT); s.add_head(x,y); num+; get_food(); if(num & nu
12、m%3=0 & lvmost_difficult) /每吃3个食物难度+1 lv-; else s.add_head(x,y); s.del_tail(); return 2; /返回2表示没game over 继续游戏 /控制移动方向函数bool move:turn_dir(char op) if(op=w | op=W | op=1) & dir!=down) dir=up;return true; if(op=s | op=S | op=2) & dir!=up) dir=down;return true; if(op=a | op=A | op=3) & dir!=rig) dir=l
13、ef;return true; if(op=d | op=D | op=4) & dir!=lef) dir=rig;return true; return false;/开始游戏函数bool game() int temp; cout输入地图长度(1030):map_len; if(10=map_len & map_len=30) break; coutInput Againendl; cout输入地图宽度(1030):map_wide; if(10=map_wide & map_wide=30) break; coutInput Againendl; while(true) cout选择游
14、戏难度(Lv.most_difficult20 等级越低,难度越大):m.lv; m.num=(20-m.lv)*3; if(most_difficult=m.lv & m.lv=20) break; coutInput Again1; /下面几句用来初始化游戏 加入两个蛇结点和第一个食物 int mid_y=map_wide1; s.add_head(mid_x,mid_y); s.add_head(mid_x,mid_y+1); m.get_food(); f.outputMap(); puts(t用W S A D 控制蛇的前进方向,难度会随着分数变得困难。); char op=getch
15、(); if(op=y | op=Y) while(1) /选择自动模式 一直调用bfs()搜索路径直到所不到可行方案为止 bool gzx; for(int i=0;ix,s.l.begin()-y,m.food_x,m.food_y); if(gzx) break; if(gzx) int l=strlen(w.path); for(int i=0;il;i+) system(cls); m.turn_dir(w.pathi); /将搜索到的路径(方向) 逐个用来调用turn_dir() 然后移动一步 if(temp=m.movesnake()=0) return false; else
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 贪吃 课程设计 实验 报告 模板

限制150内