贪吃蛇实验报告_第1页
贪吃蛇实验报告_第2页
贪吃蛇实验报告_第3页
贪吃蛇实验报告_第4页
贪吃蛇实验报告_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、计算机程序设计课程设计报告课题名称贪吃蛇游戏班级学号姓名指导教师设计时间至设计地点常熟理工学院计算机科学与工程学院常熟理工学院计算机科学与工程学院目录1需求分析12系统分析和设计 12.1数据结构的设计和选择的理由 12.2系统模块划分和模块结构 22.3流程图22.4数据类型、全局变量和函数说明 33程序测试和运行结果 44课程报告小结 54.1分数重叠显示54.2速度太快54.3食物可能出现在蛇身上5附录A :程序源代码6 C程序设计课程设计1需求分析【阐述课程设计应该完成的功能】使用键盘的上下左右,来控制蛇的运动方向,ESC键退出,并显示得分。2系统分析和设计2.1数据结构的设计和选择的

2、理由本游戏中涉及的主要数据结构是如何表示运动的蛇、食物状态等问题。2.1.1从游戏参考画面中我们可以看到,贪吃蛇的身体是一节节的,由一个个大小相同的方块组成,那么我们可以用一个(x,y)坐标为左上角的、固定宽度的正方形来表示一节蛇身。为表示连续的多节身体,那么我们可以采用数组(或链表,或线性表)等数据结构来表示。下 面以数组方式为例:struct Point int x, y;struct Poi nt n odesMAX_LENGTH;/ 蛇身数组,MAX_LENGTH 为最大蛇长贪吃蛇是在不断的运动的,我们研究蛇的运动可以发现这样的特点:1. 蛇头由键盘控制,键盘不操作时,保持原有方向运动

3、;(用int direction;表示)2. 运动时,蛇身后面一节移动到前面一节的位置。当我们用nodes0表示蛇头的时候,nodes1运动到nodes0处;nodes2运动到nodes1处。3吃到一个食物以后,蛇身会增加一节。即该数组中的有效数据个数加一。(用int length;表示)根据上面的情况,我们可以设计蛇的数据结构如下:struct Sn ake struct Point nodesMAX_LENGTH;/蛇身数组,保存每节蛇身的坐标。MAX_LENGTH为最大蛇长int len gth;/当前蛇长int direction; /蛇头运动方向int live;/蛇活的,还是已经死

4、了?2.1.2关于食物,有两个属性:1. 坐标位置2. 状态:存在,或被吃。 故我们用以下结构表示:struct Food struct Poi nt positio n; / 食物的位置int exist;/存在?还是被吃?1常熟理工学院计算机科学与工程学院2.2系统模块划分和模块结构void mai n() ini t();1=1; while(l) select。; gamePlay();close();*/*初始化*/*循环游戏*/*游戏速度和结束的选择菜单/*游戏主程序*/*关闭游戏*/ C程序设计课程设计241数据类型struct Point int x, y;;2.4数据类型、全

5、局变量和函数说明/* 一个存放点坐标的结构体 */*被多个结构体调用的基本参数,所以统一用 point结构体来表示*/4struct Sn ake struct Poi nt n odesMAX_LENGTH;int len gth;int directio n;int live;snake;struct Food struct Point positi on;int exist; food;2.4.2全局变量Scoreleft,top,right,bottomlastx,lastykeyCode243函数说明void in it(void);void gamePlay(void);void

6、close(void);void drawWall(void);void createFood(void);void drawFood(void);void drawS nake(void);void drawScore(void);int touchWall(void);int touchSelf(void);void gameOver(void);void moveS nake(void);int oppositeDirect ion (i nt keyCode);int foodEat(void);void expa ndSn ake(void);/*用来模拟蛇状态的结构体*/*用来存放

7、蛇每一节的位置 */*蛇长*/*蛇移动的方向*/*蛇是否活着*/*比较形象的把蛇抽象为一个数据类型*/*用来模拟食物状态的结构体*/*食物的位置*/*食物是否存在*/得分游戏区域范围用来保存最后一节蛇的位置用来保存按下的键初始化程序,给一些初始值赋值游戏主循环关闭游戏画墙创造一个食物画出食物画出蛇画出分数判断是否碰到墙判断是否碰到自己游戏结束移动蛇判断是否方向有误判断是否吃到食物把蛇增长一节常熟理工学院计算机科学与工程学院3程序测试和运行结果:和 DQSBqe 0.724 Cpu Cycles:3DQ0 Fmesfcip 04 Pro*raB:选择速度开始或退出游戏运行中 C程序设计课程设计

