推箱子设计报告书.docx
- 文档编号:10530048
- 上传时间:2023-05-26
- 格式:DOCX
- 页数:27
- 大小:225.20KB
推箱子设计报告书.docx
《推箱子设计报告书.docx》由会员分享,可在线阅读,更多相关《推箱子设计报告书.docx(27页珍藏版)》请在冰点文库上搜索。
推箱子设计报告书
推箱子设计报告书
推箱子游戏设计使用说明书
一、项目背景
本实训要求对“推箱子游戏”进行分析、设计及编程实现。
本实训对实训项目已经作了较为详细的分析及相关知识讲解,通过实训,促使专业技能得到综合训练,让我们了解软件开发基本技术和工作过程。
同时,本实训中了解图形界面设计基本技术。
通过本系统的开发,要了解软件开发的整个过程,掌握软件开发的基本方法,提前培养从事软件行业应具备的基本素质和能力,为以后的学习作一个铺垫。
二、需求分析:
经典的推箱子是一个来自日本的古老游戏,目的是在训练人的逻辑思考能力。
在一个狭小的仓库中,要求把木箱从开始位置推放到指定的位置。
在仓库有障碍物,稍不小心就会出现箱子无法移动或者通道被堵住的情况,而且箱子只能推,不能拉,所以需要巧妙的利用有限的空间和通道,合理安排移动的次序和位置,才能顺利的完成任务。
本游戏一共4关,由易到难。
开始,移动,重新开始,选择关卡,上一关,下一关,退出七个过程。
(1)初始化包括屏幕初始化和每一关卡的初始化
(2)保存没一关的地图
(3)需要时读取所需要的地图
(4)下载入新的地图
(5)绘制地图快
(6)确认退出,保存提示
(7)按键处理包括移动小人和移动箱子,通过移动上下左右或ASDW键来控制小人的移动,从而推动箱子,以把箱子推到指定的目的地为过关。
(8)每一关都可以重置。
(9)记录走的步数,创建文件,记录每关的最好成绩。
(10)整个画面刷新
三、目的、意义和研究现状分析
1、目的、意义
本次课程设计的重要目的及任务就是将平时所学应用到具体设计中,能够熟练的应用学习中的各种方法。
重在提高自身的vb编程能力。
2、研究现状分析
1.系统结构的总体设计
决定系统的总体结构,包括整个系统分哪些部分,各部分之间有什么联系以及已确定的需求对这些组成部分如何分配等方面。
1)初始化模块
该模块包括屏幕初始化和游戏每一关的初始化。
屏幕初始化用于输出欢迎信息和操作提示,游戏每一关的初始化是构建每一关的关卡。
2)图画模块。
该模块主要是被其他模块调用,用于画墙、在空地画箱子、在目的地画箱子、画小人和画目的地。
3)移动箱子模块
该模块用于移动箱子,包括目的地之间、空地之间和目的地与空地之间的箱子移动。
4)移动小人模块
该模块用于控制小人移动,从而推动箱子到目的地。
5)功能控制模块
该模块是几个功能函数的集合,包括屏幕输出功能、指定位置状态判断功能和关卡重置功能。
2.详细设计
对各功能模块的功能定义,说明模块之间的调用关系与接口(参数)。
3.编码及调试
根据详细设计的要求,按照统一的要求和编码规范,用vb语言编码实现,同时负责每个模块的独立调试。
4.最终效果
三、主要解决的问题
在整个的游戏实现过程中,主要有七个模块,开始,移动,重新开始,选择关卡,上一关,下一关,退出七个过程.
在具体实现的时候主要问题有,按键的处理问题,在各种情况下,下一步分别是什么图片;还有在撤销的时候,需要对上一步进行判断,在进行恢复退步。
选关的时候需要定义临时变量来传递玩家所选择的关数。
五、主要开发环境与工具、技术路线和解决方案
课程设计的实验环境
软件:
MicrosoftVisualStudio2005
课程设计的预备知识
熟悉VisualBasic.net程序设计的基本语法知识及常用技巧。
六、系统分析与设计
流程图
推箱子
七、系统编码
OptionExplicit
EndSubOptionExplicit
'API函数声明
PrivateDeclareFunctionBitBltLib"gdi32"(ByValhDestDCAsLong,ByValXAsLong,ByValYAsLong,ByValnWidthAsLong,ByValnHeightAsLong,ByValhSrcDCAsLong,ByValxSrcAsLong,ByValySrcAsLong,ByValdwRopAsLong)AsLong
'全局常量
PrivateConstMAXXAsInteger=20'鼠标小人X轴定位
PrivateConstMAXYAsInteger=15'鼠标小人Y轴定位
PrivateConstSIZEAsInteger=302'制定小人大小
PrivateConstD_LEFTAsInteger=1'控制小人向左运动
PrivateConstD_RIGHTAsInteger=0'控制小人向右运动
PrivateConstD_UPAsInteger=2'控制小人向上运动
PrivateConstD_DOWNAsInteger=3'控制小人向下运动
PrivateConstB_GROUNDAsInteger=&H0'定义空白
PrivateConstB_DESTAsInteger=&H1'定义小人
PrivateConstB_BOXAsInteger=&H2'定义盒子
PrivateConstB_WALLAsInteger=&H4'定义墙
PrivateConstB_BACKAsInteger=&H8'定义背景
'全局变量
'private指只在只在推箱子的窗口可用
PrivateMap(MAXX,MAXY)AsInteger'定义地图的大小
PrivateScenesCountAsInteger,CurrSceneAsInteger'定义场景和当前场景
PrivateBoxCountAsInteger,CompletedAsInteger
PrivateXAsInteger,YAsInteger,DirAsInteger'定义当前的位置
PrivateFileNumAsInteger
PrivateMapLoadingAsBoolean'定义地图下载为逻辑变量
PrivatePlayingAsBoolean'定义为逻辑变量
'游戏开始
PrivateSubForm_Load()
Playing=False'游戏开始
MapLoading=False'地图下载
InitGame'定义一个过程名
EndSub
'游戏初始化
PrivateSubInitGame()'定义一个过程名
FileNum=FreeFile'一个整型函数,把文件赋给一个变量,下一个OPEN可以供文件使用的文件序号
Open"Map.dat"ForBinaryAccessReadAsFileNum'文件以二进制形式记录打开
ScenesCount=LOF(FileNum)/SIZE'文件尾函数/每关地图长度
IfScenesCount=0Then'如果输出的场景为错,则输出没有可用的地图文件或文件格式出错,""请把可用的Map.dat文件和游戏放在同一目录。
"文件读取错误"
MsgBox"没有可用的地图文件或文件格式出错,"&vbCrLf&_
"请把可用的Map.dat文件和游戏放在同一目录。
",_
vbOKOnlyOrvbExclamation,"文件读取错误"
End
EndIf
LoadMap1'地图下载成功
Playing=True'玩游戏
EndSub
'读取关卡数据
PrivateFunctionLoadMap(SceneAsInteger)AsBoolean
IfMapLoadingThenExitFunction'系统推出功能
IfScene<1OrScene>ScenesCountThen'如果场景是1或当前场景
LoadMap=False'加载失败
ExitFunction'则退出功能
EndIf
MapLoading=True'地图下载正确
CurrScene=Scene'运行当前场景
Caption="推箱子第"&CurrScene&"关"'显示推箱子在第几关
BoxCount=0:
Completed=0
Dir=0'定义方向键
DimDataAsByte
GetFileNum,(CurrScene-1)*SIZE+1,Data'选择场景加一
X=Data'x方向的数据
GetFileNum,,Data
Y=Data'Y方向的数据
DimiAsLong,jAsLong
Fori=0ToMAXY-1
Forj=0ToMAXX-1
GetFileNum,,Data
Map(j,i)=Data'定义地图的大小
IfMap(j,i)AndB_DESTThenBoxCount=BoxCount+1
Next
Next
DrawMap
LoadMap=True
MapLoading=False
EndFunction
'选择关卡
PrivateSubSelectMap()'选择关卡
DimTempAsInteger
Temp=Val(InputBox("请输入关数(1~"&Trim(ScenesCount)&")","选择一关",1))
IfTemp>=1AndTemp<=ScenesCountThenCurrScene=Temp'如果temp>=1并且<=当前场景那么就选择此为当前场景
LoadMapTemp
EndSub
'显示整个游戏画面
PrivateSubDrawMap()
DimiAsLong,jAsLong
Fori=0ToMAXY-1
Forj=0ToMAXX-1
DrawBoxj,i,Map(j,i)'显示游戏画面的大小
Next
Next
DrawManX,Y
picMain.Refresh
EndSub
'显示背景块(包括地面、墙、箱子等)
PrivateSubDrawBox(ByValXAsInteger,ByValYAsInteger,ByValBoxTypeAsInteger)
DimOffsetAsInteger
SelectCaseBoxType
CaseB_BACK
Offset=0'背景
CaseB_GROUND'空白处的背景
Offset=1
CaseB_DEST'显示目标图片
Offset=2
CaseB_BOX'显示盒子
Offset=3
CaseB_WALL'显示墙
Offset=4
EndSelect
BitBltpicMain.hDC,X*32,Y*32,32,32,picBoxs.hDC,Offset*32,0,vbSrcCopy
EndSub
'显示小人
PrivateSubDrawMan(ByValXAsInteger,ByValYAsInteger)'使用API函数,定义小人控件的位置,大小
BitBltpicMain.hDC,X*32,Y*32,32,32,picMan.hDC,Dir*32,32,vbSrcAnd
BitBltpicMain.hDC,X*32,Y*32,32,32,picMan.hDC,Dir*32,0,vbSrcPaint
EndSub
'游戏操作(按键处理)
PrivateSubForm_KeyDown(KeyCodeAsInteger,ShiftAsInteger)
IfNotPlayingThenExitSub
SelectCaseKeyCode
Case37'小人的位置向上移动
ManMove-1,0
Case38
ManMove0,-1'小人的位置向下移动
Case39
ManMove1,0'小人的位置向左移动
Case40
ManMove0,1'小人的位置向右移动
Case32
LoadMapCurrScene'场景的切换
Case33
LoadMapCurrScene-1'关卡减一关
Case34
LoadMapCurrScene+1'关卡加一关
Case13
SelectMap'选择地图
Case27
UnloadMe'下载推出
EndSelect
EndSub
'游戏结束
PrivateSubForm_Unload(CancelAsInteger)
Close'关闭窗口退出
End
EndSub
'小人移动
PrivateSubManMove(OffsetXAsInteger,OffsetYAsInteger)
DimDestXAsInteger,DestYAsInteger
IfOffsetY=-1Then'小人向上移动
Dir=D_UP
ElseIfOffsetY=1Then
Dir=D_DOWN'小人向下移动
ElseIfOffsetX=-1Then
Dir=D_LEFT'向左移动
Else
Dir=D_RIGHT'向右移动
EndIf
DestX=X+OffsetX:
DestY=Y+OffsetY
IfDestX<0OrDestX>=MAXXOrDestY<0OrDestY>=MAXYThenExitSub
IfMap(DestX,DestY)AndB_WALLOrMap(DestX,DestY)AndB_BACKThenExitSub
IfMap(DestX,DestY)AndB_BOXThen‘定义地图的目标地址值
PushDestX,DestY,OffsetX,OffsetY'推动箱子
Else
DrawManDestX,DestY'小人的位置
DrawBoxX,Y,Map(X,Y)
X=DestX:
Y=DestY
picMain.Refresh
EndIf
EndSub
'推动箱子
PrivateSubPush(SourceXAsInteger,SourceYAsInteger,OffsetXAsInteger,OffsetYAsInteger)
DimDestXAsInteger,DestYAsInteger'定义场景的大小
DestX=SourceX+OffsetX:
DestY=SourceY+OffsetY
IfDestX<0OrDestX>=MAXXOrDestY<0OrDestY>=MAXYThenExitSub
IfMap(DestX,DestY)AndB_WALLOrMap(DestX,DestY)AndB_BACKOr_
Map(DestX,DestY)AndB_BOXThenExitSub
Map(SourceX,SourceY)=Map(SourceX,SourceY)-B_BOX'地图大小为减去盒子的大小
Map(DestX,DestY)=Map(DestX,DestY)+B_BOX'地图大小为加上盒子的大小
DrawBoxDestX,DestY,B_BOX'画出盒子的大小
DrawBoxSourceX,SourceY,Map(SourceX,SourceY)
DrawManSourceX,SourceY'定义小人位置
DrawBoxX,Y,Map(X,Y)'定义地图位置
X=SourceX:
Y=SourceY
picMain.Refresh'刷新
IfMap(SourceX,SourceY)AndB_DESTThenCompleted=Completed-1
IfMap(DestX,DestY)AndB_DESTThenCompleted=Completed+1
IfCompleted=BoxCountThenWin
EndSub
'过关处理
PrivateSubWin()
IfMsgBox("你太聪明了!
要继续玩下一关吗?
",vbYesNo,"过关!
")=vbNoThen'过关了以后如果不继续则下载当前玩的场景
UnloadMe
EndIf
IfNotLoadMap(CurrScene+1)Then
IfMsgBox("你已经过了最后一关!
还要继续吗?
",vbYesNo,"真厉害!
")=vbYesThen
LoadMapCurrScene'过关后如果选择继续则下载下一关的地图
Else
UnloadMe
EndIf
EndIf
EndSub
PrivateSubpicMan_Click()
EndSub
OptionExplicit
'API函数声明
PrivateDeclareFunctionBitBltLib"gdi32"(ByValhDestDCAsLong,ByValXAsLong,ByValYAsLong,ByValnWidthAsLong,ByValnHeightAsLong,ByValhSrcDCAsLong,ByValxSrcAsLong,ByValySrcAsLong,ByValdwRopAsLong)AsLong
'全局常量
PrivateConstMaxXAsInteger=20'定义场景X轴的宽度
PrivateConstMaxYAsInteger=15'定义场景y轴的宽度
PrivateConstB_GROUNDAsInteger=&H0'定义总背景常量并赋H0
PrivateConstB_DESTAsInteger=&H1'定义小人常量并赋H1
PrivateConstB_BOXAsInteger=&H2'定义盒子常量并赋H2
PrivateConstB_WALLAsInteger=&H4'定义墙常量并赋H3
PrivateConstB_BACKAsInteger=&H8'定义背景常量并赋H4
'全局变量
PrivateMap(MaxX,MaxY)AsInteger
PrivateXAsInteger,YAsInteger
PrivateScenesCountAsInteger,CurrSceneAsInteger
PrivateFileNumAsInteger
PrivateCurrBoxAsInteger'当前使用的地图块
PrivateChangedAsBoolean'地图是否改变,如果是,在切换和退出时提示保存
'初始化
PrivateSubForm_Load()
lblHelp.Caption=_
"方向键-移动"&vbCrLf&_
"空格-选图"&vbCrLf&_
"Ctrl-绘图"&vbCrLf&_
"N-新地图"&vbCrLf&_
"PgUp-上一关"&vbCrLf&_
"PgDown-下一关"&vbCrLf&_
"S-保存"&vbCrLf&_
"Esc-退出"&vbCrLf&_
vbCrLf&_
"其它说明:
"&vbCrLf&_
"一、任何未保存的操作都会有提示;"&vbCrLf&_
"二、企鹅最后停留的位置为本关的起始位置。
"'定义在页面上显示的按钮
FileNum=FreeFile'把一个文件赋给一个变量下一个语句可供文件使用的文件序号
Open"Map.dat"ForBinaryAsFileNum'打开一个地图数据作为该文件
ScenesCount=LOF(FileNum)/302
NewMap
EndSub
'保存地图
PrivateSubSaveMap()
IfCurrScene>ScenesCountThenScenesCount=CurrScene
PutFileNum,(CurrScene-1)*302+1,CByte(X)'定义当前地图的坐标
PutFileNum,,CByte(Y)'文件为空
DimiAsLong,jAsLong
Fori=0To14
Forj=0To19
PutFileNum,,CByte(Map(j,i))'保存当前地图
Next
Next
Changed=False
EndSub
'读取地图
PrivateSubLoadMap(OffsetAsInteger)
IfCurrScene+Offset>ScenesCountThen
NewMap'进入新的地图
ExitSub
EndIf
IfCurrScene+Offset<1Then
ExitSub'退出地图
EndIf
IfNotAskSaveThenExitSub
CurrScene=CurrScene+Offset
lblInfo.Caption="第
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 箱子 设计 报告书