《贪吃蛇总结报告》word版.docx
- 文档编号:29739340
- 上传时间:2023-07-26
- 格式:DOCX
- 页数:23
- 大小:31.91KB
《贪吃蛇总结报告》word版.docx
《《贪吃蛇总结报告》word版.docx》由会员分享,可在线阅读,更多相关《《贪吃蛇总结报告》word版.docx(23页珍藏版)》请在冰豆网上搜索。
《贪吃蛇总结报告》word版
贪吃蛇设计综合实验总结报告
课程名称:
程序设计实践
选题名称:
贪吃蛇
小组长姓名:
方娟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);
enable();
}
Draw.c文件
画图及图形驱动的原文件,主要包括图形驱动函数、图形显示函数、图形关闭函数
#include“snake.h”
/*****************************************************************/
*函数原型:
voidInit(void)
*传入参数:
无
*返回值:
无
*函数功能:
图形驱动函数
/*****************************************************************/
voidInit(void)
{
intgd=DETECT,gm=0;
registerbgidriver(EGAVGA_driver);/*注册BGI驱动后可以不需要.BGI文件的支持运行*/
initgraph(&gd,&gm,"");
cleardevice();
}
/***********************************************************************/
*函数原型:
voidDraw(void)
*传入参数:
无
*返回值:
无
*函数功能:
画围墙函数
/***********************************************************************/
voidDraw(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);
rectangle(601,40,610,460);
}
左上角坐标为(50,40),右下角坐标为(610,460)的围墙,四条边分别用是个矩形表示。
/***********************************************************************/
*函数原型:
voidDraw(void)
*传入参数:
无
*返回值:
无
*函数功能:
画围墙函数
/*****************************************************************/
*函数原型:
voidClose(void)
*传入参数:
无
*返回值:
无
*函数功能:
关闭图形函数
/*********************************************************************/
voidClose(void)
{
getch();
closegraph();
}
Play.c文件
具体玩游戏的过程,主要包括游戏实现的过程,游戏结束后退出游戏,打印出游戏得分,判断是否产生奖励,判断是否吃食物,判断是否吃奖励,到时间后奖励没被吃掉则奖励消失等函数。
#include"snake.h"
/*****************************************************************/
*函数原型:
voidPlay(void)
*传入参数:
无
*返回值:
无
*函数功能:
游戏实现的过程
/*********************************************************************/
voidGamePlay(void)
{
randomize();
food.die=1;
good.die=1;
good.bonus=0;
good.x=-20;
good.y=-20;
snake.life=0;
snake.direction=1;
snake.x[0]=100;snake.y[0]=100;
snake.x[1]=110;snake.y[1]=100;
snake.node=2;/*初始化数据*/
PrScore();
while
(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();/*判断是否产生奖励*/
每得到一百分产生一个奖励
for(i=snake.node-1;i>0;i--)
{
snake.x[i]=snake.x[i-1];
snake.y[i]=snake.y[i-1];
}/*通过把射后一节的位置附给前一节,而实现蛇的移动*/
/*1,2,3,4表示右,左,上,下四个方向,通过这个判断来移动蛇头*/
switch(snake.direction)
{
case1:
snake.x[0]+=10;break;
case2:
snake.x[0]-=10;break;
case3:
snake.y[0]-=10;break;
case4:
snake.y[0]+=10;break;
}
/*****判断蛇是否撞到自己**************************************************/
for(i=3;i { if(snake.x[i]==snake.x[0]&&snake.y[i]==snake.y[0]) { sound(200); GameOver(); snake.life=1; break; } } /********判断蛇是否撞墙*************************************************/ if(snake.x[0]<55||snake.x[0]>595||snake.y[0]<55||snake.y[0]>455) {/*蛇撞墙*/ sound(800); GameOver(); snake.life=1; } if(snake.life==1) break; Eatfood(); Eatbonus(); Notbonus(); setcolor(4); for(i=0;i rectangle(snake.x[i],snake.y[i],snake.x[i]+10,snake.y[i]-10); delay(gamespeed); setcolor(0);/*用黑色去除蛇的的最后一节*/ rectangle(snake.x[snake.node-1],snake.y[snake.node-1],snake.x[snake.node-1]+10,snake.y[snake.node-1]-10); }/*endwhile(! kbhit())*/ if(snake.life==1) break; key=bioskey(0); if(key==ESC){ setcolor(4); rectangle(snake.x[snake.node-1],snake.y[snake.node-1],snake.x[snake.node-1]+10,snake.y[snake.node-1]-10); break; } else if(key==SPACE){ setcolor(4); rectangle(snake.x[snake.node-1],snake.y[snake.node-1],snake.x[snake.node-1]+10,snake.y[snake.node-1]-10); bioskey(0); setcolor(0); rectangle(snake.x[snake.node-1],snake.y[snake.node-1],snake.x[snake.node-1]+10,snake.y[snake.node-1]-10); } else if(key==UP&&snake.direction! =4) /*判断是否往相反的方向移动*/ snake.direction=3; else if(key==RIGHT&&snake.direction! =2) snake.direction=1; else if(key==LEFT&&snake.direction! =1) snake.direction=2; else if(key==DOWN&&snake.direction! =3) snake.direction=4; if(gamespeed>=1000){ if(score! =0&&score%100==0) gamespeed-=1000; } } } /*********************************************************************/ *函数原型: voidGameOver(void) *传入参数: 无 *返回值: 无 *函数功能: 游戏结束 /*********************************************************************/ voidGameOver(void) { cleardevice(); PrScore(); setcolor(RED); settextstyle(0,0,4); outtextxy(200,200,"GAMEOVER"); getch(); } /*********************************************************************/ *函数原型: voidPrScore(void) *传入参数: 无 *返回值: 无 *函数功能: 打印出游戏得分 /*********************************************************************/ voidPrScore(void) { charstr[10]; setfillstyle(SOLID_FILL,YELLOW); bar(50,15,220,35); setcolor(6); settextstyle(0,0,2); sprintf(str,"score: %d",score); outtextxy(55,20,str); } /***********
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 贪吃蛇总结报告 贪吃 总结报告 word