推箱子游戏设计.docx
- 文档编号:5435410
- 上传时间:2022-12-16
- 格式:DOCX
- 页数:54
- 大小:644.51KB
推箱子游戏设计.docx
《推箱子游戏设计.docx》由会员分享,可在线阅读,更多相关《推箱子游戏设计.docx(54页珍藏版)》请在冰豆网上搜索。
推箱子游戏设计
摘要
推箱子游戏是一款很有趣味的游戏,气开发过程有一定的技巧和方法,其中涉及到软件中断,二维数组,键盘操作以及图形化函数等方面的知识。
本游戏的开发者需要基本掌握显示器中断寄存器的设置。
二维数组及结构体的定义,键盘上键值的获取,方式下光标的显示各定位,以及部分图形函数的使用。
关键字:
推箱子过程开发
前言
推箱子游戏是目前比较流行的游戏之一,很多操作系统或者流行软件都会带有这种游戏。
它既能锻炼思维的严密性,又有很多乐趣,我个人也比较喜欢玩这个游戏,因此,我就借这个机会将这个推箱子游戏用汇编语言实现出来,当然,我也借鉴了前人的一些技巧经验,由于时间仓促和本人水平有限,此游戏的制作显得很粗燥,希望老师能够谅解,我以后将会再接再厉。
计算机科学与技术专业(11级)
汇编语言实训课程设计任务书
题目:
推箱子游戏程序班级:
11计算机科学与技术1班
学生姓名:
任元元学号:
********
题目类型:
软件工程(R)指导教师:
刘树群
一.题目简介
通过该题目的设计过程,可以培养学生结构化程序设计的思想,加深对汇编语言基本语言要素和流程结构的理解,针对汇编语言中的重点和难点内容进行训练,独立完成有一定工作量的程序设计任务,同时强调好的程序设计风格。
得到软件工程的综合训练,提高解决实际问题的能力。
二.设计任务
1、查阅文献资料,一般在5篇以上;
2、完成软件结构设计和算法设计;
3、完成系统的软件开发和测试工作;
4、撰写设计说明书;
5、做好答辩工作。
三.主要内容、功能及技术指标
1、实现功能及指标:
①使用Win32的窗口程序模式,实现推箱子游戏程序的设计与开发;②计算出箱子的位置、范围和形状有效性;③游戏的难度级别的关卡设定;④界面友好。
2、问题分析及解决方案框架确定:
充分地分析和理解问题本身,弄清要求做什么。
在确定解决方案框架过程中,综合考虑系统功能,考虑怎样使系统结构清晰、合理、简单和易于调试。
最后确定每个过程和函数的简单功能,以及过程(或函数)之间的调用关系,并画出函数之间的调用关系图。
3、详细设计和编码:
定义相应的存储结构,确定各个函数的算法,并画出流程图,在此基础上进行代码设计,每个明确的功能模块程序一般不超过200行,否则要进一步划分。
4、上机前程序静态检查:
上机前程序静态检查可有效提高调试效率,减少上机调试程序时的无谓错误。
静态检查主要有两种途径:
用一组测试数据手工执行程序;通过阅读或给别人讲解自己的程序而深入全面地理解程序逻辑。
把程序中的明显错误事先排除。
5、程序调试与测试:
采用自底向上,分模块进行,即先调试低层函数。
能够熟练掌握调试工具的各种功能,设计测试数据确定疑点,通过修改程序来证实它或绕过它。
调试正确后,认真整理源程序及其注释,形成格式和风格良好的源程序清单和结果。
6、完成课程设计报告
①需求和规格说明:
设计题目和问题描述:
题目要解决的问题是什么;
②设计思路:
主要算法思想,程序功能图,函数之间的调用关系图;
设计表示:
每个函数或过程的功能,列出每个过程或函数所调用的过程或函数,并画出各函数的流程图;
详细设计:
主要算法的伪代码;
③调试报告:
调试过程中遇到的主要问题,是如何解决的;对设计和编码的回顾讨论和分析;改进设想;经验和体会等;
④程序实现注释;
⑤附录:
源程序清单和结果。
如果题目规定了测试数据,则结果要求包含这些测试数据和运行输出,当然还可以含其他测试数据和运行输出。
四.提交的成果
1.设计说明书一份,内容包括:
1)中文摘要100字;关键词3-5个;
2)前言;
3)系统分析(包含需要的系统流程图);
4)系统总体设计(包含总体软件结构图、总体数据结构);
5)详细设计;
6)系统测试(包含测试方案、测试用例、测试结果及软件可靠性分析);
7)软件使用说明书(核心界面说明);
8)设计总结、参考文献、致谢等。
2.刻制光盘一张。
五.主要参考文献
1王爽.汇编语言(第二版).清华大学出版社,2008。
2沈美明,温冬婵.IBM-PC汇编语言程序设计(第二版).清华大学出版社,2001。
3[美]KipR.Irvine著,温玉洁,等译.Intel汇编语言程序设计(第五版).电子工业出版社,2007。
4钱晓捷.汇编语言程序设计(第二版).电子工业出版社,2003。
5罗云彬.Windows环境下32位汇编语言程序设计(第二版).电子工业出版社,2006。
6WindowsAPI函数参考手册.人民邮电出版社,2002。
一系统分析
本游戏为推箱子游戏,即通过移动方向键来控制小人去推动箱子,直到把所有的箱子都推动到各个目标中。
游戏需要在人物行走过程中无法穿越墙和箱子,并在有限的范围中放好各箱子,且每次只能搬运一个箱子。
所基于的语言是8086汇编,使用的编译环境是唐都的集中开发环境TD-PIT。
本次设计的基本思想是通过将不同的元素(墙、路、箱子、人、目标位)抽象为不同的矩阵,然后将所设计的地图描抽象成一个控制矩阵来控制图像的显示,每一个控制矩阵块代表一个元素,我们通过不断刷新控制矩阵来达到显示人物移动及推箱子的效果。
1.1推箱子游戏具有的功能
(1)显示主菜单和界面
游戏需要提供货源主菜单让玩家进行游戏设置,同时能够把地图文件中的信息转化成图像显示到主游戏界面上。
(2)能够实现键盘操作功能
能够接收到键盘输入的方向键信息,并根据不同的方向键把游戏人物移动到相应的位置。
例如,玩家按方向键“上”时,如果向上的位置是可移动的,那么就当把游戏人物向上移动一个方格。
(3)能够把放置到位置上的箱子进行变色显示
当玩家把箱子推到指定位置的格子时,需要把这个箱子进行变色。
这样就能明确的显示出该箱子已经放置到指定的位置上。
(4)支持游戏的时间计时和步数记录
当玩家开始游戏时就开始计时,游戏中的小人物每走一步就会记录一次步数。
(5)支持游戏的隐藏炸弹和引爆炸弹功能
如果玩家无法将指定的箱子全部推到放置点时,可以通过游戏中设的隐藏炸弹引爆阻挡的墙可以继续游戏。
(6)支持关口选择功能
玩家在游戏中可自行选择需要挑战的关口。
当玩家点击菜单中的“下一关,上一关”按钮时可进行关口的调节
(7)游戏是否通关判断功能
在游戏中,当玩家把所有的箱子都推到箱子放置点时,玩家胜利通过当前游戏关口,进行下一关口的游戏。
如果玩家无法将指定的箱子全部推到放置点时,玩家失败。
玩家可以选择重新进行当前关口的游戏,还是退出游戏。
(8)游戏提供帮助说明
在游戏的菜单中,提供一个使用说明项,以便对本游戏不了解的玩家对游戏进行操作和使用。
二系统总体设计
2.1功能模块的设计
系统模块图
本程序包括六个模块,分别是初始化模块,画图模块,移动箱子模块,移动小人模块,作弊模块和功能控制模块,各个模块的功能描述如下
(1)初始化模块
该模块包括屏幕初始化和游戏第一关的初始化。
游戏每一关的初始化是构建每一关的关卡。
(2)画图模块
该模块主要是被其他模块的调用,用于画墙,在空地画箱子,画小人和画目的地。
(3)移动箱子模块
该模块用于移动箱子,包括目的地之间,空地之间和目的地与空地之间的箱子移动
(4)移动小人模块
该模块用于控制小人移动,从而推动箱子到目的地。
(5)作弊模块
该模块用于无路可走的情况下,可以把墙炸掉,可以给箱子提供一个可走的路。
(6)功能控制模块
该模块是几个功能函数的集合,包括屏幕输出功能,指定位置状态判断功能和关卡重置功能
三详细设计
游戏从第一关开始,按上下左右方向键控制小人移动来推动箱子,可以在游戏中的任何时候按键退出,如果游戏无成功希望,可以按空格键回到当前任务的开始状态;如果成功完成当前关,则进入下一关,如果当前关是最后一关,则显示通关信息,提示游戏结束。
任务执行流程图
3.1程序结构设计
游戏共三个类六个模块组成
游戏对话框类:
主要负责主界面,菜单及各个窗口类对象的创建和调用等处理。
键盘操作模块:
主要负责接收玩家键盘输入并进行对箱子移动等处理。
关口选择类:
主要负责游戏挑战关口的选择和设置。
地图文件读取模块:
主要内容负责读取地图文件进行相应的解析工作。
地图绘制模块:
主要将地图数组中的数据绘制成地图图像。
帮助对话框类:
主要帮助提示的显示及其他辅助信息。
隐藏炸弹和移动炸弹模块:
主要负责炸弹的在墙壁中的移动,方便玩家进行游戏通关。
3.2出错处理设计
(1)出错输出信息
当游戏中出现错误,采用对话框的方式提示用户出现错误。
(2)出错处理对策
当游戏中出现错误时,可以同光中止当前游戏和重新开始游戏得方法处理游戏中的错误。
3.3游戏界面设计
3.3推箱子游戏的主界面设计,如图3.1所示
图3.1
其背景尾灰色格子,墙壁采用红色格子,通道为蓝色,下沿时间计时,炸弹数量,移动次数采用白色背景黑色字体。
3.4推箱子游戏菜单设计,如图3.2所示
图3.2
3.5游戏关口选择的设计,如图3.3所示
图3.3
当玩家需要进行下一关时可以点击下一关的按钮就可以进行下一关的游戏。
3.6游戏帮助对话框的实现
推箱子游戏中的帮助是使用对话框来实现的,如图3.4所示
图3.4
可以点击帮助查看关于游戏的操作
四系统测试
4.1主菜单和界面显示功能的测试
(1)在MASMplus软件下运行推箱子程序
(2)程序启动后,其菜单和主界面如图4.1所示
图4.1
4.2键盘的操作和功能测试
键盘操作功能测试,测试步骤如下(这里对其中的方向键“下”进行测试演示)
(1)游戏开始后的主角位置如图4.2所示。
(2)单击键盘上的“下”方向按键。
(3)查看主角是否向下移动,如图4.3所示
图4.2
图4.3
判断结果:
键盘操作测试成功
4.3箱子放置到指定位置时变色显示功能的测试演示
具体测试步骤如下
(1)推箱子游戏已经开始如图4.2所示
(2)推动箱子到指定位置后,显示如图4.4所示
图4.4
当箱子推到指定位置时通过变色就可以确定箱子是否到达指定位置。
4.4游戏是否通关判断功能的测试演示
(1)游戏开始后,玩家将要推的箱子全部推倒指定位置,只剩最后一个箱子,如图4.5所示
图4.5推动只剩余一个箱子到指定位置测试图
(2)将最后一个箱子推倒指定位置显示效果如图4.6所示
图4.6
点击确定按钮就可以进行下一关,点击取消则回到当前游戏界面
4.5隐藏炸弹和移动炸弹的功能测试演示
(1)按"B"键显示或隐藏炸弹,如图4.7所示
(2)在炸弹显示的情况下,按移动键可以来回移动炸弹,再按"回车"键引爆炸弹(注:
只能将墙壁引爆),如图4.8所示
图4.7显示隐藏炸弹测试图
图4.8移动炸弹以及引爆炸弹测试图
五软件使用说明书
5.1操作说明:
1.上、下、左、右键移动角色
2."B"键显示或隐藏炸弹
3.在炸弹显示的情况下,按"回车"键引爆炸弹(注:
只能将墙壁引爆)
4.按"退格"键可以返回上一步移动,只能回退20步
5.2特殊说明
1)对菜单、工具栏、状态栏、位图进行了定义
2)写了窗口刷新部分的代码,提高了运行效率
3)写了检测是否通关的功能模块,并对地图数据作了修改,运行效率有所提高
4)加入作弊功能:
炸弹和回退功能
5)加入定时器功能
六设计总结
这次的课程设计,从总体上来讲,我们组中3人都发挥出了各自的专长,所以,程序的实现方面比较成功,当然,在设计和编码的过程中,我们也遇到了不同的问题。
因为要求的使用的编程语言是8086汇编语言,由于对它的学习时间不长,所以,好多的指令理解不是很深刻。
在一开始的设计的过程中,总体思想是很模糊的,准确地说,有些不知道从哪里下手,于是就参考了一些文献,加上老师地耐心指导,所以,开始打开了思路,知道使用矩阵这种模型将地图大块化小,从而实现所有动作的控制。
我们选择的是图形显示模式,里面涉及到像素点儿的描绘。
接下来,我们遇到的问题就是如何能够画出比较美观的图像。
在老师的提示下,我们去学习了BMP文件格式,通过photoshop软件将别人做得比较好的图像转化成我们要求的格式。
但是,在不断的实践中,我们发现那样提取出来的数据和自己想要的不太一样,而且差距比较大。
所以,在没有弄清楚到底是什么原因的情况下,我们组的成员提议自己来配色,设计每一个元素的像素点儿。
在她们的努力下,我们得图像才得以如此美观。
把所有的准备材料都准备好了的时候,我们的代码也写得差不多了,所有的模块功能都已经基本上完成。
因为,这个程序的过程相对还是有些复杂的,所以,我们一个模块一个模块的代码往上增加,测试。
当我们想把整个初始的地图显示出来的时候,就遇到了问题,刚开始的时候,是只能显示一个模块。
找了很长时间的原因,才发现自己对偏移地址的理解是错误的,修正了这个问题后。
接下来显示出来的仍然不是我们想要的初始的地图。
又经过在代码中人为加上一些代码来进行测试,发现了,原来是指向没有统一。
修正了这个错误后,我们的地图就显示出来了。
接着在不断得加功能块的时候,出现了很多的跟预期差别很大的问题,比如说控制位不能定位到人身上,接收键盘值的时候,图像就会变化很大,还有后来的算法上的问题,人可以穿墙,人可以从箱子上走过去等一系列问题。
在我们组员的不断努力下,我们把一个个的问题解决掉了。
当我们把这个程序很完整得做出来的时候,我们从内心底中油然而生的是一种成就感。
从这个设计,编码,调试的过程中,我体会最深的就是,一个问题,分析起来的时候,可能不是太难。
但是,当你把很多的情况抽象统一的时候,就会出现很多你预料不到的问题,这个时候,你就需要别人来协助你,也就是说,我们要有很强的团队合作意识。
同时,在遇到了自己以前没有遇到过的问题的时候,要有信心去克服它,如果有问题自己很以难以解决,就要学会借助外界的资源来帮助自己。
比喻说,网络,参考书,老师。
总之,从这次分组课程设计中我学到了很多有用的东西,在编码和调试的实践过程中提升了自己各个方面的能力。
参考文献:
《C程序设计(第三版)》,谭浩强编,清华大学出版社
《TurboC2.0实用大全》,常玉龙等编写,北京航空航天大学出版社
《C语言趣味程序百例精解》,陈朔鹰陈英主编,北京理工大学出版社
《C游戏编程从入门到精通》,浦滨著,北京希望电子出版社
《C函数实用手册》,郭立山吴天著,冶金工程出版社
致谢
历时将近一周的时间终于将这篇论文写完,在论文的写作过程中遇到了无数的困难和障碍,都在同学和老师的帮助下度过了。
尤其要强烈感谢我的论文指导老师—刘老师,她对我进行了无私的指导和帮助,不厌其烦的帮助进行论文的修改和改进。
另外,在校图书馆查找资料的时候,图书馆的老师也给我提供了很多方面的支持与帮助。
在此向帮助和指导过我的各位老师表示最中心的感谢!
感谢这篇论文所涉及到的各位学者。
本文引用了数位学者的研究文献,如果没有各位学者的研究成果的帮助和启发,我将很难完成本篇论文的写作。
感谢我的同学和朋友,在我写论文的过程中给予我了很多你问素材,还在论文的撰写和排版灯过程中提供热情的帮助。
由于我的学术水平有限,所写论文难免有不足之处,恳请各位老师和学友批评和指正!
;
附录
源代码
***************************************************
.386
.modelflat,stdcall
optioncasemap:
none
;***************************************************
includewindows.inc
includeuser32.inc
includekernel32.inc
includegdi32.inc
includeComctl32.inc
includelibuser32.lib
includelibkernel32.lib
includelibgdi32.lib
includelibComctl32.lib
includeStoreHouse.inc;导入关卡地图数据
;***************************************************
;宏定义数据
;------------------------------------------------------------------------
ICO_MAINequ1000h;窗口图标ID
ICO_MSGequ1001h
IDM_CURequ1000h;窗口光标ID
IDM_MAINequ1000h;菜单ID
IDM_REFLUSHequ1001h
IDM_PREVequ1002h
IDM_NEXTequ1003h
IDM_ABOUTequ1004h
IDM_EXITequ1005h
ID_TOOLBARequ1;工具栏ID
IDM_TOOLBARequ2000h;工具栏图标位图ID
ID_STATUSBARequ2;状态栏ID
DLG_MAINequ3;消息对话框ID
BM_MAINequ3000h;背景位图资源ID
ID_GAMETIMERequ100;关卡计时器
ID_SHOWBOMBequ101;刷新炸弹计时器
xBmBackequ0d
xBmWallequ30d
xBmRoadequ60d
xBmBox1equ90d
xBmBox2equ120d
xBmObjectequ150d
xBmManequ180d
xBmBombequ210d
VK_Bequ42h;字母"B"的扫描码
BackStepequ20d;后退的次数
;***************************************************
;数据段
;------------------------------------------------------------------------
.const
szClassNamedb'Game',0
szCaptiondb'推箱子',0
dwStatusWidthdd80,160,255,-1
NUM_BUTTONSequ6;工具栏图标位图中包含的小图标个数
stToolbarequthisbyte
TBBUTTON<0,IDM_REFLUSH,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0,-1>
TBBUTTON<1,IDM_PREV,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0,-1>
TBBUTTON<2,IDM_NEXT,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0,-1>
TBBUTTON<3,IDM_ABOUT,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0,-1>
TBBUTTON<0,0,TBSTATE_ENABLED,TBSTYLE_SEP,0,0,-1>
TBBUTTON<4,IDM_EXIT,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0,-1>
;------------------------------------------------------------------------
.data
szOutOfRangedb'已超出游戏关卡范围!
',0
szSuccessMsgdb'您成功通过了关卡!
是否继续?
',0
szGameOverdb'已到达最后一关',0
FmtGatedb'—第%d关',0
szBombdb'炸弹数量:
1',0
szNoBombdb'炸弹数量:
0',0
szStepdb'移动次数:
%d',0
szGameTimedb'%02d:
%02d:
%02d',0
;------------------------------------------------------------------------
.data?
hInstancedd?
;实例句柄
hWinMaindd?
;主窗口句柄
hMenudd?
;菜单句柄
hWinToolbardd?
;工具栏句柄
hWinStatusdd?
;状态栏句柄
hBackDCdd?
;背景位图设备环境句柄
hBitmapdd?
;背景位图句柄
LocalTimedd?
;当前系统时间的秒数
TimeCircledd?
;时间循环周期的秒数:
24*3600*n
TimeFlagdd?
;计时标志位,1表示进行及时;0表示停止计时
GameHourdd?
GameMinutedd?
GameSeconddd?
Mapdb14d*12ddup(?
);存放当前关卡的地图数据
ObjectLeftdd?
;剩余的目标地点数量
ManXPosdd?
;角色的列坐标
ManYPosdd?
;角色的行坐标
BombXPosdd?
;炸弹的列坐标
BombYPosdd?
;炸弹的行坐标
CurrentGatedd?
;当前的关卡号
BombCountdd?
;炸弹的剩余数量,初始化时为1
BombFlagdd?
;炸弹的存在标志,1表示存在,0表示隐藏
StepNumberdd?
;玩家移动次数
dwCountdd?
;随机数
BackBufferdd8*BackStepdup(?
);回退坐标缓冲区
BackLengthdd?
;当前可回退的次数
;***************************************************
;***************************************************
;代码段
;------------------------------------------------------------------------
.code
;***************************************************
_Quitproc
invokeDestroyWindow,hWinMain
invokePostQuitMessage,NULL
ret
_Quitendp
;****************
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 箱子 游戏 设计