一.实验要求
1.要求随机生成一个迷宫,并求解迷宫。
2.要求游戏支持玩家走迷宫,和系统走迷宫路径两种模式。玩家走迷宫,通过键盘方向键控制,并在行走路径上留下痕迹;系统走迷宫路径要求基于A*算法实现,输出走迷宫的最优路径并显示。
3.设计交互友好的游戏图形界面。
二、迷宫问题大致分析
从起点出发,沿着某一方向前进,如果可以走通,则继续前进,否则原路退回,寻找其他路径。在迷宫中路径的选择方向只有四种,分别是上,下,左,右,我们可以通过键盘进行控制。我们分别用三种颜色对于迷宫中各种对象进行标记,走迷宫的对象为一种颜色,道路和墙壁为另外两种颜色。当走通一步时,我们应将此网格的颜色转变为通路应该有的颜色。根据这样的方法一直走到终点即为成功。
三.需解决的问题:
(1)如何显示迷宫的图形界面
Java Swing GUI图形界面窗口开发
(2)如何生成随机的迷宫
方法一:深度优先遍历(生成主路扭曲型迷宫)(本项目我采用此方法)
方法二:利用prime算法(生成随机型迷宫)
(3)如何移动游戏中走迷宫的玩家
(4)用A*算法求解迷宫
A*算法是一种静态路网中求解最短路径有效的直接搜索方法,引起高效性被广泛用于寻路及图的遍历中;
四.深度优先算法生成迷宫
利用深度遍历的思想。访问到一个节点时,搜索这个节点没有被访问过的相邻节点,选择一个继续做同样的操作,直到没有邻节点为止再回溯到上一个访问的节点,并选择另外的邻节点。
步骤:
(1)选择一个靠近边缘的1作为起点,在它的周围随机找另一个黄色的1(这里的“周围”指的是上下左右4个方向)。找到就把他们联通,并且把两个1之间的0(灰色墙)也变成通路,这里用红色来表示。
(2)把上一步”终点”的格子作为新的一个“起点”格子,不断循环第2步的过程,直到,找不到周围有黄色的1,就回溯,回到之前的位置,看看周围是否有黄色的1,如果有,就按照2步骤,不断将黄色1变联通,接下来就是不停地重复上面的步骤,找到就联通,找不到就往回走。
(3)遍历完所有的点即可生成一个迷宫,然后再选择出口与入口,一个完整的迷宫就形成了。
这种方案生成的迷宫会有一条明显的主路,这条主路特别长,贯穿大部分区域的路线,同时,迷宫的路线一般比较扭曲。这种采用深度优先算法(递归回溯算法)生成的迷宫称之为“主路扭曲型”迷宫。
五. A*算法走迷宫
①A*算法工作原理:
需要两个列表:a.记录下所有被考虑来寻找最短路径的方块(称为open列表)
b.记录下不会再被考虑的方块(称为closed列表)
小A首先在closed列表中添加当前位置(我们把这个开始点称为“A”)。然后把所有与他当前位置相邻的可通行的小方块添加到open列表中。
现在小A需要判断在这些选项中,哪项才是最短路径,该如何选择呢?
在A*的寻路算法中,通过给每一个方块一个和值,该值被称为路径增量。
路径增量F(n)=G+H,我们将会给每一个方块一个G+H值,G是从开始点A到当前方块的移动量,H是从当前方块到目标点的移动量估算值。
②A*算法在迷宫中的详细实现
a.Open和Closed表
在A算法中,我们从起点开始,依次检查它的相邻方格,选取相邻方格然后继续向外扩展直到找到目的地,根据评价值选择方格。
b.把起点加入 open list 。
c.遍历 open list ,查找 F 值最小的节点,把它作为当前要处理的节点。把这个节点移到 close list 。对于当前方格的 8 个相邻方格的每一个方格做如下判断:
c.1如果它是不可抵达的或者它在 close list 中,忽略它。
c.2如果它不在 open list 中,把它加入 open list ,并且把当前方格设置为它的父亲,记录该方格的 F , G 和 H 值。
c.3如果它已经在 open list 中,检查这条路径 ( 即经由当前方格到达它那里 ) 是否更好,用 G 值作参考。更小的 G 值表示这是更好的路径。如果是这样,把它的父亲设置为当前方格,并重新计算它的 G 值和 F 值。
c.4把终点加入到