推箱子设计报告书.doc_第1页
推箱子设计报告书.doc_第2页
推箱子设计报告书.doc_第3页
推箱子设计报告书.doc_第4页
推箱子设计报告书.doc_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

推箱子游戏设计使用说明书一、项目背景本实训要求对“推箱子游戏”进行分析、设计及编程实现。本实训对实训项目已经作了较为详细的分析及相关知识讲解,通过实训,促使专业技能得到综合训练,让我们了解软件开发基本技术和工作过程。同时,本实训中了解图形界面设计基本技术。通过本系统的开发,要了解软件开发的整个过程,掌握软件开发的基本方法,提前培养从事软件行业应具备的基本素质和能力,为以后的学习作一个铺垫。二、需求分析:经典的推箱子是一个来自日本的古老游戏,目的是在训练人的逻辑思考能力。在一个狭小的仓库中,要求把木箱从开始位置推放到指定的位置。在仓库有障碍物,稍不小心就会出现箱子无法移动或者通道被堵住的情况,而且箱子只能推,不能拉,所以需要巧妙的利用有限的空间和通道,合理安排移动的次序和位置,才能顺利的完成任务。本游戏一共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 Integer Private 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, 文件读取错误 End End If LoadMap 1 地图下载成功 Playing = True 玩游戏End Sub 读取关卡数据Private Function LoadMap(Scene As Integer) As Boolean If MapLoading Then Exit Function 系统推出功能 If Scene ScenesCount Then 如果场景是1或当前场景 LoadMap = False 加载失败 Exit Function 则退出功能 End If MapLoading = True 地图下载正确 CurrScene = Scene 运行当前场景 Caption = 推箱子 第 & CurrScene & 关 显示推箱子在第几关 BoxCount = 0: Completed = 0 Dir = 0 定义方向键 Dim Data As Byte Get FileNum, (CurrScene - 1) * SIZE + 1, Data 选择场景加一 X = Data x方向的数据 Get FileNum, , Data Y = Data Y方向的数据 Dim i As Long, j As Long For i = 0 To MAXY - 1 For j = 0 To MAXX - 1 Get FileNum, , Data Map(j, i) = Data 定义地图的大小 If Map(j, i) And B_DEST Then BoxCount = BoxCount + 1 Next Next DrawMap LoadMap = True MapLoading = FalseEnd Function 选择关卡Private Sub SelectMap() 选择关卡 Dim Temp As Integer Temp = Val(InputBox(请输入关数(1 & Trim(ScenesCount) & ), 选择一关, 1) If Temp = 1 And Temp =1并且=当前场景 那么就选择此为当前场景 LoadMap TempEnd Sub 显示整个游戏画面Private Sub DrawMap() Dim i As Long, j As Long For i = 0 To MAXY - 1 For j = 0 To MAXX - 1 DrawBox j, i, Map(j, i) 显示游戏画面的大小 Next Next DrawMan X, Y picMain.RefreshEnd Sub 显示背景块(包括地面、墙、箱子等)Private Sub DrawBox(ByVal X As Integer, ByVal Y As Integer, ByVal BoxType As Integer) Dim Offset As Integer Select Case BoxType Case B_BACK Offset = 0 背景 Case B_GROUND 空白处的背景 Offset = 1 Case B_DEST 显示目标图片 Offset = 2 Case B_BOX 显示盒子 Offset = 3 Case B_WALL 显示墙 Offset = 4 End Select BitBlt 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, vbSrcPaintEnd Sub 游戏操作(按键处理)Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer) If Not Playing Then Exit Sub Select Case KeyCode Case 37 小人的位置向上移动 ManMove -1, 0 Case 38 ManMove 0, -1 小人的位置向下移动 Case 39 ManMove 1, 0 小人的位置向左移动 Case 40 ManMove 0, 1 小人的位置向右移动 Case 32 LoadMap CurrScene 场景的切换 Case 33 LoadMap CurrScene - 1 关卡减一关 Case 34 LoadMap CurrScene + 1 关卡加一关 Case 13 SelectMap 选择地图 Case 27 Unload Me 下载推出 End Select End 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 Integer If OffsetY = -1 Then 小人向上移动 Dir = D_UP ElseIf OffsetY = 1 Then Dir = D_DOWN 小人向下移动 ElseIf OffsetX = -1 Then Dir = D_LEFT 向左移动 Else Dir = D_RIGHT 向右移动 End If DestX = X + OffsetX: DestY = Y + OffsetY If DestX = MAXX 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 Then 定义地图的目标地址值 Push DestX, DestY, OffsetX, OffsetY 推动箱子 Else DrawMan DestX, DestY 小人的位置 DrawBox X, Y, Map(X, Y) X = DestX: Y = DestY picMain.Refresh End 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 + OffsetY If DestX = MAXX 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 Sub Map(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 = SourceY picMain.Refresh 刷新 If Map(SourceX, SourceY) And B_DEST Then Completed = Completed - 1 If Map(DestX, DestY) And B_DEST Then Completed = Completed + 1 If Completed = BoxCount Then WinEnd Sub 过关处理Private Sub Win() If MsgBox(你太聪明了!要继续玩下一关吗?, vbYesNo, 过关!) = vbNo Then 过关了以后如果不继续则下载当前玩的场景 Unload Me End If If Not LoadMap(CurrScene + 1) Then If MsgBox(你已经过了最后一关!还要继续吗?, vbYesNo, 真厉害!) = vbYes Then LoadMap CurrScene 过关后如果选择继续则 下载下一关的地图 Else Unload Me End If End 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 & _ 二、企鹅最后停留的位置为本关的起始位置。 定义在页面上显示的按钮 FileNum = FreeFile 把一个文件赋给一个变量 下一个语句可供文件使用的文件序号 Open Map.dat For Binary As FileNum 打开一个地图数据作为该文件 ScenesCount = LOF(FileNum) / 302 NewMapEnd Sub 保存地图Private Sub SaveMap() If CurrScene ScenesCount Then ScenesCount = CurrScene Put FileNum, (CurrScene - 1) * 302 + 1, CByte(X) 定义当前地图的坐标 Put FileNum, , CByte(Y) 文件为空 Dim i As Long, j As Long For i = 0 To 14 For j = 0 To 19 Put FileNum, , CByte(Map(j, i) 保存当前地图 Next Next Changed = FalseEnd Sub 读取地图Private Sub LoadMap(Offset As Integer) If CurrScene + Offset ScenesCount Then NewMap 进入新的地图 Exit Sub End If If CurrScene + Offset 1 Then Exit Sub 退出地图 End If If Not AskSave Then Exit Sub CurrScene = CurrScene + Offset lblInfo.Caption = 第 & CurrScene & 关 显示进入第几关 Dim Data As Byte Get FileNum, (CurrScene - 1) * 302 + 1, Data X = Data Get FileNum, , Data 位置为空,自动读取下一个位置 Y = Data Dim i As Long, j As Long For i = 0 To 14 For j = 0 To 19 Get FileNum, , Data 获得空的文件 数据 Map(j, i) = Data Next Next DrawMap 绘制地图 Changed = FalseEnd Sub 新地图Private Sub NewMap() If Not AskSave Then Exit Sub 如果不保存,则退出 Dim i As Long, j As Long For i = 0 To 14 For j = 0 To 19 Map(j, i) = B_BACK 载入新的背景地图 Next Next CurrScene = ScenesCount + 1 lblInfo.Caption = 第 & CurrScene & 关 进入第几关 X = 0: Y = 0 Changed = False DrawMap 加载地图End Sub 按键处理Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer) Select Case KeyCode 选择键法 Case 37 改变坐标 X = (X + 20 - 1) Mod 20 Case 38 Y = (Y + 15 - 1) Mod 15 Case 39 X = (X + 1) Mod 20 Case 40 Y = (Y + 1) Mod 15 Case 32 空格:绘制地图块,并且当前使用地图块轮换 Select Case CurrBox 选择当前盒子 Case B_BACK Map(X, Y) = B_GROUND 背景选择背景 Case B_GROUND Map(X, Y) = B_DEST 选择空白的背景 Case B_DEST Map(X, Y) = B_BOX 定义小盒子的位置 Case B_BOX Map(X, Y) = B_WALL 定义墙的位置 Case B_WALL Map(X, Y) = B_BACK 定义背景的位置 End Select Changed = True CurrBox = Map(X, Y) BitBlt picBox.hDC, 0, 0, 32, 32, picBoxs.hDC, DrawBox(X, Y, CurrBox) * 32, 0, vbSrcCopy picMain.Refresh Case Asc(N) NewMap 新建地图 Case 33 LoadMap (-1) 下载上一个地图 Case 34 LoadMap (1) 下载下一个地图 Case Asc(S) SaveMap 保存地图 Case 27 Unload Me 下载地图 End Select imgBaby.Move X * 32, Y * 32 要注意的是,本程序中,小人不是用API绘制的,而是直接采用一个PictureBox控件, 小人移动只需改变控件的坐标即成。 If Shift = vbCtrlMask Then Ctrl键绘制 Map(X, Y) = CurrBox Changed = True DrawBox X, Y, CurrBox picMain.Refresh 该控件(小人)刷新 End IfEnd Sub 绘制地图块Private Function DrawBox(ByVal X As Integer, ByVal Y As Integer, ByVal BoxType As Integer) As Integer Dim Offset As Integer Select Case BoxType 绘制地图的背景,空白背景,盒子图片,墙 Case B_BACK Offset = 0 Case B_GROUND Offset = 1 Case B_DEST Offset = 2 Case B_BOX Offset = 3 Ca

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论