推箱子游戏
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
推箱子游戏
(说明:随机根据输入情况生成推箱子游戏有解地图,输入数据包括地图尺寸和箱子数量。)
1.课程设计的目的
通过课程设计,巩固Java基础知识,增进编程基本功,熟练eclipse 和 EditPlus 的使用方法,通过该系统的设计与开发,将所学知识真正的应用于实践当中,培养实际动手能力。并在设计实践过程中,学习到更深的知识,掌握先进的Java技术,从而来增强对一个系统设计的整体认识,熟悉软件开发过程,更深刻的理解软件工程的知识。
2.设计方案论证
2.1设计思路
经典的推箱子是一个来自日本的古老游戏,目的是在训练人的逻辑思考能力。在一个狭小的仓库中,要求把木箱从开始位置推放到指定的位置。在仓库有障碍物,稍不小心就会出现箱子无法移动或者通道被堵住的情况,而且箱子只能推,不能拉,所以需要巧妙的利用有限的空间和通道,合理安排移动的次序和位置,才能顺利的完成任务。本游戏一共10关,由易到难,每一关都有初化、按键处理、重置及退出功能。
(1)初始化包括屏幕初始化和每一关卡的初始化,屏幕被初始化宽80像素,高25像素。
(2)按键处理包括移动小人和移动箱子,通过移动上下左右键来控制小人的移动,从而推动箱子,以把箱子推到指定的目的地为过关。
(3)每一关都可以重置,按选项——重新开始可以重置当前关。
(4)可以进行选关操作,按选项——选关可以选择1-10关的任一关。
(3)可以返回至上一位置,按选项——返回可以退回到上一位置,相当于悔一步。
(4)按选项——退出键可以在任何时候退出游戏。
2.2详细设计
2.2.1系统模块图
本程序包括5个模块,分别是初始化模块、画图模块、移动箱子模块、移动小
模块和功能控制模块,如图1所示。各个模块的功能描述如下:
(1)初始化模块。
该模块包括屏幕初始化和游戏第一关的初始化。屏幕初始化用于输出欢迎信息和操作提示,游戏每一关的初始化是构建每一关的关卡。
(2)画图模块。
该模块主要是被其它模块调用,用于画墙、在空地画箱子、在目的地画箱子、画小人和画目的
地。
(3)移动箱子模块。
该模块用于移动箱子,包括目的地之间、空地之间和目的地与空地之间的箱子移动。
(4)移动小人模块。
该模块用于控制小人移动,从而推动箱子到目的地。
(5)功能控制模块。
该模块是几个功能函数的集合,包括屏幕输出功能、指定位置状态判断功能和关卡重置功能。
图1 系统模块图
2.2.2任务执行流程图
游戏从第一关开始,按上下左右方向键控制小人移动来推动箱子,可以在游戏中的任何时候按退出键退出。如果游戏无成功希望,可以按空格键回到当前任务的开始状态;如果成功完成当前关,则进入下一关,如果当前关是最后一关,则显示通关信息,提示游戏结束。
游戏同时还具有时间和步数的记录,在开始游戏之前首先把图片添加到pic目录下,程序会自动获取该目录下的所有文件,
图2 任务流程图
2.2.3 类及实现的功能
本程序包括三个类文件:主类Main.java,类Gui.java,类Readmap.java。其中类Main.java 包含main()方法。Main extends JFrame. Gui 继承JFrame 并且实现ActionListener这个接口。AbstractAction() Action 接口提供ActionListener 接口的一个有用扩展,以便若干控件访问相同的功能。Readmap.java主要是实现地图的初始化以及每一关地图的重载。keyPressed的功能是响应工人和箱子的移动以及工人、箱子、墙之间的碰撞检测。
表1 成员变量表
成员变量变量类型名称
开始状态Boolean Start
窗口高度int fHeight
窗口宽度int fWidth
计时器Timer timer
延时int delay
开始时间Date starttime 步数int steps
地图容器MapPanel mapPanel 玩法介绍String instruction 开始状态Boolean Start
表2方法表
Puzzle() 创建游戏窗口和设置图标
backaction() 后台操作getmap() 返回地图的方法
StartGame() 开始游戏控制,更新开始菜单
endgame() 结束游戏控制弹出结束窗口
getmap()/ 返回地图的方法调用类spite()
menuShowClik() 在游戏中显示完整图片调用类class ShowImage
actionPerformed() 动作演示
menuExit() 退出游戏
flush() 清空缓存
A、地图设计
游戏中用一个 MapFactory 类操作地图,其中用三维矩阵记录游戏地图信息。三维矩阵便于管理,如果要加入新关卡,只需要在三维矩阵中加入二维矩阵就可以了,同时,可以加入不同大小的地图。
a、地图矩阵信息
// 地图坐标状态描述
1、private final int Black = -2; // 外界
2、private final int Wall = -1; // 墙
3、private final int Ground = 0; // 地面
4、private final int Boxes = 1; // 箱子
5、private final int Boxes_position = 2; // 箱子位置
6、private final int Boxes_in_place = 3; // 箱子移动到合适位置
7、矩阵中标有数字 4 的位置表示该位置是游戏主角的初始位置
B、游戏过程设计
游戏中过程中,最为主要地方在于对地图矩阵,以及主角状态信息(包括位置、行走状态等)的维护,主角每行走一步,就更新一次地图信息和主角状态信息。另外一个比较重要的地方是游戏状态的保存方面。在该游戏中,使用栈结构保存主角每次行走的状态信息(包括游戏矩阵和主角位置等)。为保存主角信息,特别开设了一个undoState类,该类主要作用就是保存玩家每一步的游戏状态,便于撤销。
在游戏画面处理和逻辑判断方面,都放在了 GameSurfaceView 类里面。因为考虑到该游戏的逻辑判断和画面绘制较为简单,不需要长时间的运算,所以就把很多功能都放在了主线程里。因为采取的是单线程,所以,重画操作都是事件驱动的。
1、地图载入、绘制
根据玩家选择的关卡,载入地图矩阵。在载入地图的过程中,根据屏幕大小,对图片进行了缩放(使用矩阵缩放)。这些功能主要在 setMapAndactorPosition(); initPicture();函数中实现
2、地图切换
玩家每过一关,就载入一张新地图,地图信息都保存在 private int[][] map 对象里面,然后重新绘制地图。该功能主要在 nextPass() 函数实现。
3、重玩
如果玩家选择重玩,只要重新把目前关卡的地图载入就可以了,同时删除原有的信息。该功能在replacePass()函数实现。
4、后退\撤销
如果玩家选择该功能,主要从栈对象中 private Stack
5、游戏是否结束
玩家每移动一步,就判断是否所有箱子都移动到了相应位置(实现该判断的方法有很多,考虑到游戏的可扩展性,在该游戏中主要通过 isGameover() 遍历地图矩阵来进行判断的,如果游戏结束则提示玩家过关,在 gameState() 函数中实现。
3.设计结果与分析