推箱子游戏设计报告书一、项目背景本实训要求对“推箱子游戏”进行分析、设计。
本实训对实训项目已经作了较为详细的分析及相关知识讲解,通过实训,促使专业技能得到综合训练,让我们了解软件开发基本技术和工作过程。
同时,本实训中了解图形界面设计基本技术。
通过本系统的开发,要了解软件开发的整个过程,掌握软件开发的基本方法,提前培养从事软件行业应具备的基本素质和能力,为以后的学习作一个铺垫。
二、设计目的本课程的课程设计实际是重在提升学生对程序的理解力和游戏界面的设计能力,进行的一次全面的综合训练,其目的在于加深动手能力以及对游戏设计思想的理解,掌握运用VB 开发应用程序的基本方法及基本技巧。
三、游戏介绍本游戏设计了关卡设计器对有难度进行设计,同时用方向键↑↓←→控制小人的移动,空格重新开始,回车选择下一关,page up 上一关,page down 下一关,Esc 退回。
小人移动来推箱子使箱子到达指定位置,如果箱子全部到达指定位置就表示过关3.1界面设计3.1.1界面设计原则:1用户帮助2向导3快捷键4鼠标与键盘对应5布局合理化6显示信息一致性7界面一致性8美观与协调性9合理性10规范性11易用性12一般交互13数据输入本游戏是一个简单游戏所以只涉及一些简单的界面设计原则.3.2用户界面又称人机界面,实现用户与计算机之间的通信,以控制计算机或进行用户与计算机之间的数据传送的系统部件。
GUI:即图形用户界面,一种可视化的用户界面,它使用图形界面代替正文界面。
本系统坚持图形用户界面(GUI)设计原则,界面直观、对用户透明。
用户接触软件后对界面上对应的功能一目了然、不需要多少培训就可以方便地使用本应用系统。
下面解释说明即为本游戏的简单标签设计3.3系统编码3.3.0编程设计原则:1、排版2、注释3、标识符命名4、可读性5、变量与结构6、函数与过程7、可测性8、程序效率9、质量保证10、代码编辑、编译与审查11、代码测试与维护由于本游戏是小游戏所以只需注重1、排版2、注释3、标识符命名4、可读性5、变量与结构6、函数与过程等方面就可以其余原则可忽略.3.3.1 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 Long3.3.2 全局常量Private Const MAXX As Integer = 20Private Const MAXY As Integer = 15Private Const SIZE As Integer = 302Private Const D_LEFT As Integer = 1Private Const D_RIGHT As Integer = 0Private Const D_UP As Integer = 2Private Const D_DOWN As Integer = 3Private Const B_GROUND As Integer = &H0Private Const B_DEST As Integer = &H1Private Const B_BOX As Integer = &H2Private Const B_WALL As Integer = &H4Private Const B_BACK As Integer = &H83.3.3全局变量Private Map(MAXX, MAXY) As IntegerPrivate ScenesCount As Integer, CurrScene As IntegerPrivate BoxCount As Integer, Completed As IntegerPrivate X As Integer, Y As Integer, Dir As IntegerPrivate FileNum As IntegerPrivate MapLoading As BooleanPrivate Playing As Boolean3.3.4 游戏开始//定义子函数,载入游戏.Private Sub Form_Load()Playing = FalseMapLoading = FalseInitGameEnd Sub3.3.5游戏初始化//FileNum代表工作区号,用FreeFile函数返回,载入游戏. 返回工作区文件尾号除以size Private Sub InitGame()FileNum = FreeFileOpen "Map.dat" For Binary Access Read As FileNumScenesCount = LOF(FileNum) / SIZEIf ScenesCount = 0 ThenMsgBox "没有可用的地图文件或文件格式出错," & vbCrLf & _ "请把可用的 Map.dat 文件和游戏放在同一目录。
", _vbOKOnly Or vbExclamation, "文件读取错误"EndEnd IfLoadMap 1Playing = TrueEnd Sub3.3.6读取关卡数据//调用函数定义坐标,对空间位置操作读出Data数据Private Function LoadMap(Scene As Integer) As BooleanIf MapLoading Then Exit FunctionIf Scene < 1 Or Scene > ScenesCount ThenLoadMap = FalseExit FunctionEnd IfMapLoading = TrueCurrScene = SceneCaption = "推箱子第" & CurrScene & "关"BoxCount = 0: Completed = 0Dir = 0Dim Data As ByteGet FileNum, (CurrScene - 1) * SIZE + 1, DataX = DataGet FileNum, , DataY = DataDim i As Long, j As LongFor i = 0 To MAXY - 1For j = 0 To MAXX - 1Get FileNum, , DataMap(j, i) = DataIf Map(j, i) And B_DEST Then BoxCount = BoxCount + 1NextNextDrawMapLoadMap = TrueMapLoading = FalseEnd Function3.3.7选择关卡//LoadMap调用子过程函数Private Sub SelectMap()Dim Temp As IntegerTemp = Val(InputBox("请输入关数(1~" & Trim(ScenesCount) & ")", "选择一关", 1))If Temp >= 1 And Temp <= ScenesCount Then CurrScene = TempLoadMap TempEnd Sub3.3.8显示整个游戏画面//画出游戏界面利用坐标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 Sub3.3.9显示背景块(包括地面、墙、箱子等)//多分支语句显示背景Private Sub DrawBox(ByVal X As Integer, ByVal Y As Integer, ByVal BoxType As Integer) Dim Offset As IntegerSelect Case BoxTypeCase B_BACKOffset = 0Case B_GROUNDOffset = 1Case B_DESTOffset = 2Case B_BOXOffset = 3Case B_WALLOffset = 4End SelectBitBlt picMain.hDC, X * 32, Y * 32, 32, 32, picBoxs.hDC, Offset * 32, 0, vbSrcCopy End Sub3.3.10显示小人Private Sub DrawMan(ByVal X As Integer, ByVal Y As Integer)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 Sub3.3.11游戏操作(按键处理)Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)If Not Playing Then Exit SubSelect Case KeyCodeCase 37ManMove -1, 0Case 38ManMove 0, -1Case 39ManMove 1, 0Case 40ManMove 0, 1Case 32LoadMap CurrSceneCase 33LoadMap CurrScene - 1Case 34LoadMap CurrScene + 1Case 13SelectMapCase 27Unload MeEnd SelectEnd Sub3.3.12游戏结束Private Sub Form_Unload(Cancel As Integer)CloseEndEnd Sub3.3.13小人移动Private Sub ManMove(OffsetX As Integer, OffsetY As Integer)Dim DestX As Integer, DestY As IntegerIf OffsetY = -1 ThenDir = D_UPElseIf OffsetY = 1 ThenDir = D_DOWNElseIf OffsetX = -1 ThenDir = D_LEFTElseDir = D_RIGHTEnd 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 Sub If Map(DestX, DestY) And B_BOX ThenPush DestX, DestY, OffsetX, OffsetYElseDrawMan DestX, DestYDrawBox X, Y, Map(X, Y)X = DestX: Y = DestYpicMain.RefreshEnd IfEnd Sub3.3.14推动箱子Private Sub Push(SourceX As Integer, SourceY As Integer, OffsetX As Integer, OffsetY As Integer)Dim DestX As Integer, DestY As IntegerDestX = SourceX + OffsetX: DestY = SourceY + 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 Or _Map(DestX, DestY) And B_BOX Then Exit SubMap(SourceX, SourceY) = Map(SourceX, SourceY) - B_BOXMap(DestX, DestY) = Map(DestX, DestY) + B_BOXDrawBox DestX, DestY, B_BOXDrawBox SourceX, SourceY, Map(SourceX, SourceY)DrawMan SourceX, SourceYDrawBox X, Y, Map(X, Y)X = SourceX: Y = SourceYpicMain.RefreshIf Map(SourceX, SourceY) And B_DEST Then Completed = Completed - 1If Map(DestX, DestY) And B_DEST Then Completed = Completed + 1If Completed = BoxCount Then WinEnd Sub3.3.15过关处理Private Sub Win()If MsgBox("你太聪明了!要继续玩下一关吗?", vbYesNo, "过关!") = vbNo Then Unload MeEnd IfIf Not LoadMap(CurrScene + 1) ThenIf MsgBox("你已经过了最后一关!还要继续吗?", vbYesNo, "真厉害!") = vbYesThenLoadMap CurrSceneElseUnload MeEnd IfEnd IfEnd Sub四、实训总结经过这两星期的培训是我获益良多,我的实训内容是理解游戏——推箱子。