一.预习内容:
项目分析
一个完整的迷宫,需要能够实现产生不同路径供玩家游戏,同时需要能够记录玩家所走过的路,避免由于迷宫的范围太大而导致无法走到最后的结尾。迷宫本身也应该自带友好的交互功能,可以让玩家可以根据提示获得愉快的游戏体验。
实验目标
1.随机生成一个迷宫,并且求解迷宫。
2.要求游戏支持玩家走迷宫,和系统走迷宫路径两种模式。玩家走迷宫,通过键盘方向键控制,并在行走路径上留下痕迹;系统走迷宫路径要求基于A*算法实现,输出走迷宫的最优路径并显示。
3.设计交互友好的游戏图形界面。
二.算法设计
深度遍历算法生成迷宫路径
1、整体思路
1)利用深度遍历的思想。访问到一个节点时,搜索这个节点没有被访问过的相邻节点,选择一个继续做同样的操作,直到没有邻节点为止再回溯到上一个访问的节点,并选择另外的邻节点。
2)这种方案生成的迷宫会有一条明显的主路,这条主路特别长,贯穿大部分区域的路线,同时,迷宫的路线一般比较扭曲。这种采用深度优先算法(递归回溯算法)生成的迷宫称之为“主路扭曲型”迷宫
2、设计过程
(1)把数组地图初始化为如下结构。选择一个靠近边缘的1作为起点,在它的周围随机找另一个黄色的1(这里的“周围”指的是上下左右4个方向)。找到就把他们联通,并且把两个1之间的0(灰色墙)也变成通路,这里用红色来表示。
(2)选择一个靠近边缘的1作为起点,在它的周围随机找另一个黄色的1(这里的“周围”指的是上下左右4个方向)。找到就把他们联通,并且把两个1之间的0(灰色墙)也变成通路,这里用红色来表示。
(3)把上一步”终点”的格子作为新的一个“起点”格子,不断循环第2步的过程……
直到,找不到周围有黄色的1,就回溯,回到之前的位置,看看周围是否有黄色的1,如果有,就按照2步骤,不断将黄色1变联通,接下来就是不停地重复上面的步骤,找到就联通,找不到就往回走。
(4)遍历完所有的点即可生成一个迷宫,然后再选择出口与入口,一个完整的迷宫就形成了。
1.整体框架结构
通过二维数组生成迷宫坐标,参考教程使用深度优先算法的递归回溯算法完成对迷宫的随机生成,不断随机访问每一个相邻格子,记录访问路径,最后将网格按访问路径擦除,玩家按照访问路径实现迷宫中的行走。
2.关键代码
(1)递归回溯算法
递归回溯是一个深度优先算法,如果当前单元有相邻的未访问过的迷宫单元,就一直向前搜索,直到当前单元没有未访问过的迷宫单元,才返回查找之前搜索路径上未访问的迷宫单元,所以用堆栈来维护已访问过的迷宫单位。
算法主循环,重复下面步骤2直到堆栈为空:
1 随机选择一个迷宫单元作为起点,加入堆栈并标记为已访问
2 当堆栈非空时,从栈顶获取一个迷宫单元(不用出栈),进行循环
如果当前迷宫单元有未被访问过的相邻迷宫单元
随机选择一个未访问的相邻迷宫单元
去掉当前迷宫单元与相邻迷宫单元之间的墙
标记相邻迷宫单元为已访问,并将它加入堆栈
否则,当前迷宫单元没有未访问的相邻迷宫单元
则栈顶的迷宫单元出栈
(2)墙体绘制
(3)玩家设计
此处设计了两个玩家,为对抗方式,先到达对方生成点者获胜(自己的出口)
迷宫运行界面如下