收藏 分享(赏)

推箱子游戏课程设计.doc

上传人:精品资料 文档编号:8066616 上传时间:2019-06-07 格式:DOC 页数:18 大小:87KB
下载 相关 举报
推箱子游戏课程设计.doc_第1页
第1页 / 共18页
推箱子游戏课程设计.doc_第2页
第2页 / 共18页
推箱子游戏课程设计.doc_第3页
第3页 / 共18页
推箱子游戏课程设计.doc_第4页
第4页 / 共18页
推箱子游戏课程设计.doc_第5页
第5页 / 共18页
点击查看更多>>
资源描述

1、目录摘要前言功能描述配置要求总体设计一、功能模块设计二、数据结构设计三、函数功能描述四、代码实现参考文献摘 要推箱子游戏是一款很有趣味的游戏,其开发过程有一定的技巧和方法,其中涉及到软中断、二维数组、键盘操作以及图形化函数等方面的知识。本游戏的开发者需要基本掌握显示器中断寄存器的设置。二维数组及结构体的定义、键盘上键值的获取、图形方式下光标的显示各定位,以及部分图形函数的使用。前 言推箱子游戏是目前比较流行的游戏之一,很多操作系统或者流行软件都会带有这种游戏。它既能锻炼思维的严密性,又有很多乐趣。我个人也比较喜欢玩这个游戏,因此,我就借这个机会将这个推箱子游戏用 C 语言实现了出来,当然,我也

2、借鉴了前人的一些技巧经验。由于时间仓促和本人水平有限,此游戏的制作显得有些粗糙,希望老师能够谅解,我以后将会再接再厉。功能描述本游戏一共 4 关,由易到难,每一关都有初化、按键处理、重置及退出功能。(1)初始化包括屏幕初始化和每一关卡的初始化,屏幕被初始化宽 80 像素,高 25 像素。(2)按键处理包括移动小人和移动箱子,通过移动上下左右键来控制小人的移动,从而推动箱子,以把箱子推到指定的目的地为过关。(3)每一关都可以重置,按空格键可以重置当前关。(4)按 Esc 键可以在任何时候退出游戏。配置要求(1)硬件配置CPU:Pentium III 600内存:64MB硬盘剩余空间:128MB(

3、2)软件环境Turbo C 2.0 及其以上版本总体设计一、 功能模块设计1、系统模块图本程序包括 5 个模块,分别是初始化模块、画图模块、移动箱子模块、移动小人模块和功能控制模块,如图(一)所示。各个模块的功能描述如下:(1)初始化模块。该模块包括屏幕初始化和游戏第一关的初始化。屏幕初始化用于输出欢迎信息和操作提示,游戏每一关的初始化是构建每一关的关卡。(2)画图模块。该模块主要是被其它模块调用,用于画墙、在空地画箱子、在目的地画箱子、画小人和画目的地。(3)移动箱子模块。该模块用于移动箱子,包括目的地之间、空地之间和目的地与空地之间的箱子移动。(4)移动小人模块。该模块用于控制小人移动,从

4、而推动箱子到目的地。(5)功能控制模块。该模块是几个功能函数的集合,包括屏幕输出功能、指定位置状态判断功能和关卡重置功能。推箱子游戏初始化模块 画图模块 移动箱子模块 移动小人模块 功能控制模块是否继续 完成?开始第一关开始按空格键回到 任务开始按 Esc 键退出显示通关信息有无成功 希望?是否成功?是否是第 4 关? 图(一) 系统模块图2、任务执行流程图游戏从第一关开始,按上下左右方向键控制小人移动来推动箱子,可以在游戏中的任何时候按 Esc 键退出。如果游戏无成功希望,可以按空格键回到当前任务的开始状态;如果成功完成当前关,则进入下一关,如果当前关是最后一关,则显示通关信息,提示游戏结束

5、。图(二)显示了任务执行的流程。否是否是否是是否图(二) 任务执行流程图3、小人移动流程图小人移动的方向有 4 个,move()函数(处理小人移动的函数)对这 4 个方向移动的处理都一致,只是调用函数时的参数有所不同。首先判断小人移动的方向,然后根据小人所处世进入下一关判断移动方向下一步状态为 w ?下一步状态为 m 或 0?当前状态为m?下一步状态为 b?下下一步状态为 0?下下一步状态为 m? 输出空字符、调用printMan()调用 printMan()和printDestination()moveBoxSpacetoDes()moveBoxSpacetoSpace()当前状态为m?pr

