贪吃蛇总结报告.docx
《贪吃蛇总结报告.docx》由会员分享,可在线阅读,更多相关《贪吃蛇总结报告.docx(19页珍藏版)》请在冰豆网上搜索。
![贪吃蛇总结报告.docx](https://file1.bdocx.com/fileroot1/2022-11/15/9886191b-3e5f-45c6-aa99-bd5fc04ae4d2/9886191b-3e5f-45c6-aa99-bd5fc04ae4d21.gif)
贪吃蛇总结报告
贪吃蛇设计综合实验总结报告
课程名称:
程序设计实践
选题名称:
贪吃蛇
小组长姓名:
方娟200911211056
小组成员姓名:
邹甜200911211004
杜家萱200911211066
任课老师:
伊乾
报告递交时间:
2009.6.9
一系统功能说明
贪食蛇游戏是一个深受人们喜爱的游戏:
一条蛇在密闭的围墙内,在围墙内出现食物,通过按键控制蛇向上下左右四个方向移动,蛇撞到食物,则食物被吃掉,蛇的身体增加一节。
如果蛇在移动的过程中,撞到墙壁或身体的交叉(蛇头撞到自己的身体)游戏结束。
现要求利用TurboC2.0来实现该游戏。
功能要求如下:
一、基本功能
1.提供一个图形模式下的界面。
2.开始游戏:
空格键或回车键;退出游戏:
Esc键。
3.支持用键盘的方向键来控制蛇的移动,蛇可以向上、下、左、右四个方向移动。
4.当蛇头碰到食物时,食物被吃掉,蛇的身体增长一节。
5.初始场景内随即出现1个食物,当食物被吃掉时,再随机出现一个食物。
6.要有记分机制,没吃掉一个食物,增加相应的分数。
7.蛇碰到墙壁或是自己身体的一部分则游戏结束。
二、高级功能
1.暂停功能:
能随时通过按键来暂停游戏,再按一次则继续游戏。
2.速度调节功能:
当分数达到某个值后,对蛇的移动速度进行一定的提升,但会有一个速度上限。
3.奖励机制:
增加另一种的奖励食物,蛇吃到该种食物后蛇的身体减少一节(最短不能少于2节),但不增加分数。
该种食物的颜色要区别与普通食物的颜色。
奖励食物有时间限制,在一定时间内没有吃掉则会消失。
4.音效功能:
在游戏开始、吃掉食物、撞墙、撞到自己时提供不同的音效。
二程序结构
初始化图形模式
(1)程序结构说明
开始游戏
处理和实现游戏进行过程中
的各种事件和功能
结束游戏并关闭图形模式
(2)重要数据说明
基本思路:
首先设计主界面,主界面是一个密封的围墙,并在屏幕最右面留一部分用来显示分数、计时等其他信息。
围墙直接画一个矩形来表示,四面围成密闭的矩形来作为围墙。
接着是初始化蛇与食物的位置并将他们用图形表示出来。
然后进行一个循环,将蛇按当前的方向移动,并处理键盘的方向按键信息,调整蛇的移动方向。
蛇头如果碰到食物,则食物消失,蛇身增长一节,更新分数,并在另外的地方又随机出现食物;如果碰到围墙或是自己的身体,则游戏结束,关闭图形系统。
1)游戏场景用一个二维坐标表示
移动方向利用定义16位制键值
如#defineLEFTox40b00
2)在函数中利用switch函数进行控制方向
3)利用结构体来表示蛇,定义两个二维数组分别表示蛇的身体的每一节,记录其横纵坐标
structSnake/*定义蛇的结构体*/
{
intx[N];
inty[N];
intnode;
intdirection;/*蛇移动方向*/
intlife;/*蛇的生命,0活着,1死亡*/
}snake;
利用两个一维数组来控制蛇本身的横纵坐标
4)食物的表示是一个结构体
structFood{
a)intx;
b)inty;
c)intdie;/*判断是否出现食物*/
d)intbonus;/*判断是否要出现食物的变量*/}
(3)函数清单
文件名
函数原型
函数功能
处理描述
draw.c
voidInit(void)
初始化图形模式
调用initgraph()切换到图形模式
voidDraw(void)
初始化贪吃蛇界面
调用rectangle()画围墙
voidClose(void)
关闭图形
调用closegraph()关闭图形
timer.c
voidinterrupt(*oldtimer)(void)
指向原来的时钟中断处理过程入口中的中断处理函数指针(句柄)
voidinterruptnewtimer(void)
新的时钟中断处理过程
调用(*oldtimer)()函数句柄,计时器自动加1
voidSetTimer(voidinterrupt(*IntProc)(void))
设置新的时钟中断处理过程
调用setvect()设置新的时钟中断处理过程
voidKillTimer()
恢复原有的时钟中断处理过程
调用setvect()恢复原有的时钟中断处理过程
play.c
voidGamePlay(void)
游戏实现的过程
如何画出蛇蛇如何移动蛇的身体怎样增加怎样吃食物怎样控制奖励
voidGameOver(void)
游戏结束后退出游戏
如果蛇死,则退出游戏
voidPrScore(void)
打印出游戏得分
在游戏界面的适当位置打印出游戏得分
voidIsBonus(void)
判断是否产生奖励
游戏的分数每增加100分,产生一个奖励
voidEatfood(void)
判断是否吃食物
判断蛇头的位置和食物的位置是否相同
voidEatbonus(void)
判断是否吃奖励
判断奖励的位置和蛇头的位置是否相同
voidNotbonus(void)
到时间后奖励没被吃掉则奖励消失
到达设定的时间后,若奖励没被吃则消失
(4)重要函数算法分析
整个贪吃蛇游戏由5个源文件组成,分别是snake.h、timer.c、draw.c、play.c、main.c、snake.h文件
Snake.h
该文件包括贪吃蛇程序设计中所需要的系统头文件、宏定义、外部全局变量申明和函数原型说明等组成,使构成的贪吃蛇的各个C源文件只需要引用该头文件即可。
#ifndefSNAKE_H
#defineSNAKE_H/*防止函数重定义*/
#defineN200
#include
#include
#include/*系统头文件*/
#defineLEFT0x4b00/*定义上下左右的键值*/
#defineRIGHT0x4d00
#defineDOWN0x5000
#defineUP0x4800
#defineESC0x011b
#defineENTER0x1c0d
#defineSPACE0x3920
#defineTIMER0x1c/*定义时钟中断号*/
unsignedintTimerCounter=0;/*计时变量*/
inti,key;
intscore=0;
intgamespeed=50000000;
structFood/*定义食物和奖励的结构体*/
{
intx;
inty;
intdie;
intbonus;/*判断是否要出现食物的变量*/
}food,good;
structSnake/*定义蛇的结构体*/
{
intx[N];
inty[N];
intnode;
intdirection;/*蛇移动方向*/
intlife;/*蛇的生命,0活着,1死亡*/
}snake;
voidInit(void);/*图形驱动*/
voidClose(void);/*图形结束*/
voidDraw(void);/*开始画面*/
voidGameOver(void);/*结束游戏*/
voidGamePlay(void);/*游戏实现的过程*/
voidPrScore(void);/*打印游戏得分*/
voidIsBonus(void);/*判断是否产生奖励*/
voidEatfood(void);/*判断是否吃食物*/
voidEatbonus(void);/*判断是否吃奖励*/
voidNotbonus(void);/*到时间后奖励没被吃掉则奖励消失*/
voidinterruptnewtimer(void);/*指向原来的时钟中断处理过程入口中的中断处理函数指针(句柄)*/
voidinterruptnewtimer1(void);/*新的时钟中断处理过程*/
voidSetTimer1(voidinterrupt(*IntProc)(void));/*设置新的时钟中断处理过程*/
voidSetTimer(voidinterrupt(*IntProc)(void));/*恢复原有的时钟中断处理过程*/
voidKillTimer();/**/
#endif
源代码
Timer.c文件
时钟中断处理源程序文件,主要包括原先的时钟中断处理函数句柄、新的时钟中断处理函数、设置新的时钟中断处理过程、恢复原有的时钟中断处理过程的四个函数。
#include“snake.h”
UnsignedintTimerCounter=0;/*计时变量,每秒钟增加18*/
/****************************************************/
*函数原型:
voidinterrupt(*oldtimer)(void);
*传入参数:
无
*返回值:
无
*函数功能:
指向原来的时钟中断处理过程入口的中断处理函数指针(句柄)
/*****************************************************************/
voidinterrupt(*oldtimer)(void);
/*****************************************************************/
*函数原型:
voidinterruptnewtimer(void);
*传入参数:
无
*返回值:
无
*函数功能:
新的时钟中断处理函数
/**********************************************************************/
voidinterruptnewtimer(void)
{
(*oldtimer)();
TimerCounter++;
}
/*****************************************************************/
*函数原型:
voidSetTimer(voidinterrupt(*IntProc)(void))
*传入参数:
无
*返回值:
无
*函数功能:
设置新的时钟中断处理函数
/********************************************************************/
voidSetTimer(voidinterrupt(*IntProc)(void))
{
oldtimer=getvect(TIMER);
disable();
setvect(TIMER,IntProc);
enable();
}
/*****************************************************************/
*函数原型:
voidKillTimer()
*传入参数:
无
*返回值:
无
*函数功能:
恢复原先的时钟中断处理函数
/*****************************************************************/
voidKillTimer()
{
disable();
setvect(TIMER,oldtimer);
enabl