《贪吃蛇总结报告》word版

上传人:dus****log 文档编号:127164338 上传时间:2022-07-29 格式:DOC 页数:15 大小:126KB
收藏 版权申诉 举报 下载
《贪吃蛇总结报告》word版_第1页
第1页 / 共15页
《贪吃蛇总结报告》word版_第2页
第2页 / 共15页
《贪吃蛇总结报告》word版_第3页
第3页 / 共15页
资源描述:

《《贪吃蛇总结报告》word版》由会员分享,可在线阅读,更多相关《《贪吃蛇总结报告》word版(15页珍藏版)》请在装配图网上搜索。

1、贪吃蛇总结报告贪吃蛇设计综合实验总结报告课程名称:程序设计实践选题名称:贪吃蛇小组长姓名: 方娟 200911211056小组成员姓名:邹甜 200911211004 杜家萱 200911211066任课老师:伊乾报告递交时间:2009.6.9一 系统功能说明贪食蛇游戏是一个深受人们喜爱的游戏:一条蛇在密闭的围墙内,在围墙内出现食物,通过按键控制蛇向上下左右四个方向移动,蛇撞到食物,则食物被吃掉,蛇的身体增加一节。如果蛇在移动的过程中,撞到墙壁或身体的交叉(蛇头撞到自己的身体)游戏结束。现要求利用Turbo C2.0来实现该游戏。功能要求如下:一、 基本功能1. 提供一个图形模式下的界面。2.

2、 开始游戏:空格键或回车键;退出游戏:Esc键。3. 支持用键盘的方向键来控制蛇的移动,蛇可以向上、下、左、右四个方向移动。4. 当蛇头碰到食物时,食物被吃掉,蛇的身体增长一节。5. 初始场景内随即出现1个食物,当食物被吃掉时,再随机出现一个食物。6. 要有记分机制,没吃掉一个食物,增加相应的分数。7. 蛇碰到墙壁或是自己身体的一部分则游戏结束。二、高级功能1. 暂停功能:能随时通过按键来暂停游戏,再按一次则继续游戏。2. 速度调节功能:当分数达到某个值后,对蛇的移动速度进行一定的提升,但会有一个速度上限。3. 奖励机制:增加另一种的奖励食物,蛇吃到该种食物后蛇的身体减少一节(最短不能少于2节

3、),但不增加分数。该种食物的颜色要区别与普通食物的颜色。奖励食物有时间限制,在一定时间内没有吃掉则会消失。4. 音效功能:在游戏开始、吃掉食物、撞墙、撞到自己时提供不同的音效。二 程序结构初始化图形模式(1)程序结构说明开始游戏 处理和实现游戏进行过程中的各种事件和功能结束游戏并关闭图形模式(2)重要数据说明基本思路:首先设计主界面,主界面是一个密封的围墙,并在屏幕最右面留一部分用来显示分数、计时等其他信息。围墙直接画一个矩形来表示,四面围成密闭的矩形来作为围墙。接着是初始化蛇与食物的位置并将他们用图形表示出来。然后进行一个循环,将蛇按当前的方向移动,并处理键盘的方向按键信息,调整蛇的移动方向

4、。蛇头如果碰到食物,则食物消失,蛇身增长一节,更新分数,并在另外的地方又随机出现食物;如果碰到围墙或是自己的身体,则游戏结束,关闭图形系统。1) 游戏场景用一个二维坐标表示移动方向利用定义16位制键值如#define LEFT ox40b002) 在函数中利用switch函数进行控制方向3) 利用结构体来表示蛇,定义两个二维数组分别表示蛇的身体的每一节,记录其横纵坐标struct Snake /*定义蛇的结构体*/ int xN; int yN; int node; int direction;/*蛇移动方向*/ int life;/* 蛇的生命,0活着,1死亡*/snake;利用两个一维数组

5、来控制蛇本身的横纵坐标 4) 食物的表示是一个结构体struct Fooda) int x;b) int y;c) int die;/*判断是否出现食物*/d) int bonus;/*判断是否要出现食物的变量*/(3)函数清单文件名函数原型函数功能处理描述draw.cvoid Init(void)初始化图形模式调用initgraph()切换到图形模式void Draw(void)初始化贪吃蛇界面调用rectangle()画围墙void Close(void)关闭图形调用closegraph()关闭图形timer.cvoid interrupt(*oldtimer)(void)指向原来的时钟中