6、intDestination()光标移动到下一步处下下一步状态为 0?下下一步状态为 m?下一步状态为 i?的当前状态、下一步状态或者下下一步状态进行适当的处理。处理过程如图(三)所示。是否是否否是是否否否是是否是是否否否是是moveBoxDestoSpace() moveBoxDestoDes()当前状态为m?printDestination()光标移动到下一步处读取下一键图(三) 小人移动流程图否是续图(三) 小人移动流程图二、数据结构设计1、设置全局变量定义二维数组 char status2020,用于记录屏幕一各点的状态。其中, “0”表示什么都没有, “b”表示箱子, “w”表示目的

7、地, “i”表示箱子在目的地。首先将屏幕 20*20 范围内的状态初始化为 0,然后根据具体情况,在画箱子时,将箱子所在点的状态改为“b” ;在画墙壁时,将墙壁所在点的状态改为“w” ;在画目的地时,将目的地所在点的状态改为“m” ;当箱子被推到目的地时,箱子所在点的状态改为“i” ,如果每一关中所有目的地的状态都为“i”,则说明该关已完成。定义全局变量,char far *printScreen=(char far*)0xB8000000,用于在屏幕上输出字符。彩色显示器的字符缓冲区首地址为 0xB8000000,每一个字符占 2 个字节(第一个字节为ASCII 值,第二个字节为颜色值) ,

8、字符模式下屏幕宽 80 像素,高 25 像素,一屏可以写80*25 个字符。2、定义结构体typedef struct winerint x;int y;struct winer *p;winer;定义结构体 struct winer 用于判断每一关是否已完成。其中 x 用于存放目的地的横坐标,y 用于存放目的地的纵坐标。如果所有表示目的地坐标对应的状态都为“i” ,即箱子在目的地,则表示已经过关,可以进入下一关。该结构体的初始化在每一关的初始化时进行。三、函数功能描述1、putoutChar()函数原型:void putoutChar(int y,int x,char ch,char fc,

9、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 指

10、明位置。该函数调用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

11、 指明位置。该函数调用putoutChar()进行输出,以黑色为背景画黄色目的地,用心型表示(ASCII 值为 003) 。6、 printDestination1()函数原型: void printDestination1(int x,int y,winer *win,winer *pw)printDestination1()函数与 printDestination()函数功能基本相同,都是画目的地函数,但是 printDestination1()增加了记录每一个目的地位置的功能。其中 x、y 指明目的地的位置,每一关的所有目的地位置存放在结构体 struct winer 中,形成一条链表,

12、*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

13、*20 范围内的状态,初始化为 0,以后根据实际情况重新赋值;然后设置屏幕输出状态,设置寄存器 AX 的高位为 0,低位为 3,表示以 80*25 的彩色方式显示;最后移动光标到指定的位置输出操作提示信息以及版权信息。9、 初始化游戏函数原型:winer *initStep1()、winer *initStep2()、winer *initStep3()、winer *initStep4()这几个函数分别初始化游戏的第一关到第四关。这些函数的功能和实现步骤相似。首先根据需要在指定的位置画墙壁和画箱子,在这里可以设置游戏的难度,初始化的墙壁越复杂,箱子越多,则游戏就越难。游戏的第一关至第四关难度

14、依次增加。然后分别调用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)这几个函数实现的功能分别是人空地移动箱子到空地、从目的地移动箱子到空地、从空地移动箱子到目

15、的地和中从目的地移动箱子到目的地。X、y 指明小人当前所处的位置,字符a 表示移动的方向,有“u” 、 “d”、 “l”和“r”4 个值,分别表示向上、下、左、右移动。这几个函数的实现原理大致相似。对于前面两个函数,首先判断移动的方向,人小人所在的位置沿着移动的方向移动一步画小人,移动两步画箱子(调用 printBox()函数) ,并设置状态为“b” ;对于后面两个参数,首先判断移动的方向,从小人所在的位置沿着移动方向移动一步画小人,移动两上在目的地画箱子(调用 printBoxDes()函数) ,并设置状态为“i” ,表明箱子在目的地上。11、 judge()函数原型: int judge(

16、int x,int y)judge()根据结构体 structxy中存的值来判断该点的状态。12、 move()函数原型: void moid(int x,int y,char a)Move()函数根据按下的键来处理小人的移动。小人移动的方向有上(“u” ) 、下(“d” ) 、左(“l” ) 、右(“r”)4 个,4 个方向的处理方式一样。首先判断移动的方向,然后根据小人的当前位置、下一步位置以及下下一步位置所在的状态进行处理。(1) 若下一步所在位置的状态为墙壁(“w” ) ,则直接退出,不作任何处理。(2) 若下一步所在位置的状态为目的地(“i” )或者什么都没有(“0” ) ,则: 若