8、游戏结束4课程报告小结【遇到的问题及解决方法分析等】4.1分数重叠显示解决方法:每次都用一块黑的矩形覆盖setfillstyle(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.positio n.x=left+10*(i nt)ra nd()%11);food.positio n. y=top+10*( (in t)ra nd()%11);for(i=0;

9、i=s nakeen gth-1;i+)if(sn ake .no desi.x=food.positi on.x&sn ake .no desi.y=food.positi on.y)goto label;5常熟理工学院计算机科学与工程学院附录A :程序源代码/*writer:neolone ( LB ) */#in elude #i nclude #in clude #i nclude #in clude #in clude #in clude #defi ne TRUE 1#defi ne FALSE 0#defi ne UP 0x4800#defi ne DOWN 0x5000#def

10、i ne LEFT 0x4B00#defi ne RIGHT 0x4D00#defi ne ESC 0x011B#defi ne SPEED1 0x0231#defi ne SPEED2 0x0332#defi ne SPEED3 0x0433#defi ne QUIT 0x0B30#defi ne ENTER 0x1C0D#defi ne MAX_LENGTH 100/* max len gth of sn ake nodess */#defi ne GAME_SPEED 100/* game speed */* data structure */struct Point int x, y;

11、struct Sn ake struct Poi nt n odesMAX_LENGTH; in t le ngth;int direct ion;in t live;snake;struct Food struct Point positi on; C程序设计课程设计int exist; food;intscore=0,max,max1,max2,max3,left=200,top=200,right=300,bottom=300,lastx,lasty,keyCode,keyC ode2,sp,l,sel,times=1;char text80;/* functions declarati

12、on */void in it(void);void gamePlay(void);void close(void);void drawWall(void);void createFood(void);void drawFood(void);void drawS nake(void);void drawScore(void);int touchWall(void);int touchSelf(void);void gameOver(void);void moveS nake(void);int oppositeDirect ion (i nt keyCode);int foodEat(void

13、);void expa ndSn ake(void);void select(void);/* */void mai n() in it();l=1;while(l)select();gamePlay();close();void ini t() int gdriver=VGA ,gmode=VGAHI ;7常熟理工学院计算机科学与工程学院sn ake .no des0.x=250;sn ake .no des0.y=250;sn ake .n odes1.x=250;sn ake .n odes1.y=260;sn ake .len gth=2;sn ake .li ve=1;sn ake.

