高级语言程序设计推箱子游戏

发布 2021-04-24 16:41:28 阅读 1018

说明书。设计题目:推箱子游戏。

目录。 摘要 3

前言 3 功能描述 3

总体设计 4

一、功能模块设计 3

二、数据结构设计 7

三、函数功能描述 8

四、**实现 11

五、测试结果 19

参考文献 20

摘要。推箱子游戏是一款很有趣味的游戏,其开发过程有一定的技巧和方法,其中涉及到软中断、二维数组、键盘操作以及图形化函数等方面的知识。本游戏的开发者需要基本掌握显示器中断寄存器的设置。

二维数组及结构体的定义、键盘上键值的获取、图形方式下光标的显示各定位,以及部分图形函数的使用。

前言。推箱子游戏是目前比较流行的游戏之一,很多操作系统或者流行软件都会带有这种游戏。它既能锻炼思维的严密性,又有很多乐趣。

我个人也比较喜欢玩这个游戏,因此,我就借这个机会将这个推箱子游戏用c语言实现了出来,当然,我也借鉴了前人的一些技巧经验。由于时间仓促和本人水平有限,此游戏的制作显得有些粗糙,希望老师能够谅解,我以后将会再接再厉。

功能描述。

本游戏一共4关,由易到难,每一关都有初化、按键处理、重置及退出功能。

1)初始化包括屏幕初始化和每一关卡的初始化,屏幕被初始化宽80像素,高25像素。

2)按键处理包括移动小人和移动箱子,通过移动上下左右键来控制小人的移动,从而推动箱子,以把箱子推到指定的目的地为过关。

3)每一关都可以重置,按空格键可以重置当前关。

4)按esc键可以在任何时候退出游戏。

总体设计。

一、 功能模块设计。

1、系统模块图。

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

1)初始化模块。

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

2)画图模块。

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

3)移动箱子模块。

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

4)移动小人模块。

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

5)功能控制模块。

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

图(一) 系统模块图。

2、任务执行流程图。

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

否。是。

否。是。否。是。

是。否。

图(二) 任务执行流程图。

3、小人移动流程图。

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

是。否。

是否 否是。

是否否。否是是。否。是。

是否否。否是是。

图(三) 小人移动流程图。否。是。

续图(三) 小人移动流程图。

二、数据结构设计。

1、设置全局变量。

定义二维数组char status[20][20],用于记录屏幕一各点的状态。其中,“0”表示什么都没有,“b”表示箱子,“w”表示目的地,“i”表示箱子在目的地。首先将屏幕20*20范围内的状态初始化为0,然后根据具体情况,在画箱子时,将箱子所在点的状态改为“b”;在画墙壁时,将墙壁所在点的状态改为“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;

struct winer *p;

winer;

定义结构体struct winer用于判断每一关是否已完成。其中x用于存放目的地的横坐标,y用于存放目的地的纵坐标。如果所有表示目的地坐标对应的状态都为“i”,即箱子在目的地,则表示已经过关,可以进入下一关。

该结构体的初始化在每一关的初始化时进行。

三、函数功能描述。

1、 putoutchar()

函数原型: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、 printdestination()

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

printdestination()函数用于画目的地,传入参数x、y指明位置。该函数调用putoutchar()进行输出,以黑色为背景画黄色目的地,用心型表示(ascii值为003)。

6、 printdestination1()

函数原型: void printdestination1(int x,int y,winer **win,winer **pw)

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

7、 printman()

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

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

8、 init()

函数原型: void init()

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

9、 初始化游戏。

函数原型:winer *initstep1()、winer *initstep2()、winer *initstep3()、winer *initstep4()

这几个函数分别初始化游戏的第一关到第四关。这些函数的功能和实现步骤相似。首先根据需要在指定的位置画墙壁和画箱子,在这里可以设置游戏的难度,初始化的墙壁越复杂,箱子越多,则游戏就越难。

游戏的第一关至第四关难度依次增加。然后分别调用printdestination1()和printman()函数画目的地和小人。函数返回包含各个目的地位置的链表。

10、 移动箱子。

函数原型: void moveboxspacetospace(int x,int y,char a)、void moveboxdestospace(int x,int y, char a)、void moveboxspacetodes(int x,int y,char a)、void moveboxdestodes(int x,int y,char a)

这几个函数实现的功能分别是人空地移动箱子到空地、从目的地移动箱子到空地、从空地移动箱子到目的地和中从目的地移动箱子到目的地。x、y指明小人当前所处的位置,字符a表示移动的方向,有“u”、“d”、“l”和“r”4个值,分别表示向上、下、左、右移动。这几个函数的实现原理大致相似。

对于前面两个函数,首先判断移动的方向,人小人所在的位置沿着移动的方向移动一步画小人,移动两步画箱子(调用printbox()函数),并设置状态为“b”;对于后面两个参数,首先判断移动的方向,从小人所在的位置沿着移动方向移动一步画小人,移动两上在目的地画箱子(调用printboxdes()函数),并设置状态为“i”,表明箱子在目的地上。

11、 judge()

函数原型: int judge(int x,int y)

judge()根据结构体struct[x][y]中存的值来判断该点的状态。

高级语言程序设计

总分 100.00,做题时间 90分钟 一 单项选择题 总题数 15,分数 30.00 语言早期规定建立文件缓冲区采用的形式是 分数 2.00 a.缓冲文件系统。b.非缓冲文件系统。c.分页文件系统。解析 2.以下是对二维数组的正确说明的是 分数 2.00 a 3,4 a 1 4 a 3 4 解析 ...

高级语言程序设计

班级学号 021110212 姓名 卢荼 同组同学。成绩。时间 2011.6 28 题目 班级档案管理系统。一 设计任务与目标。对一个有n个学生的班级,通过该系统实现对该班级学生的基本信息进行录入 显示 修改 删除 保存等操作的管理。功能要求 1 本系统采用一个包含n个数据的结构体数组,每个数据的结...

高级语言程序设计

36.下面程序的运行结果是。include void main int a 2,b 1,c 2 if aif b 0 c 0 else c printf c d c 参 考察知识点 if语句的嵌套。运行结果 c 2 下面程序的运行结果是。include void main int a,b,c a 3...