版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、计算机程序设计课程设计报告课 题 名 称 贪吃蛇游戏 班 级 学 号 姓 名 指 导 教 师 设 计 时 间 至 设 计 地 点 常熟理工学院计算机科学与工程学院目录1 需求分析12 系统分析和设计12.1 数据结构的设计和选择的理由12.2 系统模块划分和模块结构22.3 流程图32.4 数据类型、全局变量和函数说明33 程序测试和运行结果44 课程报告小结54.1分数重叠显示54.2速度太快54.3食物可能出现在蛇身上5附录a:程序源代码61 需求分析【阐述课程设计应该完成的功能】使用键盘的上下左右,来控制蛇的运动方向,esc键退出,并显示得分。2 系统分析和设计2.1 数据结构的设计和选
2、择的理由本游戏中涉及的主要数据结构是如何表示运动的蛇、食物状态等问题。2.1.1 从游戏参考画面中我们可以看到,贪吃蛇的身体是一节节的,由一个个大小相同的方块组成,那么我们可以用一个(x,y)坐标为左上角的、固定宽度的正方形来表示一节蛇身。为表示连续的多节身体,那么我们可以采用数组(或链表,或线性表)等数据结构来表示。下面以数组方式为例:struct point int x, y;struct point nodesmax_length; /蛇身数组,max_length为最大蛇长贪吃蛇是在不断的运动的,我们研究蛇的运动可以发现这样的特点:1. 蛇头由键盘控制,键盘不操作时,保持原有方向运动;
3、(用 int direction;表示) 2. 运动时,蛇身后面一节移动到前面一节的位置。当我们用nodes0表示蛇头的时候,nodes1运动到nodes0处;nodes2运动到nodes1处.。3. 吃到一个食物以后,蛇身会增加一节。即该数组中的有效数据个数加一。(用int length;表示)根据上面的情况,我们可以设计蛇的数据结构如下:struct snake struct point nodesmax_length; /蛇身数组,保存每节蛇身的坐标。max_length为最大蛇长 int length; /当前蛇长 int direction; /蛇头运动方向 int live; /蛇
4、活的,还是已经死了?2.1.2 关于食物,有两个属性:1. 坐标位置2. 状态:存在,或被吃。故我们用以下结构表示:struct food struct point position; /食物的位置 int exist; /存在?还是被吃?2.2 系统模块划分和模块结构void main() init(); /*初始化*/l=1; while(l) /*循环游戏*/ select(); /*游戏速度和结束的选择菜单*/ gameplay(); /*游戏主程序*/close(); /*关闭游戏*/2.3 流程图2.4 数据类型、全局变量和函数说明2.4.1数据类型struct point /*一
5、个存放点坐标的结构体*/int x, y; /*被多个结构体调用的基本参数,所以统一用point结构体来表示*/;struct snake /*用来模拟蛇状态的结构体*/struct point nodesmax_length; /*用来存放蛇每一节的位置*/ int length; /*蛇长*/int direction; /*蛇移动的方向*/int live; /*蛇是否活着*/ snake; /*比较形象的把蛇抽象为一个数据类型*/struct food /*用来模拟食物状态的结构体*/struct point position; /*食物的位置*/int exist; /*食物是否存在
6、*/ food;2.4.2全局变量score得分left,top,right,bottom游戏区域范围lastx,lasty用来保存最后一节蛇的位置keycode用来保存按下的键2.4.3函数说明void init(void);初始化程序,给一些初始值赋值void gameplay(void);游戏主循环void close(void); 关闭游戏void drawwall(void); 画墙void createfood(void); 创造一个食物void drawfood(void); 画出食物void drawsnake(void); 画出蛇void drawscore(void); 画
7、出分数int touchwall(void); 判断是否碰到墙int touchself(void); 判断是否碰到自己void gameover(void); 游戏结束void movesnake(void); 移动蛇int oppositedirection(int keycode); 判断是否方向有误int foodeat(void); 判断是否吃到食物void expandsnake(void); 把蛇增长一节3 程序测试和运行结果 -选择速度开始或退出-游戏运行中-游戏结束4 课程报告小结【遇到的问题及解决方法分析等】4.1分数重叠显示解决方法:每次都用一块黑的矩形覆盖setfill
8、style(1,16); bar(45,45,150,80);4.2速度太快解决方法:循环delayfor(d=0;d4;d+) delay(game_speed);4.3食物可能出现在蛇身上解决方法:依次判断,若重叠则重新生成食物void createfood() int i;label: food.position.x=left+10*(int)rand()%11); food.position.y=top+10*(int)rand()%11);for(i=0;i=snake.length-1;i+) if(snake.nodesi.x=food.position.x&snake.node
9、si.y=food.position.y)goto label;附录a:程序源代码/*writer: neolone(lb)*/#include #include #include #include #include #include #include #define true 1#define false 0#define up 0x4800#define down 0x5000#define left 0x4b00#define right 0x4d00#define esc 0x011b#define speed1 0x0231#define speed2 0x0332#define s
10、peed3 0x0433#define quit 0x0b30#define enter 0x1c0d#define max_length 100/* max length of snake nodess */#define game_speed 100 /* game speed */* data structure */struct point int x, y;struct snake struct point nodesmax_length;int length;int direction;int live; snake;struct food struct point positio
11、n;int exist; food;int score=0,max,max1,max2,max3,left=200,top=200,right=300,bottom=300,lastx,lasty,keycode,keycode2,sp,l,sel,times=1;char text80;/* functions declaration */void init(void);void gameplay(void);void close(void);void drawwall(void);void createfood(void);void drawfood(void);void drawsnak
12、e(void);void drawscore(void);int touchwall(void);int touchself(void);void gameover(void);void movesnake(void);int oppositedirection(int keycode);int foodeat(void);void expandsnake(void);void select(void);/*-*/void main() init();l=1;while(l) select(); gameplay();close();void init() int gdriver=vga ,g
13、mode=vgahi ; snake.nodes0.x=250; snake.nodes0.y=250; snake.nodes1.x=250; snake.nodes1.y=260; snake.length=2;snake.live=1;snake.direction=up;score=0; food.exist=0; initgraph (&gdriver,&gmode,c:tc20bgi); randomize();/*sui ji shu fa sheng qi*/drawwall();void close() file *fp;closegraph();if(fp=fopen(da
14、ta.txt,w)=null) /*关闭时保存最高分*/ exit(0);elsefprintf(fp,%d,%d,%d,max1,max2,max3);fclose(fp);printf(pess any key to continue);void gameplay() int keycode,d;getch();while(true) drawscore();drawwall();if (touchwall() | touchself() gameover();return;if (!food.exist) createfood();food.exist=1;drawfood();draw
15、snake();for(d=0;dsp;d+)delay(game_speed);if (bioskey(1) != 0) keycode = bioskey(0);switch(keycode) case esc:gameover();return;default: lastx=snake.nodessnake.length-1.x; lasty=snake.nodessnake.length-1.y;if (!oppositedirection(keycode) snake.direction = keycode; movesnake();if (foodeat() food.exist
16、= false;score += 10;expandsnake();void drawwall() rectangle(left,top,right+10,bottom+10);void createfood() int i;label: food.position.x=left+10*(int)rand()%11); food.position.y=top+10*(int)rand()%11);for(i=0;i=snake.length-1;i+) if(snake.nodesi.x=food.position.x&snake.nodesi.y=food.position.y)goto l
17、abel;void drawfood() setfillstyle(1,2); bar(food.position.x,food.position.y,food.position.x+10,food.position.y+10);void drawsnake() int j; setfillstyle(1,4); for(j=0;j=snake.length-1;j+) bar(snake.nodesj.x,snake.nodesj.y,snake.nodesj.x+10,snake.nodesj.y+10); void drawscore(void) setfillstyle(1,16);
18、bar(45,45,150,80); setcolor(white); sprintf(text,writer:neolone); outtextxy(170,50,text); sprintf(text,score:%5d,score); outtextxy(50,50,text);int touchwall() int x1=snake.nodes0.x; int y1=snake.nodes0.y; if(x1right|y1bottom) return true; else return false;int touchself() int i; for (i=3;imax1) max1
19、=score; break; case 2: if(scoremax2) max2=score; break; case 3: if(scoremax3) max3=score; break; default : break; void movesnake() int k; setfillstyle(1,16); lastx=snake.nodessnake.length-1.x; lasty=snake.nodessnake.length-1.y; bar(snake.nodessnake.length-1.x,snake.nodessnake.length-1.y,snake.nodess
20、nake.length-1.x+10,snake.nodessnake.length-1.y+10); for(k=snake.length-2;k=0;k-) snake.nodesk+1.x=snake.nodesk.x;snake.nodesk+1.y=snake.nodesk.y; if(snake.direction=up) snake.nodes0.y-=10; else if(snake.direction=down) snake.nodes0.y+=10; else if(snake.direction=left) snake.nodes0.x-=10; else if(sna
21、ke.direction=right) snake.nodes0.x+=10; else;int oppositedirection(int keycode) if(keycode=up&snake.direction=down) return 1; else if(keycode=down&snake.direction=up) return 1; else if(keycode=left&snake.direction=right) return 1; else if(keycode=right&snake.direction=left) return 1; else return 0;i
22、nt foodeat() if(snake.nodes0.x=food.position.x&snake.nodes0.y=food.position.y) return 1; else return 0;void expandsnake() if(keycode=up) lastx-=10; else if(keycode=down) lastx+=10; else if(keycode=left) lasty-=10; else if(keycode=right) lasty+=10; else ; snake.nodessnake.length.x=lastx; snake.nodess
23、nake.length.y=lasty; snake.length+;void select() setfillstyle(1,7); /*实现选择速度的可视化菜单*/ bar(420,220,490,310); setfillstyle(1,9); bar(430,230,480,240); setfillstyle(1,5); setcolor(white); sprintf(text,speed1); outtextxy(430,230,text); bar(430,250,480,260); sprintf(text,speed2); outtextxy(430,250,text);
24、bar(430,270,480,280); sprintf(text,speed3); outtextxy(430,270,text); bar(430,290,480,300); sprintf(text, quit ); outtextxy(430,290,text); sel=1; t=1; while(t) delay(10); if (bioskey(1) != 0) keycode = bioskey(0);switch(keycode) case up: sel-;break;case down: sel+;break;case enter: t=0;break; default
25、 : break; switch(sel%4) case 0: setfillstyle(1,9); bar(430,290,480,300); setcolor(white);setfillstyle(1,5);bar(430,230,480,240); sprintf(text,speed1); outtextxy(430,230,text); bar(430,250,480,260); sprintf(text,speed2); outtextxy(430,250,text); bar(430,270,480,280); sprintf(text,speed3); outtextxy(4
26、30,270,text); sprintf(text, quit ); outtextxy(430,290,text);break;case 1: setfillstyle(1,9); bar(430,230,480,240);setfillstyle(1,5);setcolor(white);sprintf(text,speed1);outtextxy(430,230,text);bar(430,250,480,260);sprintf(text,speed2);outtextxy(430,250,text);bar(430,270,480,280);sprintf(text,speed3)
27、;outtextxy(430,270,text);bar(430,290,480,300);sprintf(text, quit );outtextxy(430,290,text);break;case 2: setfillstyle(1,9);bar(430,250,480,260);setfillstyle(1,5);bar(430,230,480,240);setcolor(white);sprintf(text,speed1);outtextxy(430,230,text);sprintf(text,speed2);outtextxy(430,250,text);bar(430,270,480,280);sprintf(text,speed3);outtextxy(430,270,text);bar(430,290,480,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 商铺购房预售合同范本
- 地产质保维修合同范本
- 啤酒杂粮买卖合同范本
- 培训前端外包合同范本
- 城市新区购房合同范本
- 土地测绘代理合同范本
- 国际船舶租赁合同范本
- 外贸委托购销合同范本
- 国际俱乐部协议书范本
- 商铺招商服务合同范本
- 《婴幼儿营养与喂养》课件-1.2.1 维生素
- SBS防水卷材购货合同范本
- 银行销售服务型网点绩效考核指标
- 广东省深圳中考《英语》听说考试信息询问专项课件
- 《妇科内分泌疾病》课件
- 五年级 人教版 数学 上册 第五单元《用字母表示数(一)》课件
- 2025年国家电网有限公司招聘笔试参考题库含答案解析
- 数据中心暖通空调工程施工方案
- 养羊保险知识培训课件
- DB43-T 3080.2-2024 湖南省立木材积、生物量及碳系数计量监测系列模型 第2部分:杉木立木材积与生物量模型
- DB41T 1230-2016 杉木播种育苗技术规程
评论
0/150
提交评论