湖南商学院2

2019-06-05 13:47

推箱子游戏课程设计

一、课程设计任务与要求

推箱子游戏既能锻炼思维的严密性,又有很多乐趣。为了能在玩时也能锻炼思维,我尽力设计了一个简单的推箱子游戏,其开发过程有一定的技巧和方法,其中涉及到软中断、二维数组、键盘操作以及图形化函数等方面的知识。本游戏的开发者需要基本掌握显示器中断寄存器的设置。二维数组及结构体的定义、键盘上键值的获取、图形方式下光标的显示各定位,以及部分图形函数的使用。

二、总体设计

1、系统模块

本程序包括5个模块,分别是初始化模块、画图模块、移动箱子模块、移动小人模块和功能控制模块,。各个模块的功能描述如下: 1)初始化模块

该模块包括屏幕初始化和游戏第一关的初始化。屏幕初始化用于输出欢迎信息和操作提示,游戏每一关的初始化是构建每一关的关卡。 2)画图模块

该模块主要是被其它模块调用,用于画墙、在空地画箱子、在目的地画箱子、画小人和画目的地。 3)移动箱子模块

该模块用于移动箱子,包括目的地之间、空地之间和目的地与空地之间的箱子移动。 4)移动小人模块

该模块用于控制小人移动,从而推动箱子到目的地。 5)功能控制模块

该模块是几个功能函数的集合,包括屏幕输出功能、指定位置状态判断功能和关卡重置功能。

推箱子游戏 初始化模块 画图模块 移动箱子模块 第 1 页 共 26 页

移动小人模块 功能控制模块

图(1) 系统模块图

2、任务执行流程

游戏从第一关开始,按上下左右方向键控制小人移动来推动箱子,可以在游戏中的任何时候按Esc键退出。如果游戏无成功希望,可以按空格键回到当前任务的开始状态;如果成功完成当前关,则进入下一关,如果当前关是最后一关,则显示通关信息,提示

游戏结束。

开始 第一关开始 否 是否继续完成? 按Esc键退出

有无成功 希望? 否 否

是 是否是第四关? 是否成功? 按空格键回到任务开始

否 进入下一关 显示通关信息

图(2) 任务执行流程图

3、小人移动流程

小人移动的方向有4个,move()函数(处理小人移动的函数)对这4个方向移动的处理都一致,只是调用函数时的参数有所不同。首先判断小人移动的方向,然后根据小人所处世的当前状态、下一步状态或者下下一步状态进行适当的处理。

第 2 页 共 26 页

判断移动方向 否 是 下一步状态为w? 否 下一步状态 是 当前状态 否 为0或m? 为m? 输出空字符,调用printMain() 否 是 下一步状态为b? 调用printMain()和printDestination() 是 否 否 下下一步状态为0? 下下一步状态为m? 否 是 是 moveBoxSpacetoSpace() moveBoxSpacetoDes() 是 当前状态 否

下一步状态为i? 为m? 是 否 4函数功能描述 1)putoutChar()

第 3 页 共 26 页

printDestination() 光标移动到下一步处 读取下一键 图(3) 小人移动流程图

函数原型:void putoutChar(int y,int x,char ch,char fc,char bc)

putoutChar()函数在屏幕上的指定位置输出指定的字符。其中,x、y指明输出的位置,ch表示输出的字符,fc表示输出的字符颜色,bc 表示背景色。

2)printWall()

函数原型:void printWall(int x,int y)

printWall()函数用于画墙壁,传入参数x、y指明位置。该函数调用putoutChar()进行输出,以黑色为背景画绿色墙,用小方块表示墙(ASCII值为219)。

3)printBox()

函数原型:void printBox(int x,int y)

printBox()函数用于在非目的地画箱子,传入参数x、y指明位置。该函数调用putoutChar()进行输出,以黑色为背景白色箱子,用ASCII值为10的字符表示箱子。

4)printBoxDes()

函数原型:void printBoxDes(int x,int y)

printBoxDes()函数用于在目的地画箱子,传入参数x、y指明位置。该函数调用putoutChar()进行输出,以黑色为背景画黄色箱子,仍用ASCII值为10的字符表示箱子。

5)printDestination1()