14、directio n=UP;score=0;food.exist=0;ini tgraph (& gdriver, &gmode,C:tc20BGI);ran domize();/*sui ji shu fa she ng qi*/drawWall();void close() FILE *fp;/*关闭时保存最咼分*/closegraph();if(fp=fope n(data.txt,w)=NULL)exit(0);elsefprin tf(fp,%d,%d,%d,max1,max2,max3); fclose(fp);prin tf(pess any key to con ti nu e

15、);void gamePlay() int keyCode,d;getch();while(TRUE) drawScore();drawWall();if (touchWall() | touchSelf() C程序设计课程设计gameOver();return;if (!food.exist) createFood();food.exist=1;drawFood();drawS nake();for(d=0;dsp;d+)delay(GAME_SPEED);if (bioskey(1) != 0) keyCode = bioskey(0); switch(keyCode) case ESC:

16、 gameOver(); return;default:lastx=s nake .no dess nakeen gth-1.x; lasty=s nake .no dess nakeen gth-1.y;if (!oppositeDirect ion( keyCode) sn ake.direct ion = keyCode;moveS nake();if (foodEat() food.exist = FALSE;score += 10;expa ndSn ake();void drawWall() recta ngle(left,top,right+10,bottom+10);void

17、createFood() int i;label:food.positio n.x=left+10*(i nt)ra nd()%11);food.positio n. y=top+10*( (in t)ra nd()%11);for(i=0;i=s nake .len gth-1;i+)if(sn ake .no desi.x=food.positi on.x&sn ake .no desi.y=food.positi on.y)9常熟理工学院计算机科学与工程学院goto label;void drawFood() setfillstyle(1,2);bar(food.positi on. x

18、,food.positi on.y, food.positi on. x+10,food.positi on. y+10);void drawS nake() int j;setfillstyle(1,4);for(j=0;j=s nakeen gth-1;j+)bar(s nake .no desj.x,s nake .no desj.y,s nake .no desj.x+10,s nake .no desj.y+10);void drawScore(void) setfillstyle(1,16); bar(45,45,150,80);setcolor(WHITE);spri ntf(t

19、ext,writer: neoIon e); outtextxy(170,50,text);spri ntf(text,score:%5d,score); outtextxy(50,50,text);int touchWall() int x1=s nake .no des0.x;int y1=s nake .no des0.y;if(x1right|y1bottom) return TRUE; C程序设计课程设计elsereturn FALSE;int touchSelf() int i;for (i=3;imax1)max1=score;break;case 2:if(scoremax2)

20、max2=score;break;case 3:11常熟理工学院计算机科学与工程学院if(scoremax3)max3=score;break;default :break;void moveS nake() int k;setfillstyle(1,16);lastx=s nake .no dess nake .len gth-1.x;lasty=s nake .no dess nake .len gth-1.y;bar(s nake .no dess nake .len gth-1.x,s nake .no dess nake .len gth-1.y,s nake .no dess na

21、ke .len gth-1.x+1 0,s nake .no dess nake .len gth-1.y+1O);for(k=s nake .len gth-2;k=0;k-)sn ake .no desk+1.x=s nake .no desk.x;sn ake .no desk+1.y=s nake .no desk.y;if(sn ake.directio n=UP)sn ake .no des0.y-=10;else if(sn ake.directio n=DOWN)sn ake .no des0.y+=10;else if(s nake.direct ion=LEFT)sn ak

22、e .no des0.x-=10;else if(sn ake.directio n=RIGHT)sn ake .no des0.x+=10;else5int oppositeDirect ion (i nt keyCode) if(keyCode=UP&sn ake.directio n=DOWN)return 1;else if(keyCode=DOWN&sn ake.directio n=UP) return 1; C程序设计课程设计else if(keyCode=LEFT&sn ake.directio n=RIGHT)return 1;else if(keyCode=RIGHT&sn

23、 ake.directio n=LEFT)return 1;elsereturn 0;int foodEat() if(sn ake .no des0.x=food.positi on.x&sn ake .no des0.y=food.positi on.y) return 1;elsereturn 0;void expa ndSn ake() if(keyCode=UP)lastx-=10;else if(keyCode=DOWN) lastx+=10;else if(keyCode=LEFT)lasty-=10;else if(keyCode=RIGHT)lasty+=10;else5sn

24、 ake .no dess nakeen gth.x=lastx;sn ake .no dess nake .len gth.y=lasty;sn ake .len gth+;void select()setfillstyle(1,7);/*实现选择速度的可视化菜单*/bar(420,220,490,310);setfillstyle(1,9);bar(430,230,480,240);13常熟理工学院计算机科学与工程学院setfillstyle(1,5); setcolor(WHITE);spri ntf(text,speed1); outtextxy(430,230,text); bar(

25、430,250,480,260);spri ntf(text,speed2); outtextxy(430,250,text); bar(430,270,480,280);spri ntf(text,speed3); outtextxy(430,270,text); bar(430,290,480,300);spri ntf(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: se

26、l-;break;case DOWN: sel+;break;case ENTER: t=0;break;default :break;switch(sel%4) case 0:setfillstyle(1,9); bar(430,290,480,300); setcolor(WHITE);setfillstyle(1,5); bar(430,230,480,240);spri ntf(text,speed1);outtextxy(430,230,text); bar(430,250,480,260);spri ntf(text,speed2); C程序设计课程设计outtextxy(430,

27、250,text);bar(430,270,480,280);spri ntf(text,speed3);outtextxy(430,270,text);spri ntf(text, quit );outtextxy(430,290,text);break;case 1:setfillstyle(1,9); bar(430,230,480,240);setfillstyle(1,5); setcolor(WHITE);spri ntf(text,speed1); outtextxy(430,230,text); bar(430,250,480,260);spri ntf(text,speed2

28、); outtextxy(430,250,text);bar(430,270,480,280);spri ntf(text,speed3); outtextxy(430,270,text);bar(430,290,480,300); spri ntf(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);spri ntf(text,speed1); outtextxy(430,230,text);spri ntf(text,speed2); outtextxy(430,250,text);bar(430,270,480,280); spri ntf(text,speed3);outtextxy(430,270,text); bar(430,290,480,300

温馨提示

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

评论

0/150

提交评论