贪吃蛇设计综合实验总结报告
课程名称:程序设计实践
选题名称:贪吃蛇
小组长姓名: 方娟 200911211056
小组成员姓名:邹甜 200911211004
杜家萱 200911211066
任课老师:伊乾书法大家
报告递交时间:2009.6.9
一 系统功能说明
贪食蛇游戏是一个深受人们喜爱的游戏:一条蛇在密闭的围墙内,在围墙内出现食物,通过按键控制蛇向上下左右四个方向移动,蛇撞到食物,则食物被吃掉,蛇的身体增加一节。如
果蛇在移动的过程中,撞到墙壁或身体的交叉(蛇头撞到自己的身体)游戏结束。现要求利用Turbo C2.0来实现该游戏。功能要求如下:
一、基本功能
1.提供一个图形模式下的界面。
2.开始游戏:空格键或回车键;退出游戏:Esc键。
3.支持用键盘的方向键来控制蛇的移动,蛇可以向上、下、左、右四个方向移动。
4.当蛇头碰到食物时,食物被吃掉,蛇的身体增长一节。
5.初始场景内随即出现1个食物,当食物被吃掉时,再随机出现一个食物。
6.要有记分机制,没吃掉一个食物,增加相应的分数。
7.蛇碰到墙壁或是自己身体的一部分则游戏结束。
二、高级功能
1.暂停功能:能随时通过按键来暂停游戏,再按一次则继续游戏。
2.速度调节功能:当分数达到某个值后,对蛇的移动速度进行一定的提升,但会有一个速度上限。
3.奖励机制:增加另一种的奖励食物,蛇吃到该种食物后蛇的身体减少一节(最短不能少于2节),但不增加分数。该种食物的颜色要区别与普通食物的颜色。奖励食物有时间限制,在一定时间内没有吃掉则会消失。
4.音效功能:在游戏开始、吃掉食物、撞墙、撞到自己时提供不同的音效。
二 程序结构
(2)重要数据说明
基本思路:
首先设计主界面,主界面是一个密封的围墙,并在屏幕最右面留一部分用来显示分数、计时等其他信息。围墙直接画一个矩形来表示,四面围成密闭的矩形来作为围墙。接着是初始化蛇与食物的位置并将他们用图形表示出来。然后进行一个循环,将蛇按当前的方向移动,并处理键盘的方向按键信息,调整蛇的移动方向。蛇头如果碰到食物,则食物消失,蛇身增长一节,更新分数,并在另外的地方又随机出现食物;如果碰到围墙或是自己的身体,则游戏结束,关闭图形系统。
1)游戏场景用一个二维坐标表示
移动方向利用定义16位制键值
如#define LEFT ox40b00
2)在函数中利用switch函数进行控制方向
3)利用结构体来表示蛇,定义两个二维数组分别表示蛇的身体的每一节,记录其横纵坐标
struct Snake /*定义蛇的结构体*/
{
int x[N];
int y[N];
int node;
int direction;/*蛇移动方向*/
int life;/* 蛇的生命,0活着,1死亡*/
}snake;
利用两个一维数组来控制蛇本身的横纵坐标
4)食物的表示是一个结构体
struct Food{
a)int x;
b)int y;
c)int die;/*判断是否出现食物*/
d)int bonus;/*判断是否要出现食物的变量*/}
(3)函数清单
文件名 | 函数原型 | 函数功能 | 处理描述 |
draw.c | void Init(void) | 初始化图形模式 | 调用initgraph()切换到图形模式 |
void Draw(void) | 归园田居翻译初始化贪吃蛇界面 | 调用rectangle()画围墙 |
void Clo(void) | 关闭图形 | 调用clograph()关闭图形 |
timer.c | 成本加成法void interrupt(*oldtimer)(void) | 指向原来的时钟中断处理过程入口中的中断处理函数指针(句柄) | |
void interrupt newtimer(void) | 新的时钟中断处理过程 | 调用(*oldtimer)()函数句柄,计时器自动加1 |
void SetTimer(void interrupt(*IntProc)(void)) | 设置新的时钟中断处理过程 | 调用tvect()设置新的时钟中断处理过程 |
void KillTimer() | 恢复原有的时钟中断处理过程 | 调用tvect()恢复原有的时钟中断处理过程 |
play.c | void GamePlay(void) | 游戏实现的过程 | 如何画出蛇 蛇如何移动 蛇的身体怎样增加 怎样吃食物 怎样控制奖励 |
void GameOver(void) | 游戏结束后退出游戏 | 如果蛇死,则退出游戏 |
void PrScore(void) | 打印出游戏得分 | 在游戏界面的适当位置打印出游戏得分 |
void IsBonus(void) | 判断是否产生奖励 | 游戏的分数每增加100分,产生一个奖励 |
void Eatfood(void) | 判断是否吃食物 | 判断蛇头的位置和食物的位置是否相同 |
void Eatbonus(void) | 判断是否吃奖励 | 判断奖励的位置和蛇头的位置是否相同 |
void Notbonus(void) | 到时间后奖励没被吃掉则奖励消失 | 到达设定的时间后,若奖励没被吃则消失 |
| | | |
(4)重要函数算法分析
整个贪吃蛇游戏由5个源文件组成,分别是snake.h、timer.c、draw.c、play.c、main.c、snake.h文件
Snake.h
该文件包括贪吃蛇程序设计中所需要的系统头文件、宏定义、外部全局变量申明和函数原型说明等组成,使构成的贪吃蛇的各个C源文件只需要引用该头文件即可。
#ifndef SNAKE_H
#define SNAKE_H /*防止函数重定义*/
#define N 200
#include <stdlib.h>
#include<graphics.h>
#include <DOS.H>/*系统头文件*/
#define LEFT 0x4b00 /*定义上下左右的键值*/
#define RIGHT 0x4d00
#define DOWN 0x5000
#define UP 0x4800
#define ESC 0x011b
#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 x[N];
int y[N];
int node;
int direction;/*蛇移动方向*/
int life;/* 蛇的生命,0活着,1死亡*/
}snake;
void Init(void); /*图形驱动*/
void Clo(void); /*图形结束*/
void Draw(void); /*开始画面*/
void GameOver(void); /*结束游戏*/
void GamePlay(void);/* 游戏实现的过程*/
void PrScore(void);/*打印游戏得分*/
void IsBonus(void); /*判断是否产生奖励*/
void Eatfood(void); /*判断是否吃食物*/
void Eatbonus(void); /*判断是否吃奖励*/
手相图解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();/**/
车模美女图片#endif
源代码
Timer.c文件
时钟中断处理源程序文件,主要包括原先的时钟中断处理函数句柄、新的时钟中断处理函数、设置新的时钟中断处理过程、恢复原有的时钟中断处理过程的四个函数。
#include“snake.h”
Unsigned int TimerCounter=0;/*计时变量,每秒钟增加18*/
/****************************************************/
*函数原型:void interrupt(*oldtimer)(void);
*传入参数:无
*返回值:无
*函数功能:指向原来的时钟中断处理过程入口的中断处理函数指针(句柄)
/*****************************************************************/
void interrupt(*oldtimer)(void);
/*****************************************************************/
代人受过
*函数原型:void interrupt newtimer(void);
*传入参数:无
*返回值:无
*函数功能:新的时钟中断处理函数
/**********************************************************************/
void interrupt newtimer(void)
{
(*oldtimer)();
TimerCounter++;
}
/*****************************************************************/
*函数原型:void SetTimer(void interrupt(*IntProc)(void))
*传入参数:无
*返回值:无
*函数功能:设置新的时钟中断处理函数
/********************************************************************/
void SetTimer(void interrupt(*IntProc)(void))
{
oldtimer=getvect(TIMER);
disable();
tvect(TIMER,IntProc);
enable();
}
/*****************************************************************/
*函数原型:void KillTimer()
*传入参数:无