目 录
3.4.3 游戏模式......................................................................................................9
3.4.4 游戏结束....................................................................................................12
- 掌握Java编程语言的基本语法和面向对象的编程思想;掌握使用Java图形用户界面(GUI)组件开发游戏界面的技巧;掌握基本的游戏逻辑设计和算法思维。
- 学习如何在Java中创建一个扫雷游戏的项目结构;学习如何设计和实现游戏界面,包括游戏棋盘、雷区以及计时器等组件;学习如何处理用户交互,包括鼠标点击和键盘操作;学习如何生成随机的雷区布局,并计算周围雷的数量;学习如何实现游戏的核心逻辑,包括点击方块的处理、游戏输赢判断等。
- 提高编程能力和逻辑思维能力,通过实现扫雷游戏加深对Java编程语言的理解;提高图形用户界面(GUI)开发能力,掌握使用Swing或JavaFX等库创建游戏界面的技巧;
提高问题解决能力,通过解决游戏设计和实现中的难题,培养分析和解决问题的能力。
- 培养团队合作能力,通过与同学合作完成课程设计,学会在团队中分工合作、协调沟通;培养项目管理和计划能力,学习如何规划项目进度、设置里程碑、分配任务等;培养自学能力,通过查阅相关文档和资源,独立学习和解决问题。
扫雷游戏:要求在10x10矩阵中随机布雷,并计算出每个位置周围的地雷数,并保存在二维数组中,若该位置是地雷,则保存-1,然后要求用户从命令行输入坐标来排雷,排雷使用以下两种命令:
- b 3 6:将坐标3,6标志为地雷;
- p 2 5:排除2,5坐标位置是地雷。
游戏界面可以分为三个模块:菜单栏,游戏数据显示区域以及雷区。菜单栏包括游戏难度的选择和排行榜的查询以及游戏帮助。游戏数据显示区域包括地雷计数区、计时区和重新开始按钮。雷区就是玩家的游戏区域,当玩家在游戏过程中用鼠标点击某一模块,系统会自动作出相应的响应,这就是游戏中的鼠标事件。
当玩家点开第一个格子时雷区开始布雷同时计时开始。然后会在该格子上显示周围8个格子的雷数(如果没有雷则自动点开周围的格子),玩家就需要通过这些数字来判断雷的位置,将是雷的格子标记为小红旗。
若玩家认为已标记的格子时错误的,可以再次右击该格子来取消标记。当某一格子被标记时,对于该格子的单击操作是无效的(防止玩家误点击导致游戏失败)。
如果玩家将某一格周围8个格子中的雷标记了出来,双击该格子会自动将周围的格子点击一遍,这样可以简化玩家的操作。
当玩家将全部的地雷标记出来并且其他的格子点开时,游戏结束。但是如果玩家不小心点到了地雷就会游戏失败,系统自动显示出所有的地雷。如果玩家标识的地雷数量超过了该难度下规定的雷数,计数区会以负数显示超出的雷数并且游戏不会结束。
图3-2 整体规划图
1.设计构想
本次的扫雷游戏设计,需要编写7个Java类:MineaGamae.java类、MineAra.java类、Block.jaav类、BlockVaiw.java类、LayMinas.java类、Record.java类和ShowRecrd.java类。
(1)MineGame.java
MineGame类是游戏的入口,用来初始化游戏资源,比如界面尺寸和雷数等。同时也负责难度的转换。
(2)MineArea.java
MineArea类是布置雷区的雷,除了初始化雷区以外还可以响应玩家的鼠标操作。
(3)Block.java
Block类是一个POJO类,主要记录了雷区一个个格子的属性,比如名字,周围雷的数目等等。
(4)BlockView.java
BlockView类用来显示块的属性,并且使用卡片布局来使格子分为了上下两层,当玩家点击格子后,会使下面的属性浮现出来。
(5)LayMines.java
LayMines类是计算不是雷的格周围雷个数的类,以及设置点选之后的图片样式。创建的对象lay是MineArea中最重要的成员。
(6)Record.java
Record类是通过IO流将游戏记录储存在本地的文件中,主要实现通关后弹窗提示通关的窗口,以及记录成绩。
(7)ShowRecord.java
ShowRecord类是显示扫雷记录的类。
图3-2-1 规划样图
说明如下:
①:游戏主界面(Interface)
②:菜单(Menu)
③:地雷数显示区(MineNumberArea)
④:重新开始(Restart)
⑤:扫雷用时显示区(TimeArea)
⑥:地雷区(MineArea)
3.算法思想
(1)随机布雷
扫雷游戏要求在雷区随机布雷,雷数不能太多,这样就没法很好的判断周围是否有雷了;但也不能太少,这样会出现点一下就会点开一大片的空白区域。使用java自带的Math.random()方法产生随机数,经过计算后得到将随机数转换成一个整数,这个整数就是雷的位置的角标。游戏的目标是在将所有的地雷标记出来,并将其它不是雷的格子点开。
(2)计算方格周围雷数
当没有雷的格子被点击后,会显示该格子周围8个格子里所有的雷数,玩家通过这个数字就可以判断出雷的位置,所以周围雷数的计算也很重要。
扫雷是一款益智型游戏。玩家需要在最短的时间内根据点击格子出现的数字找出所有非雷格子,同时避免踩雷,踩到一个雷即全盘皆输。
表1 用例列表
用例编号 | 用例名称 | 描述 | 参与者 |
UC001 | 打开游戏画面 | 用户打开游戏画面 | A,B |
UC002 | 选择等级 | 用户选择游戏等级 | A,B |
UC003 | 查看记录 | 用户查看游戏记录 | A,B |
UC004 | 玩游戏 | 用户进行游戏 | A,B |
UC005 | 继续游戏 | 用户继续游戏 | A,B |
UC006 | 重新游戏 | 用户重新开始游戏 | A,B |
UC007 | 保存记录 | 用户保存游戏记录 | A,B |
UC008 | 结束退出游戏 | 用户结束并退出游戏 | A,B |
注:A:玩家 B:系统管理者
3.3.2UC001
表2 打开游戏界面用例描述
用例号 | UC001 |
用例名称 | 打开游戏界面 |
角色 | 所有用户 |
用例描述 | 用户打开游戏界面 |
参与者 | 玩家与系统管理者 |
前置条件 | 用户点击游戏 |
后置条件 | 点击后则打开游戏界面 |
基本路径 | 点击后打开界面 |
3.3.3UC002
表3 选择等级用例描述
用例号 | UC002 |
用例名称 | 选择等级 |
角色 | 所有用户 |
用例描述 | 用户选择游戏等级 |
参与者 | 玩家与系统管理者 |
前置条件 | 用户点击选择等级选项 |
后置条件 | 点击后则进行对应等级的游戏 |
基本路径 |
|
3.3.4UC003
表4 查看记录用例描述
用例号 | UC003 |
用例名称 | 查看记录 |
角色 | 所有用户 |
用例描述 | 用户查看游戏记录 |
参与者 | 玩家与系统管理者 |
前置条件 | 用户点击查看记录选项 |
后置条件 | 点击后则弹出游戏记录画面 |
基本路径 |
|
3.3.5UC004
表5 玩游戏用例描述
用例号 | UC004 |
用例名称 | 玩游戏 |
角色 | 所有用户 |
用例描述 | 用户进行游戏 |
参与者 | 玩家与系统管理者 |
前置条件 | 用户点击玩游戏选项 |
后置条件 | 点击后开始游戏 |
基本路径 |
|
3.3.6UC005
表6 继续游戏用例描述
用例号 | UC005 |
用例名称 | 继续游戏 |
角色 | 所有用户 |
用例描述 | 用户继续进行游戏 |
参与者 | 玩家与系统管理者 |
前置条件 | 用户点击继续游戏选项 |
后置条件 | 点击后继续进行游戏 |
基本路径 |
|
3.3.7UC006
表7 保存记录用例描述
用例号 | UC006 |
用例名称 | 保存记录 |
角色 | 所有用户 |
用例描述 | 系统保存用户游戏记录 |
参与者 | 玩家与系统管理者 |
前置条件 | 用户点击保存记录选项 |
后置条件 | 点击后系统保存游戏记录 |
基本路径 |
|
3.3.8UC007
表8 结束退出游戏
用例号 | UC007 |
用例名称 | 结束退出游戏 |
角色 | 所有用户 |
用例描述 | 用户结束退出游戏 |
参与者 | 玩家与系统管理者 |
前置条件 | 用户点击结束退出游戏选项 |
后置条件 | 点击后结束并推出游戏 |
基本路径 |
|
系统完整程序见附录1。
-
-
- 游戏初始面
-
玩家点开游戏,此时系统自动加载界面,分别是雷区、菜单区、扫雷数据显示区,如图4-1所示:
图4-1 游戏初始界面
游戏界面相对计算机自带的扫雷游戏比较简洁,主要由游戏数据显示区域以及雷区构成。
我们使用ImageIcon对象来存放地雷的图标,可以图标大小最好要小一些,否则会在格子上显示不全。
对地雷区的初始化是很重要的,我们使用一个循环即可实现初始化。玩家点开游戏之后可以点击菜单栏选择扫雷游戏的难度,不同的难度就代表了不同的地雷总数和尺寸,自定义的难度也会设置雷数和尺寸,设置的这些数据全部存放在几个变量之中,当雷区要初始化的时候程序会调用这么变量属性,然后通过一个循环来完成初始化。主要代码如下:
、
而之前所说的循环初始化其实就是循环的加载组件,雷区就是由一个个组件构成的,通过循环将所有的格子都布置到雷区,然后再随机产生地雷并布置到雷区上。
组件位置的摆放是按照其在数组中的位置来摆放的,所有的格子组件都存放在一个二维数组之中,组件在这个数组中的下标就是他在布局中的位置。
菜单栏是由菜单组件构成的,也就是JMenu组件,这个是菜单组件,用来定义未点击时的菜单样式,这个组件有可以设置JMenauItem组件,这是菜单项的意思,是当玩家点击了菜单后展示出来的子菜单栏。
扫雷游戏的计时区以及计数区又是使用另一种组件完成的,叫做JTextField,这个组件是文本显示的组件,在设置了不可编辑的属性后,该组件在显示的外观上会有变化,边框会变灰一些,意味着该组件不能够点击或者输入。然后使用一个方法随着时间动态的在时间区以一秒为单位增加,计数区则会随着用户标记雷而减一,可以减到负数。
在设置界面的时候还需要进行一些设置,比如设置属性来让玩家在关闭游戏窗口时,系统会自动释放资源,并关闭窗口。
-
-
- 雷区布置
-
当玩家第一次点开格子的时候系统随机布雷并启动定时器,但是为什么要在点过一次格子之后才布雷呢?原来这就是要让玩家第一次不会点到地雷,要不然玩家该多郁闷,这样才能提高玩家的游戏欲。具体实现如下所示:
判断地雷区是否处于可动作状态:
判断为左键且该格子为未探测状态:
布置地雷:
判断地雷应该被布置的位置:
本扫雷游戏有在模式的选择上有三种模式,分别是初、中、高级,这三种模式定义的雷数和雷区的尺寸是固定的。另外还有一种模式,假如玩家想要自己定义扫雷的难度可以自己设置雷数和尺寸,只要打开“自定义”配置弹窗,在之后的弹框里按提示输入雷数和尺寸,行数最大为24,列数最大为30,如果玩家设置的雷数超过了范围(比如雷数大于格子的总数或小于零),系统会默认雷数为行数减一与列数减一的乘积。最后我们也创建了扫雷榜模式,根据完成游戏的时间和难度的不同,对玩家的得分进行计算。通常情况下,游戏难度和完成时间越低,得分越高。
以下是各个模式的具体描述:
初级:设置格子总数为9*9,地雷总数为10颗雷,尺寸为300*380然后重新开始游戏。
中级:设置格子总数为16*16,地雷总数为40颗雷,尺寸为480*580然后重新开始游戏。
高级:设置格子总数为16*30,地雷总数为99颗雷,尺寸为800*500然后重新开始游戏。
自定义:设置格子总数为最大24*30,最多雷数为24*30的难度,然后重新开始游戏。
扫雷榜: 打开并显示时间最短的扫雷记录,可以进行更新和重新记分。
具体如下图:
游戏模式选择
初级难度测试
图6-3中级难度测试
图6-4 高级难度测试
图6-5 自定义难度测试
下面是扫雷积分榜界面设置(代码较长,仅展示部分)
-
-
- 游戏结束
-
游戏胜利
游戏要求玩家在最短的时间内完成游戏,当玩家将所有的雷标记出来并且其它格子都点开以后游戏胜利,系统会弹出提示框告诉玩家“您真厉害,请输入您的名字,记录上榜!”,系统会记录玩家最短完成游戏的时间。
游戏失败
如果玩家不幸点击到了有雷的格子,该格子的地雷会引爆其他的地雷,游戏失败,系统会将剩下的地雷全部显示出来,并弹框提示“你输了,请继续努力!”,玩家可以选择弹框上的重新开始游戏选项来开始一局新的游戏。
游戏失败界面
格子类的对象有一个标识该格子是否是雷的属性,通过该属性来判断玩家点到的是不是地雷。在游戏结束时也是通过该属性来判断哪些格子下有雷并显示出来。
具体代码如下所示:
通过本次课程设计,我们更深入地了解了Java编程和面向对象编程的思想,并开发出了一款有趣的扫雷游戏。我们的合作开发经验以及对代码与论文的细致分工,能够在今后的学习和工作中得到更好的应用。在今后的学习和工作中,我们将继续学习和探索,不断提高自己的技能和能力。