函数原型: void printDestination1(int x,int y,winer **win,winer **pw) printDestination1()函数与printDestination()函数功能基本相同,都是画目的地函数,但是printDestination1()增加了记录每一个目的地位置的功能。其中x、y指明目的地的位置,每一关的所有目的地位置存放在结构体struct winer中,形成一条链表,**winer返回链表的头,**pw则指向链表的尾部。

6)printMan()

函数原型: void printMan(int x,int y)

printMan()函数用于画小人。X、y指明画的位置。该函数通过软中断来实现,首先设置寄存器AX的高位和低位,设置高位0xa表示在光标位置显示字符;设置低位02(ASCII值),表示输出的字符;然后设置寄存器CX为01,表示重复输出的次数,这里只输出一次;最后产生类型为0x10的中断,表示显示器输出。

7)init()

函数原型: void init()

init()函数用于初始化屏幕。该函数首先用两个for循环初始化屏幕20*20范围内的状态,初始化为0,以后根据实际情况重新赋值;然后设置屏幕输出状态,设置寄存器AX的高位为0,低位为3,表示以80*25的彩色方式显示;最后移动光标到指定的位置输出操作提示信息以及版权信息。

8)move()

函数原型: void moid(int x,int y,char a) Move()函数根据按下的键来处理小人的移动。小人移动的方向有上(“u”)、下(“d”)、左(“l”)、右(“r”)4个,4个方向的处理方式一样。首先判断移动的方向,然后根据小人的当前位置、下一步位置以及下下一步位置所在的状态进行处理。

(1) 若下一步所在位置的状态为墙壁(“w”),则直接退出,不作任何处理。 (2) 若下一步所在位置的状态为目的地(“i”)或者什么都没有(“0”),则: ① 若当前位置的状态为目的地,则在当前位置画目的地(调用printDestination()函数)、在下一步位置画小人(调用printMan()函数)。 ② 若当前位置的状态为非目的地,则输出空格清空当前位置的小人,并在下一步位

第 4 页 共 26 页

置画小人(调用printMan()函数)。 (3) 若下一步所在位置的状态为箱子(“b”),则: ① 如果下下一步位置的状态为“0”,则把箱子从空地移动到空地(调用

moveBoxSpacetoSpace()函数),然后把光标移动到下一步位置(如果当前位置的状态为目的地,则应先画目的地(调用printDestinanion()函数))。

② 如果下下一步位置的状态为目的地,则把箱子从空地移动到目的地(调用

moveBoxSpacetoDes()函数),然后把光标移动到下一步位置(如果当前位置的状态 为目的地,则应先画目的地(调用printDestination()函数))。 ③ 其它情况则直接返回,不作任何处理。

(4) 若下一步所在位置的状态为箱子在目的地(“i”),则: ① 如果下下一步位置的状态为“0”,则把箱子从目的地移动到空地(调用moveBoxDestoSpace()函数),然后把光标移动到下一步位置(如果当前位置的状态为目的地,则应先画目的地(调用printDestination()函数))。

② 如果下下一步位置的状态为目的地,则把箱子从目的地移动到目的地(调用moveBoxDestoDes()函数),然后把光标移动到下一步位置(如果当前位置的状态为目的地,则应先画目的地(调用printDestination()函数))。 ③ 其它情况则直接返回,不作任何处理。 9)reset()

函数原型:void reset(int i)

reset()函数的功能是重置当前关。该函数首先判断当前关是第几关,然后调用init()函数和初始化当前关的函数进行重置。 10)主函数

主函数首先设置寄存器AX的高位和低位,显示器软中断,进行显示状态的设置,初始化

屏幕,初始化第一关,并显示操作提示信息和版权信息。然后根据按下的键(bioskey(0)函数返回按下的键值)进行处理,处理过程由move()函数进行(如果按下Esc键,则退出程序)。对于每一关,如果所有的表示目的地的状态都由“m”变成了“i”,则表示通过该关,可以进入下一关。

三、详细设计

1、程序预处理

程序预处理部分包括加载头文件、定义全局变量和定义数据结构,并对它们进行初始化工作。其中加载头文件的代码如下: #include #include #include #include #include #include 2、初始化模块

该模块主要用于对屏幕和关卡的初始化,初始化关卡时是调用画图模块中画图函数。该模块包括以下几个函数。

① void init(),初始化屏幕的大小、显示方式、显示操作提示信息和版权信息。 ② winer *initStep1(),初始化游戏的第一关。

第 5 页 共 26 页


湖南商学院2.doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:论文提纲

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: