当前位置:文档之家› 推箱子设计报告书

推箱子设计报告书

推箱子游戏设计使用说明书一、项目背景本实训要求对“推箱子游戏”进行分析、设计及编程实现。

本实训对实训项目已经作了较为详细的分析及相关知识讲解,通过实训,促使专业技能得到综合训练,让我们了解软件开发基本技术和工作过程。

同时,本实训中了解图形界面设计基本技术。

通过本系统的开发,要了解软件开发的整个过程,掌握软件开发的基本方法,提前培养从事软件行业应具备的基本素质和能力,为以后的学习作一个铺垫。

二、需求分析:经典的推箱子是一个来自日本的古老游戏,目的是在训练人的逻辑思考能力。

在一个狭小的仓库中,要求把木箱从开始位置推放到指定的位置。

在仓库有障碍物,稍不小心就会出现箱子无法移动或者通道被堵住的情况,而且箱子只能推,不能拉,所以需要巧妙的利用有限的空间和通道,合理安排移动的次序和位置,才能顺利的完成任务。

本游戏一共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.最终效果三、主要解决的问题在整个的游戏实现过程中,主要有七个模块,开始,移动,重新开始,选择关卡,上一关,下一关,退出七个过程.在具体实现的时候主要问题有,按键的处理问题,在各种情况下,下一步分别是什么图片;还有在撤销的时候,需要对上一步进行判断,在进行恢复退步。

选关的时候需要定义临时变量来传递玩家所选择的关数。

五、主要开发环境与工具、技术路线和解决方案课程设计的实验环境软件:Microsoft Visual Studio 2005课程设计的预备知识熟悉Visual Basic .net程序设计的基本语法知识及常用技巧。

六、系统分析与设计流程图七、系统编码Option ExplicitEnd SubOption Explicit' API函数声明Private Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, ByVal X As Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long' 全局常量Private Const MAXX As Integer = 20 ' 鼠标小人X轴定位Private Const MAXY As Integer = 15 ' 鼠标小人Y轴定位Private Const SIZE As Integer = 302 ' 制定小人大小Private Const D_LEFT As Integer = 1 '控制小人向左运动Private Const D_RIGHT As Integer = 0 '控制小人向右运动Private Const D_UP As Integer = 2 '控制小人向上运动Private Const D_DOWN As Integer = 3 '控制小人向下运动Private Const B_GROUND As Integer = &H0 '定义空白Private Const B_DEST As Integer = &H1 '定义小人Private Const B_BOX As Integer = &H2 '定义盒子Private Const B_WALL As Integer = &H4 '定义墙Private Const B_BACK As Integer = &H8 '定义背景' 全局变量'private 指只在只在推箱子的窗口可用Private Map(MAXX, MAXY) As Integer '定义地图的大小Private ScenesCount As Integer, CurrScene As Integer '定义场景和当前场景Private BoxCount As Integer, Completed As IntegerPrivate X As Integer, Y As Integer, Dir As Integer '定义当前的位置Private FileNum As IntegerPrivate MapLoading As Boolean '定义地图下载为逻辑变量Private Playing As Boolean '定义为逻辑变量' 游戏开始Private Sub Form_Load()Playing = False '游戏开始MapLoading = False '地图下载InitGame '定义一个过程名End Sub' 游戏初始化Private Sub InitGame() '定义一个过程名FileNum = FreeFile'一个整型函数,把文件赋给一个变量,下一个OPEN可以供文件使用的文件序号Open "Map.dat" For Binary Access Read As FileNum '文件以二进制形式记录打开 ScenesCount = LOF(FileNum) / SIZE '文件尾函数/每关地图长度If ScenesCount = 0 Then '如果输出的场景为错,则输出没有可用的地图文件或文件格式出错,""请把可用的 Map.dat 文件和游戏放在同一目录。

"文件读取错误"MsgBox "没有可用的地图文件或文件格式出错," & vbCrLf & _"请把可用的 Map.dat 文件和游戏放在同一目录。

", _vbOKOnly Or vbExclamation, "文件读取错误"EndEnd IfLoadMap 1 '地图下载成功Playing = True '玩游戏End Sub' 读取关卡数据Private Function LoadMap(Scene As Integer) As BooleanIf MapLoading Then Exit Function '系统推出功能If Scene < 1 Or Scene > ScenesCount Then '如果场景是1或当前场景 LoadMap = False '加载失败Exit Function '则退出功能End IfMapLoading = True '地图下载正确CurrScene = Scene '运行当前场景Caption = "推箱子第" & CurrScene & "关" '显示推箱子在第几关BoxCount = 0: Completed = 0Dir = 0 '定义方向键Dim Data As ByteGet FileNum, (CurrScene - 1) * SIZE + 1, Data '选择场景加一X = Data 'x方向的数据Get FileNum, , DataY = Data 'Y方向的数据Dim i As Long, j As LongFor i = 0 To MAXY - 1For j = 0 To MAXX - 1Get FileNum, , DataMap(j, i) = Data '定义地图的大小If Map(j, i) And B_DEST Then BoxCount = BoxCount + 1NextNextDrawMapLoadMap = TrueMapLoading = FalseEnd Function' 选择关卡Private Sub SelectMap() '选择关卡Dim Temp As IntegerTemp = Val(InputBox("请输入关数(1~" & Trim(ScenesCount) & ")", "选择一关", 1))If Temp >= 1 And Temp <= ScenesCount Then CurrScene = Temp '如果temp>=1并且<=当前场景那么就选择此为当前场景LoadMap TempEnd Sub' 显示整个游戏画面Private Sub DrawMap()Dim i As Long, j As LongFor i = 0 To MAXY - 1For j = 0 To MAXX - 1DrawBox j, i, Map(j, i) '显示游戏画面的大小NextNextDrawMan X, YpicMain.RefreshEnd Sub' 显示背景块(包括地面、墙、箱子等)Private Sub DrawBox(ByVal X As Integer, ByVal Y As Integer, ByVal BoxType As Integer)Dim Offset As IntegerSelect Case BoxTypeCase B_BACKOffset = 0 '背景Case B_GROUND '空白处的背景Offset = 1Case B_DEST '显示目标图片Offset = 2Case B_BOX '显示盒子Offset = 3Case B_WALL '显示墙Offset = 4End SelectBitBlt picMain.hDC, X * 32, Y * 32, 32, 32, picBoxs.hDC, Offset * 32, 0, vbSrcCopyEnd Sub' 显示小人Private Sub DrawMan(ByVal X As Integer, ByVal Y As Integer) '使用API 函数,定义小人控件的位置,大小BitBlt picMain.hDC, X * 32, Y * 32, 32, 32, picMan.hDC, Dir * 32, 32, vbSrcAnd BitBlt picMain.hDC, X * 32, Y * 32, 32, 32, picMan.hDC, Dir * 32, 0, vbSrcPaint End Sub' 游戏操作(按键处理)Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)If Not Playing Then Exit SubSelect Case KeyCodeCase 37 '小人的位置向上移动ManMove -1, 0Case 38ManMove 0, -1 '小人的位置向下移动Case 39ManMove 1, 0 '小人的位置向左移动Case 40ManMove 0, 1 '小人的位置向右移动Case 32LoadMap CurrScene '场景的切换Case 33LoadMap CurrScene - 1 '关卡减一关Case 34LoadMap CurrScene + 1 '关卡加一关Case 13SelectMap '选择地图Case 27Unload Me '下载推出End SelectEnd Sub' 游戏结束Private Sub Form_Unload(Cancel As Integer)Close '关闭窗口退出EndEnd Sub' 小人移动Private Sub ManMove(OffsetX As Integer, OffsetY As Integer)Dim DestX As Integer, DestY As IntegerIf OffsetY = -1 Then '小人向上移动Dir = D_UPElseIf OffsetY = 1 ThenDir = D_DOWN '小人向下移动ElseIf OffsetX = -1 ThenDir = D_LEFT '向左移动ElseDir = D_RIGHT '向右移动End IfDestX = X + OffsetX: DestY = Y + OffsetYIf DestX < 0 Or DestX >= MAXX Or DestY < 0 Or DestY >= MAXY Then Exit Sub If Map(DestX, DestY) And B_WALL Or Map(DestX, DestY) And B_BACK Then Exit SubIf Map(DestX, DestY) And B_BOX Then ‘定义地图的目标地址值Push DestX, DestY, OffsetX, OffsetY '推动箱子ElseDrawMan DestX, DestY '小人的位置DrawBox X, Y, Map(X, Y)X = DestX: Y = DestYpicMain.RefreshEnd IfEnd Sub' 推动箱子Private Sub Push(SourceX As Integer, SourceY As Integer, OffsetX As Integer, OffsetY As Integer)Dim DestX As Integer, DestY As Integer '定义场景的大小DestX = SourceX + OffsetX: DestY = SourceY + OffsetYIf DestX < 0 Or DestX >= MAXX Or DestY < 0 Or DestY >= MAXY Then Exit SubIf Map(DestX, DestY) And B_WALL Or Map(DestX, DestY) And B_BACK Or _Map(DestX, DestY) And B_BOX Then Exit SubMap(SourceX, SourceY) = Map(SourceX, SourceY) - B_BOX '地图大小为减去盒子的大小Map(DestX, DestY) = Map(DestX, DestY) + B_BOX '地图大小为加上盒子的大小DrawBox DestX, DestY, B_BOX '画出盒子的大小DrawBox SourceX, SourceY, Map(SourceX, SourceY)DrawMan SourceX, SourceY '定义小人位置DrawBox X, Y, Map(X, Y) '定义地图位置X = SourceX: Y = SourceYpicMain.Refresh '刷新If Map(SourceX, SourceY) And B_DEST Then Completed = Completed - 1If Map(DestX, DestY) And B_DEST Then Completed = Completed + 1If Completed = BoxCount Then WinEnd Sub' 过关处理Private Sub Win()If MsgBox("你太聪明了!要继续玩下一关吗?", vbYesNo, "过关!") = vbNo Then '过关了以后如果不继续则下载当前玩的场景Unload MeEnd IfIf Not LoadMap(CurrScene + 1) ThenIf MsgBox("你已经过了最后一关!还要继续吗?", vbYesNo, "真厉害!") = vbYes ThenLoadMap CurrScene '过关后如果选择继续则下载下一关的地图ElseUnload MeEnd IfEnd IfEnd SubPrivate Sub picMan_Click()End SubOption Explicit' API函数声明Private Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, ByVal X As Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long' 全局常量Private Const MaxX As Integer = 20 '定义场景X轴的宽度Private Const MaxY As Integer = 15 '定义场景y轴的宽度Private Const B_GROUND As Integer = &H0 '定义总背景常量并赋H0Private Const B_DEST As Integer = &H1 '定义小人常量并赋H1Private Const B_BOX As Integer = &H2 '定义盒子常量并赋H2Private Const B_WALL As Integer = &H4 '定义墙常量并赋H3Private Const B_BACK As Integer = &H8 '定义背景常量并赋H4' 全局变量Private Map(MaxX, MaxY) As IntegerPrivate X As Integer, Y As IntegerPrivate ScenesCount As Integer, CurrScene As IntegerPrivate FileNum As IntegerPrivate CurrBox As Integer ' 当前使用的地图块Private Changed As Boolean ' 地图是否改变,如果是,在切换和退出时提示保存' 初始化Private Sub Form_Load()lblHelp.Caption = _"方向键 - 移动" & vbCrLf & _" 空格 - 选图" & vbCrLf & _" Ctrl - 绘图" & vbCrLf & _" N - 新地图" & vbCrLf & _" PgUp - 上一关" & vbCrLf & _"PgDown - 下一关" & vbCrLf & _" S - 保存" & vbCrLf & _" Esc - 退出" & vbCrLf & _vbCrLf & _"其它说明:" & vbCrLf & _" 一、任何未保存的操作都会有提示;" & vbCrLf & _" 二、企鹅最后停留的位置为本关的起始位置。

相关主题