6、断处理过程入口中的中断处理函数指针(句柄)void interrupt newtimer(void)新的时钟中断处理过程调用(*oldtimer)()函数句柄,计时器自动加1void SetTimer(void interrupt(*IntProc)(void)设置新的时钟中断处理过程调用setvect()设置新的时钟中断处理过程void KillTimer()恢复原有的时钟中断处理过程调用setvect()恢复原有的时钟中断处理过程play.cvoid GamePlay(void)游戏实现的过程如何画出蛇 蛇如何移动 蛇的身体怎样增加 怎样吃食物 怎样控制奖励 void GameOver(v

7、oid)游戏结束后退出游戏如果蛇死,则退出游戏void PrScore(void)打印出游戏得分在游戏界面的适当位置打印出游戏得分void IsBonus(void)判断是否产生奖励游戏的分数每增加100分,产生一个奖励void Eatfood(void)判断是否吃食物判断蛇头的位置和食物的位置是否相同void Eatbonus(void)判断是否吃奖励判断奖励的位置和蛇头的位置是否相同void Notbonus(void)到时间后奖励没被吃掉则奖励消失到达设定的时间后,若奖励没被吃则消失(4)重要函数算法分析整个贪吃蛇游戏由5个源文件组成,分别是snake.h、timer.c、draw.c、

8、play.c、main.c、snake.h文件Snake.h该文件包括贪吃蛇程序设计中所需要的系统头文件、宏定义、外部全局变量申明和函数原型说明等组成,使构成的贪吃蛇的各个C源文件只需要引用该头文件即可。#ifndef SNAKE_H#define SNAKE_H /*防止函数重定义*/#define N 200#include #include#include /*系统头文件*/#define LEFT 0x4b00 /*定义上下左右的键值*/#define RIGHT 0x4d00#define DOWN 0x5000#define UP 0x4800#define ESC 0x011b#

9、define ENTER 0x1c0d#define SPACE 0x3920#define TIMER 0x1c /*定义时钟中断号*/unsigned int TimerCounter=0; /*计时变量*/int i,key;int score=0;int gamespeed=50000000;struct Food /*定义食物和奖励的结构体*/ int x; int y; int die; int bonus;/*判断是否要出现食物的变量*/food,good;struct Snake /*定义蛇的结构体*/ int xN; int yN; int node; int directi

10、on;/*蛇移动方向*/ int life;/* 蛇的生命,0活着,1死亡*/snake;void Init(void); /*图形驱动*/void Close(void); /*图形结束*/void Draw(void); /*开始画面*/void GameOver(void); /*结束游戏*/void GamePlay(void);/* 游戏实现的过程*/void PrScore(void);/*打印游戏得分*/void IsBonus(void); /*判断是否产生奖励*/void Eatfood(void); /*判断是否吃食物*/void Eatbonus(void); /*判断是

11、否吃奖励*/void Notbonus(void); /*到时间后奖励没被吃掉则奖励消失*/void interrupt newtimer(void); /*指向原来的时钟中断处理过程入口中的中断处理函数指针(句柄)*/void interrupt newtimer1(void); /*新的时钟中断处理过程*/void SetTimer1(void interrupt(*IntProc)(void); /*设置新的时钟中断处理过程*/void SetTimer(void interrupt(*IntProc)(void); /*恢复原有的时钟中断处理过程*/void KillTimer();/

12、*/#endif源代码Timer.c文件时钟中断处理源程序文件,主要包括原先的时钟中断处理函数句柄、新的时钟中断处理函数、设置新的时钟中断处理过程、恢复原有的时钟中断处理过程的四个函数。#include“snake.h”Unsigned int TimerCounter=0;/*计时变量,每秒钟增加18*/*/*函数原型:void interrupt(*oldtimer)(void);*传入参数:无*返回值:无*函数功能:指向原来的时钟中断处理过程入口的中断处理函数指针(句柄)/*/void interrupt(*oldtimer)(void);/*/*函数原型:void interrupt

13、newtimer(void);*传入参数:无*返回值:无*函数功能:新的时钟中断处理函数/*/void interrupt newtimer(void) (*oldtimer)(); TimerCounter+;/*/*函数原型:void SetTimer(void interrupt(*IntProc)(void)*传入参数:无*返回值:无*函数功能:设置新的时钟中断处理函数/*/void SetTimer(void interrupt(*IntProc)(void) oldtimer=getvect(TIMER); disable(); setvect(TIMER,IntProc); en

14、able();/*/*函数原型:void KillTimer()*传入参数:无*返回值:无*函数功能:恢复原先的时钟中断处理函数/*/void KillTimer() disable(); setvect(TIMER,oldtimer); enable();Draw.c文件画图及图形驱动的原文件,主要包括图形驱动函数、图形显示函数、图形关闭函数#include“snake.h”/*/*函数原型:void Init(void) *传入参数:无*返回值:无*函数功能:图形驱动函数 /*/void Init(void) int gd=DETECT,gm=0; registerbgidriver(EG

15、AVGA_driver);/* 注册BGI驱动后可以不需要.BGI文件的支持运行 */ initgraph(&gd,&gm,); cleardevice();/*/*函数原型:void Draw(void) *传入参数:无*返回值:无*函数功能:画围墙函数 /*/void Draw(void) setbkcolor(LIGHTBLUE); setcolor(11); setlinestyle(SOLID_LINE,0,THICK_WIDTH); rectangle(50,40,610,49); rectangle(50,451,610,460); rectangle(50,40,59,460)

16、; rectangle(601,40,610,460);左上角坐标为(50,40),右下角坐标为(610,460)的围墙,四条边分别用是个矩形表示。/*/*函数原型:void Draw(void) *传入参数:无*返回值:无*函数功能:画围墙函数 /*/*函数原型:void Close(void) *传入参数:无*返回值:无*函数功能:关闭图形函数/*/void Close(void) getch(); closegraph();Play.c文件具体玩游戏的过程,主要包括游戏实现的过程,游戏结束后退出游戏,打印出游戏得分,判断是否产生奖励,判断是否吃食物,判断是否吃奖励,到时间后奖励没被吃掉则

17、奖励消失等函数。#includesnake.h/*/*函数原型:void Play(void) *传入参数:无*返回值:无*函数功能:游戏实现的过程/*/void GamePlay(void) randomize(); food.die=1; good.die=1; good.bonus=0; good.x=-20; good.y=-20; snake.life=0; snake.direction=1; snake.x0=100;snake.y0=100; snake.x1=110;snake.y1=100; snake.node=2; /*初始化数据*/ PrScore(); while(

18、1) while(!kbhit() /*在没有按键的情况下,蛇自己移动身体*/ if(food.die=1)/*产生食物*/ food.x=rand()%400+60; food.y=rand()%350+60; while(food.x%10!=0) food.x+; while(food.y%10!=0) food.y+; food.die=0; /*/ if(food.die=0)/*显示食物*/ setcolor(GREEN); rectangle(food.x,food.y,food.x+10,food.y-10); /*/ IsBonus();/*判断是否产生奖励*/每得到一百分产

19、生一个奖励 for(i=snake.node-1;i0;i-) snake.xi=snake.xi-1; snake.yi=snake.yi-1; /*通过把射后一节的位置附给前一节,而实现蛇的移动*/ /*1,2,3,4表示右,左,上,下四个方向,通过这个判断来移动蛇头*/ switch(snake.direction) case 1: snake.x0+=10;break; case 2: snake.x0-=10;break; case 3: snake.y0-=10;break; case 4: snake.y0+=10;break; /*判断蛇是否撞到自己 */ for(i=3;is

20、nake.node;i+) if(snake.xi=snake.x0&snake.yi=snake.y0) sound(200); GameOver(); snake.life=1; break; /*判断蛇是否撞墙 */ if(snake.x0595|snake.y0455) /*蛇撞墙*/ sound(800); GameOver(); snake.life=1; if(snake.life=1) break; Eatfood(); Eatbonus(); Notbonus(); setcolor(4); for(i=0;i=1000) if(score!=0&score%100=0) g

21、amespeed-=1000; /*/*函数原型:void GameOver (void) *传入参数:无*返回值:无*函数功能:游戏结束/*/void GameOver(void) cleardevice(); PrScore(); setcolor(RED); settextstyle(0,0,4); outtextxy(200,200,GAME OVER); getch();/*/*函数原型:void PrScore(void) *传入参数:无*返回值:无*函数功能:打印出游戏得分/*/void PrScore(void) char str10; setfillstyle(SOLID_F

22、ILL,YELLOW); bar(50,15,220,35); setcolor(6); settextstyle(0,0,2); sprintf(str,score:%d,score); outtextxy(55,20,str);/*/*函数原型:void IsBonus (void) *传入参数:无*返回值:无*函数功能:判断是否需要产生奖励/*/void IsBonus(void) if(score!=0&score%100=0) if(good.bonus=0) if(score/100)=good.die) SetTimer(newtimer); good.bonus=1; good

23、.x=rand()%400+60; good.y=rand()%350+60; while(good.x%10!=0) good.x+; while(good.y%10!=0) good.y+; setcolor(WHITE); rectangle(good.x,good.y,good.x+10,good.y-10); /*/*函数原型:void Eatfood (void) *传入参数:无*返回值:无*函数功能:判断食物是否被吃/*/ void Eatfood(void) if(snake.x0=food.x&snake.y0=food.y) sound(500); delay(5000);

24、 nosound(); setcolor(0); rectangle(food.x,food.y,food.x+10,food.y-10); snake.xsnake.node=-20; snake.ysnake.node=-20; /*新的一节先放在看不见的位置,下次循环就取前一节的位置*/ snake.node+; food.die=1; score+=10; PrScore(); void Eatbonus(void) if(snake.x0=good.x&snake.y0=good.y&good.bonus=1) sound(1000); delay(5000); nosound();

25、 setcolor(0); rectangle(good.x,good.y,good.x+10,good.y-10); good.x=-20; good.y=-20; rectangle(snake.xsnake.node-1,snake.ysnake.node-1,snake.xsnake.node-1+10,snake.ysnake.node-1-10); snake.node-; good.die+; good.bonus=0; /*/*函数原型:void Eatbonus (void) *传入参数:无*返回值:无*函数功能:判断奖励是否被吃/*/ void Notbonus(void)

26、 if(TimerCounter=(18*10) TimerCounter=0; KillTimer(); if(good.bonus=1 ) TimerCounter=0; good.die+; setcolor(0); rectangle(good.x,good.y,good.x+10,good.y-10); good.x=-20; good.y=-20; good.bonus=0; 三 系统设计难点及解决办法a) 表示蛇的图形及蛇的移动方向。用一个小矩形块表示蛇的一节身体,身体每长一节,增加一个矩形块。移动时必须从蛇头开始,所以蛇不能向相反的方向移动。如果不安任何键,蛇自行在当前方向上移

27、动,当游戏者按了有效的方向键后,先确定蛇头的位置,然后蛇身体随着蛇头移动。在图形的实现上,从蛇头的新位置开始画出蛇。这时,由于没有清屏的原因,原来蛇的位置和新蛇的位置差一个单位,将蛇的最后一节用背景色覆盖。b) 检测蛇有无撞到食物、围墙或是自己的身体。当蛇开始移动之后,需要判断蛇头要移动到的新的位置的情况,然后根据新位置是空白、食物、围墙还是蛇的身体来做出相应的操作。可以用一个二维数组来表示整个场景,以不同的值来表示每个位置的情况。c) 事物的随机产生。当食物被吃掉后,要在场景中重新随机产生。利用C语言提供的随机函数rand()产生随机数并将该随机数缩小到符合场景大小的范围中来,以此作为食物位

28、置的横纵坐标。d) 蛇的移动速度调节。在高级功能中,当分数达到一定的值后,移动速度将进行一定的提升。主要利用蛇的两次移动之间的时间间隔来实现,也就是调整两次循环之间的停顿时间,可以使用Tubor C函数库中的delay()函数来实现。e) 奖励事物的定时机制。解决这个问题要用到时钟中断。时钟中断大约每秒钟发生18.2次。截获正常的时钟中断后,先处理完正常的时钟中断,将计时变量加1.这样,每秒钟计时变量约增加18。需要控制时间的时候,只要看这个计时变量就行了。截获时钟中断要用到函数getvect()和setvect()。四 不足之处(1)未实现随机产生的食物位置与蛇身产生冲突,则重新产生(2)未实现奖励随机产生,是每100分产生一个五 人员分工说明方娟写play.c杜家萱写draw.c和snake .h邹甜写time.c和main.c15

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!