推箱子游戏
设计报告书
需求介绍:
推箱子游戏是目前比较流行的游戏之一,很多操作
系统或者流行
软件都会带这种游戏。它既能锻炼思维的严密性,又有很多乐趣。本设计将用C语言实现一个简单的推箱子游戏,旨在阐述推箱子游戏的实现方法。
设计目的:
本设计旨在训练开发者的基本编程技巧,其中涉及软中断、二维数组、键盘操作及图形化函数等方面的知识。通过本设计的训练,开发者能基本掌握显示器中断寄存器的设置、二维数组及结构体的定义、键盘上键值的获取、图形方式下光标的显示和定位,以及部分图形函数的使用。
功能描述:
本游戏共有4关,由易到难,每一关都有初始化、按键处理、重置及退出功能。
(1) 初始化包括屏幕初始化和每一关关卡的初始化,屏幕被初始化宽80列,高25行。
(2) 按键处理包括移动小人和移动箱子,通过移动上下左右键控制小人的移动,从而推动箱子,以把箱子推到指定的目的地为通关。
(3) 每一关都可以重置,按空格键可以重置当前关。
(4) 按ESC键可以在任何时候退出游戏。
总体设计:
1. 功能模块设计
(1) 系统模块图
本设计包括5个模块,分别是初始化模块、图画模块、移动箱子模块、移动小人模块和功能控制模块,如图1所示。各个模块的功能描述如下。
1) 初始化模块
该模块包括屏幕初始化和游戏每一关的初始化。屏幕初始化用于输出欢迎信息和操作提示,游戏每一关的初始化是构建每一关的关卡。
2) 图画模块。
该模块主要是被其他模块调用,用于画墙、在空地画箱子、在目的地画箱子、画小人和画目的地。
3) 移动箱子模块
该模块用于移动箱子,包括目的地之间、空地之间和目的地与空地之间的箱子移动。
4) 移动小人模块
该模块用于控制小人移动,从而推动箱子到目的地。
5) 功能控制模块
该模块是几个功能函数的集合,包括屏幕输出功能、指定位置状态判断功能和关卡重置功能。
图1 系统模块图
(2) 任务执行流程图
游戏从第一任务开始(第一关),按上下左右方向键控制小人移动来推动箱子,可以在游戏中的任何时候按Esc键退出。如果游戏无成功希望,可以按空格键回到当前任务的开始状态;如果成功完成当前关,则进入下一关,如果当前关是最后一关,则显示通关信息,提示游戏结束。图2显示了任务执行的流程图。
(3) 小人移动流程图
小人移动的方向有四个,move()函数(处理小人移动的函数)对这4个方向移动的处理都一致,只是调用函数时的参数有所不同。首先判断小人移动的方向,然后根据小人所处的当前状态、下一步状态或者下下一步状态进行适当的处理。处理过程如图3所示。
图2 任务执行流程图
图3 小人移动流程图
2. 数据结构设计
(1) 设置全局变量
定义二维数组char status[20][20],用于记录屏幕上各点的状态。其中,"0"表示什么都没有,"b"表示箱子,"m"表示目的地,"i"表示箱子在目的地,"w"表示墙壁。首先将屏幕20×20范围内的状态初始化为0,然后根据具体情况,在画箱子时,将箱子所在点的状态改为"w";在画目的地时,将目的地所在点的状态改为"m";当箱子被推到目的地时,箱子所在点的状态为"i",如果每一关中所有目的地的状态都为"i",则说明该关已完成。
定义全局变量,char far *printScreen=(char far*)0XB8000000,用于在屏幕上输出字符。彩色显示器的字符缓冲区首地址为0XB8000000,每个字符占2字节(第一个字节为ASCII值,第二个为颜色值),字符模式下屏幕宽80列,高25行,一屏可以写80×25个字符。
(2) 定义结构体
typedef struct winer
{
int x;
int y;