Java培训:初学者实现Java迷宫小游戏
初学者实现Java迷宫小游戏要怎么做?动力节点小编来告诉大家。Java实现一个迷宫游戏,本仓库代码是经过编译运行过的,一般情况下将本仓库代码下载下来之后,使用编译直接可以运行。
该软件主要分为如下三个模块:
参数设置模块
按钮功能模块按钮功能模块
迷宫主界面模块迷宫主界面模块
软件各模块介绍
参数设置模块
1. 迷宫大小相关参数:
2. 迷宫创建算法相关参数本游戏中创建一个迷宫的算法有三种:
3. 迷宫寻路算法相关参数本游戏中走出一个迷宫的迷宫寻路算法有两种:
按钮功能模块
本游戏中,按进行游戏的主体不同共设计两个游戏状态:
该模块涉及到的游戏功能按钮及相关的适用状态有以下六种:
迷宫主界面模块
整个迷宫使用大量的方格(正方形)进行显示,其中,可行走的路径用白色方格显示,不可行走的路径即障碍物用黑色方格表示,出口用红色方格表示,用户用于行走的标识用绿色小球(圆形)表示。用户通过键盘上上下左右的方向键操纵小球在迷宫主界面上运动。
参数设计模块中的ROWS(即迷宫行数)、COLS(即迷宫列数)在迷宫主界面的表示分别指的是迷宫主界面中每行、每列方格的数量,参数设计模块中的's (即组成迷宫的格子的宽度)在迷宫主界面的表示是迷宫主界面中每个方格的宽。此外,在迷宫主界面模块的正上方,存在统计用户进行游戏的当前时刻的所用时间和所走步数的计时器和计步器。
软件设计方案
软件相关原理说明
要设计一款迷宫的游戏软件,其中最主要也是必须要解决的两大主要问题就是如何去生成一个随机的迷宫以及如何在一个随机生成的迷宫中找到从迷宫入口到迷宫出口的路径。在图论中,这两个问题的表示就是:
关于这两个问题的解决,目前存在许多算法,本款软件采取并实现了目前应用最为广泛的三大随机无权连通图生成算法:
以及两大无权连通图遍历算法:
迷宫生成算法
在对迷宫生成算法进行具体阐述之前,有两个概念首先要明确定义一下:迷宫单元和墙。迷宫单元可以映射到无权连通图中的点,而墙壁则可以映射到无权连通图中两点之间的边。如果墙壁是打通的,则记为无权连通图中的墙壁两侧的点间有边;如果墙壁是没有打通的,则记为无权连通图中的墙壁两侧的点间没有边。要生成一个随机的迷宫,就需要做到迷宫中任意两个迷宫单元之间都有一条路径。
我们用二维数组表示一个迷宫,每个迷宫单元表示为一个二维数组元素,由于生成算法的限制,迷宫的行数和列数均需设置为奇数,在了解了相关算法原理后,就能明白其中原因。在下列迷宫生成算法执行之前,假设位于奇数行奇数列的点为迷宫单元,位于偶数行或者偶数列的点为墙壁,且所有的点均初始化为未访问状态、不可通过状态。
(深度优先搜索算法)
算法描述
将起点作为当前迷宫单元并标记为已访问
当还存在未标记的迷宫单元,进行循环
如果当前迷宫单元有未被访问过的的相邻的迷宫单元
随机选择一个未访问的相邻迷宫单元
将当前迷宫单元入栈
移除当前迷宫单元与相邻迷宫单元的墙
标记相邻迷宫单元并用它作为当前迷宫单元
如果当前迷宫单元不存在未访问的相邻迷宫单元,并且栈不空
栈顶的迷宫单元出栈
令其成为当前迷宫单元
生成的迷宫特点
一般来说, 生成的迷宫极度扭曲,有着一条明显的主路。
Prim's (随机普利姆算法)
算法描述
让迷宫全是墙.
随机选一个单元格作为迷宫的通路,然后把它的邻墙放入列表
当列表里还有墙时
从列表里随机选一个墙,如果这面墙分隔的两个单元格只有一个单元格被访问过
那就从列表里移除这面墙,即把墙打通,让未访问的单元格成为迷宫的通路
把这个格子的墙加入列表
如果墙两面的单元格都已经被访问过,那就从列表里移除这面墙
生成的迷宫特点
相对于深度优先的算法, Prim's 不是优先选择最近选中的单元格,而是随机的从所有的列表中的单元格进行选择,新加入的单元格和旧加入的单元格同样概率会被选择,新加入的单元格没有优先权。因此其分支更多,生成的迷宫更复杂,岔路更多,难度更大,也更自然。
(递归分割算法)
算法描述
生成的迷宫特点
十分高效,生成的迷宫较为简单,有点像四叉树,直路多且不扭曲。
迷宫寻路算法
由于迷宫相当于连通图,所以通过使用图论算法中由任意一点出发遍历整个连通图的其他所有顶点的遍历算法即可找到一条从迷宫入口到迷宫出口的路径,本游戏软件使用的是目前应用最为广泛的 (深度优先搜索算法)和 (广度优先搜索算法)。注意,此时迷宫中所有可行走的点均视为迷宫单元,所有不可行走的点均视为墙壁。
(深度优先搜索算法)
算法描述
生成的路径特点:
在由 生成的51行51列迷宫中生成的路径。
(广度优先搜索算法)
算法描述
生成的路径特点:
在由 生成的51行51列迷宫中生成的路径。
动力节点java培训:
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。