ImageVerifierCode 换一换
格式:DOCX , 页数:25 ,大小:67.56KB ,
资源ID:10262316      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/10262316.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(完整word版贪吃蛇实验报告.docx)为本站会员(b****7)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

完整word版贪吃蛇实验报告.docx

1、完整word版贪吃蛇实验报告计算机程序设计课程设计报告课 题 名 称 贪吃蛇游戏 班 级 学 号 姓 名 指 导 教 师 设 计 时 间 至 设 计 地 点 常熟理工学院计算机科学与工程学院1 需求分析【阐述课程设计应该完成的功能】使用键盘的上下左右,来控制蛇的运动方向,ESC键退出,并显示得分。2 系统分析和设计2.1 数据结构的设计和选择的理由本游戏中涉及的主要数据结构是如何表示运动的蛇、食物状态等问题。2.1.1 从游戏参考画面中我们可以看到,贪吃蛇的身体是一节节的,由一个个大小相同的方块组成,那么我们可以用一个(x,y)坐标为左上角的、固定宽度的正方形来表示一节蛇身。为表示连续的多节身

2、体,那么我们可以采用数组(或链表,或线性表)等数据结构来表示。下面以数组方式为例:struct Point int x, y;struct Point nodesMAX_LENGTH; /蛇身数组,MAX_LENGTH为最大蛇长贪吃蛇是在不断的运动的,我们研究蛇的运动可以发现这样的特点:1. 蛇头由键盘控制,键盘不操作时,保持原有方向运动;(用 int direction;表示) 2. 运动时,蛇身后面一节移动到前面一节的位置。当我们用nodes0表示蛇头的时候,nodes1运动到nodes0处;nodes2运动到nodes1处.。3. 吃到一个食物以后,蛇身会增加一节。即该数组中的有效数据个

3、数加一。(用int length;表示)根据上面的情况,我们可以设计蛇的数据结构如下:struct Snake struct Point nodesMAX_LENGTH; /蛇身数组,保存每节蛇身的坐标。MAX_LENGTH为最大蛇长 int length; /当前蛇长 int direction; /蛇头运动方向 int live; /蛇活的,还是已经死了?2.1.2 关于食物,有两个属性:1. 坐标位置2. 状态:存在,或被吃。故我们用以下结构表示:struct Food struct Point position; /食物的位置 int exist; /存在?还是被吃?2.2 系统模块划

4、分和模块结构void main() init(); /*初始化*/ l=1; while(l) /*循环游戏*/ select(); /*游戏速度和结束的选择菜单*/ gamePlay(); /*游戏主程序*/ close(); /*关闭游戏*/2.3 流程图2.4 数据类型、全局变量和函数说明2.4.1数据类型struct Point /*一个存放点坐标的结构体*/ int x, y; /*被多个结构体调用的基本参数,所以统一用point结构体来表示*/;struct Snake /*用来模拟蛇状态的结构体*/ struct Point nodesMAX_LENGTH; /*用来存放蛇每一节

5、的位置*/ int length; /*蛇长*/ int direction; /*蛇移动的方向*/ int live; /*蛇是否活着*/ snake; /*比较形象的把蛇抽象为一个数据类型*/struct Food /*用来模拟食物状态的结构体*/ struct Point position; /*食物的位置*/ int exist; /*食物是否存在*/ food;2.4.2全局变量Score 得分left,top,right,bottom 游戏区域范围lastx,lasty 用来保存最后一节蛇的位置keyCode 用来保存按下的键2.4.3函数说明void init(void); 初始

6、化程序,给一些初始值赋值void gamePlay(void); 游戏主循环void close(void); 关闭游戏void drawWall(void); 画墙void createFood(void); 创造一个食物void drawFood(void); 画出食物void drawSnake(void); 画出蛇void drawScore(void); 画出分数int touchWall(void); 判断是否碰到墙int touchSelf(void); 判断是否碰到自己void gameOver(void); 游戏结束void moveSnake(void); 移动蛇int o

7、ppositeDirection(int keyCode); 判断是否方向有误int foodEat(void); 判断是否吃到食物void expandSnake(void); 把蛇增长一节3 程序测试和运行结果 -选择速度开始或退出-游戏运行中-游戏结束4 课程报告小结【遇到的问题及解决方法分析等】4.1分数重叠显示解决方法:每次都用一块黑的矩形覆盖setfillstyle(1,16); bar(45,45,150,80);4.2速度太快解决方法:循环delayfor(d=0;d4;d+) delay(GAME_SPEED);4.3食物可能出现在蛇身上解决方法:依次判断,若重叠则重新生成食

8、物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 label; 附录A:程序源代码/*writer: neolone(LB)*/#include #include #include #include #include #in

9、clude #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 SPEED3 0x0433#define QUIT 0x0B30#define ENTER 0x1C0D#define MAX_LENGTH 100 /* max length of snake nodess */#defin

10、e 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 position; int exist; food;int score=0,max,max1,max2,max3,left=200,top=200,right=300,bottom=300,lastx,lasty,keyCode,

11、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 drawSnake(void);void drawScore(void);int touchWall(void);int touchSelf(void);void gameOver(void);void moveSnake(voi

12、d);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 ,gmode=VGAHI ; snake.nodes0.x=250; snake.nodes0.y=250; snake.nodes1.x=250; snake.nodes1.y=260; snake.lengt

13、h=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(data.txt,w)=NULL) /*关闭时保存最高分*/ exit(0); else fprintf(fp,%d,%d,%d,max1,max2,max3); fclose(fp); printf

14、(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(); drawSnake(); for(d=0;dsp;d+) delay(GAME_SPEED); if (bioskey(1) != 0) keyCode = bioskey(0)

15、; 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 = FALSE; score += 10; expandSnake(); void drawWall() rectangle(left,top,righ

16、t+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 label; void drawFood() setfillstyle(1,2); bar(food.position.x,food.posit

17、ion.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); bar(45,45,150,80); setcolor(WHITE); sprintf(text,writer:neolone); outt

18、extxy(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=score; break; case 2: if(scoremax2) max2=score; break; case 3: if(sco

19、remax3) 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.nodessnake.length-1.x+10,snake.nodessnake.length-1.y+10); for(k=snake.length

20、-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(snake.direction=RIGHT) snake.nodes0.x+=10; else ;int oppositeDirection(i

21、nt 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;int foodEat() if(snake.nodes0.x=food.position.x&snake.nodes0.y=food.p

22、osition.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.nodessnake.length.y=lasty; snake.length+;void select() setfillstyle(1,7);

23、/*实现选择速度的可视化菜单*/ 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); bar(430,270,480,280); sprintf(text,speed3); outtextxy(430,270,text);

24、 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 : break; switch(sel%4) case 0: setfillstyle(1,9); bar(430,290,48

25、0,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(430,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,2

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1