贪吃蛇实验报告.docx

上传人:啊飒飒 文档编号:13232684 上传时间:2021-12-19 格式:DOCX 页数:31 大小:18.93KB
返回 下载 相关 举报
贪吃蛇实验报告.docx_第1页
第1页 / 共31页
贪吃蛇实验报告.docx_第2页
第2页 / 共31页
贪吃蛇实验报告.docx_第3页
第3页 / 共31页
贪吃蛇实验报告.docx_第4页
第4页 / 共31页
亲,该文档总共31页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《贪吃蛇实验报告.docx》由会员分享,可在线阅读,更多相关《贪吃蛇实验报告.docx(31页珍藏版)》请在三一文库上搜索。

1、贪吃蛇实验报告 计算机 程序设计课程设计报告 课 题 名 称 贪吃蛇游戏 班 级 学 号 姓 名 指 导 教 师 设 计 时 间 至 设 计 地 点 常熟理工学院计算机科学与工程学院 目录 1 需求分析 . 1 2 系统分析和设计 . 1 2.1 数据结构的设计和选择的理由 . 1 2.2 系统模块划分和模块结构 . 3 2.3 流程图 . 4 2.4 数据类型、全局变量和函数说明 . 4 3 程序测试和运行结果 . 4 4 课程报告小结 . 5 4.1 分数重叠显示 . 5 4.2 速度太快 . 5 4.3 食物可能出现在蛇身上 . 5 附录 A:程序源代码 . 6 1 需求分析 【阐述课程

2、设计应该完成的功能】 使用键盘的上下左右,来控制蛇的运动方向,ESC 键退出,并显示得分。 2 系统分析和设计 2.1 数据结构的设计和选择的理由 本游戏中涉及的主要数据结构是如何表示运动的蛇、食物状态等问题。 2.1 1 .1 从游戏参考画面中我们可以看到,贪吃蛇的身体是一节节的,由一个个大小相同的方块组成,那么我们可以用一个(x,y)坐标为左上角的、固定宽度的正方形来表示一节蛇身。为表示连续的多节身体,那么我们可以采用数组(或链表,或线性表)等数据结构来表示。下面以数组方式为例: struct Point int x, y; struct Point nodesMAX_LENGTH; /蛇

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

4、蛇身数组,保存每节蛇身的坐标。MAX_LENGTH 为最大蛇长 int length; /当前蛇长 int direction; /蛇头运动方向 int live; /蛇活的,还是已经死了? 2.1 1 .2 关于食物,有两个属性: 1. 坐标位置 2. 状态:存在,或被吃。 故我们用以下结构表示: struct Food struct Point position; /食物的位置 int exist; /存在?还是被吃? 2.2 系统模块划分和模块结构 void main() init(); /*初始化*/ l=1; while(l) /*循环游戏*/ select(); /*游戏速度和结束

5、的选择菜单*/ gamePlay(); /*游戏主程序*/ close(); /*关闭游戏*/ 2.3 流程图 2.4 数据 类型、全局变量和函数说明 2.4.1 数据类型 struct Point /*一个存放点坐标的结构体*/ int x, y; /*被多个结构体调用的基本参数,所以统一 用 point 结构体来表示*/ ; struct Snake /*用来模拟蛇状态的结构体*/ struct Point nodesMAX_LENGTH; /*用来存放蛇每一节的位置*/ int length; /*蛇长*/ int direction; /*蛇移动的方向*/ int live; /*蛇是

6、否活着*/ 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); 初始化程序,给一些初始值赋值 void gamePlay(void); 游戏主循环 void close(void

7、); 关闭游戏 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 oppositeDirection(int keyCode); 判断是否方向有误 in

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

9、() 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.xsnake.nodesi.y=food.position.y) goto label; 附录 A:程序源代码 /*writer: neolone(LB)*/ #include graphics.h #include stdlib.h #include time.h #includ

10、e stdio.h #include dos.h #include conio.h #include bios.h #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 #defin

11、e 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 position; int exist; food; int score=0,max,max1,max2

12、,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 drawSnake(void); void drawScore(void); int

13、 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 ,gmode=VGAHI ; snake.

14、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(data.txt,w)=NULL

15、) /* 关闭时保存最高分*/ exit(0); else fprintf(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(); dra

16、wSnake(); 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() f

17、ood.exist = 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.xsnake.nodesi.y=food.po

18、sition.y) goto label; 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) se

19、tfillstyle(1,16); 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(x1left|x1right|y1top|y1bottom) return TRUE; else return FALSE; int touchS

20、elf() int i; for (i=3;isnake.length-1;i+) if(snake.nodes0.x=snake.nodesi.xsnake.nodes0.y=snake.nodesi.y) return TRUE; return FALSE; void gameOver() FILE *fp; int x2,y2; x2=180; y2=250; setcolor(WHITE); sprintf(text,Game over !your score is %d,%d,score,sel); outtextxy(x2,y2,text); delay(1000); getch(

21、); switch(sel%4) case 1: if(scoremax1) max1=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

22、.x,snake.nodessnake.length-1.y,snake.nodessnake.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.dir

23、ection=LEFT) snake.nodes0.x-=10; else if(snake.direction=RIGHT) snake.nodes0.x+=10; else ; int oppositeDirection(int keyCode) if(keyCode=UPsnake.direction=DOWN) return 1; else if(keyCode=DOWNsnake.direction=UP) return 1; else if(keyCode=LEFTsnake.direction=RIGHT) return 1; else if(keyCode=RIGHTsnake

24、.direction=LEFT) return 1; else return 0; int foodEat() if(snake.nodes0.x=food.position.xsnake.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 ; sn

25、ake.nodessnake.length.x=lastx; snake.nodessnake.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); spr

26、intf(text,speed2); outtextxy(430,250,text); 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 D

27、OWN: 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); sprintf(text,speed1); outtextxy(430,230,text); bar(430,250,480,260); sprintf(text,speed2); outtextxy(430,250,text); bar(43

28、0,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,230,text); bar(430,250,480,260); sprintf(text,speed2); outtext

29、xy(430,250,text); bar(430,270,480,280); sprintf(text,speed3); 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); outtextx

30、y(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,300); sprintf(text, quit ); outtextxy(430,290,text); break; case 3: setfillstyle(1,9); bar(430,270,480,280); setfillstyle(1,5); bar(430,230,480,240); s

31、etcolor(WHITE); sprintf(text,speed1); outtextxy(430,230,text); bar(430,250,480,260); sprintf(text,speed2); outtextxy(430,250,text); sprintf(text,speed3); outtextxy(430,270,text); bar(430,290,480,300); sprintf(text, quit ); outtextxy(430,290,text); break; default : break; /*ch=getch();*/ if(times=1)

32、/*读取历史最高分*/ if(fp=fopen(data.txt,r)=NULL) sprintf(text,Can not open the file); exit(0); else fscanf(fp,%d,%d,%d,max1,max2,max3); fclose(fp); times=0; switch(sel%4) /*选择速度*/ case 0: l=0; gameOver(); close(); break; case 1: sp=5; init(); sprintf(text,Hightest score:%d,max1); outtextxy(50,90,text); break; case 2: sp=3; init(); sprintf(text,Hightest score:%d,max2); outtextxy(50,90,text); break; case 3: sp=1; init(); sprintf(text,Hightest score:%d,max3); outtextxy(50,90,text); break; default : break; ?

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 科普知识


经营许可证编号:宁ICP备18001539号-1