17、当前位置的状态为目的地,则在当前位置画目的地(调用 printDestination()函数) 、在下一步位置画小人(调用 printMan()函数) 。 若当前位置的状态为非目的地,则输出空格清空当前位置的小人,并在下一步位置画小人(调用 printMan()函数) 。(3) 若下一步所在位置的状态为箱子(“b” ) ,则:如果下下一步位置的状态为“0” ,则把箱子从空地移动到空地(调用moveBoxSpacetoSpace()函数) ,然后把光标移动到下一步位置(如果当前位置的状态为目的地,则应先画目的地(调用 printDestinanion()函数) ) 。如果下下一步位置的状态为目的

18、地,则把箱子从空地移动到目的地(调用moveBoxSpacetoDes()函数) ,然后把光标移动到下一步位置(如果当前位置的状态 为目的地,则应先画目的地(调用 printDestination()函数) ) 。其它情况则直接返回,不作任何处理。(4) 若下一步所在位置的状态为箱子在目的地(“i” ),则: 如果下下一步位置的状态为“0” ,则把箱子从目的地移动到空地(调用moveBoxDestoSpace()函数) ,然后把光标移动到下一步位置(如果当前位置的状态为目的地,则应先画目的地(调用 printDestination()函数) ) 。 如果下下一步位置的状态为目的地,则把箱子从目

19、的地移动到目的地(调用moveBoxDestoDes()函数) ,然后把光标移动到下一步位置(如果当前位置的状态为目的地,则应先画目的地(调用 printDestination()函数) ) 。 其它情况则直接返回,不作任何处理。13、 reset()函数原型:void reset(int i)reset()函数的功能是重置当前关。该函数首先判断当前关是第几关,然后调用 init()函数和初始化当前关的函数进行重置。14、 主函数主函数首先设置寄存器 AX 的高位和低位,显示器软中断,进行显示状态的设置,初始化屏幕,初始化第一关,并显示操作提示信息和版权信息。然后根据按下的键(bioskey(

20、0)函数返回按下的键值)进行处理,处理过程由 move()函数进行(如果按下Esc 键,则退出程序) 。对于每一关,如果所有的表示目的地的状态都由“m”变成了“i”,则表示通过该关,可以进入下一关。四、代码实现1、程序预处理程序预处理部分包括加载头文件、定义全局变量和定义数据结构,并对它们进行初始化工作。其中加载头文件的代码如下:#include #include #include #include #include #include 2、初始化模块该模块主要用于对屏幕和关卡的初始化,初始化关卡时是调用画图模块中画图函数。该模块包括以下几个函数。(1) void init(),初始化屏幕的大小

21、、显示方式、显示操作提示信息和版权信息。(2) winer *initStep1(),初始化游戏的第一关。(3) winer *initStep2(),初始化游戏的第二关。(4) winer *initStep3(),初始化游戏的第三关。(5) winer *initStep4(),初始化游戏的第四关。其中初始化屏幕函数的详细代码如下:void init() int i,j; for(i=0;ixpw-y=m)/*未被推到目的地的箱子数*/s+; /*判断下一个目的地的状态*/pw=pw-p; /*该关完成*/if(s=0) /*释放分配的空间*/free(win);gotoxy(15,20)

22、;printf(“congratulate! You have done this step!“); getch();i+; switch(i) /*进入第二关*/case 1:init();win=initStep2();break;/*进入第三关*/case 2:init();win=initStep3();break;/*进入第四关*/case 3:init();win=initStep4();break;/*完成所有关*/case 4:gotoxy(15,21); printf(“Congratulation! n“);gotoxy(15,22);printf(“You have do

23、ne all the steps, You are very clever!“);/*设置键为 Esc 以便退出程序*/key=0x011b;/*按任意键结束*/getch();break;default:break; while(key!=0x011b); _AL=3; _AH=0; geninterrupt(0x10); 参考文献C 程序设计(第三版) ,谭浩强编,清华大学出版社Turbo C 2.0 实用大全 ,常玉龙等编写,北京航空航天大学出版社C 语言趣味程序百例精解 ,陈朔鹰 陈英主编,北京理工大学出版社C 游戏编程从入门到精通 ,浦滨著, 北京希望电子出版社C 函数实用手册 ,张曜 郭立山 吴天著, 冶金工业出版社

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报