计算机软件技术实习项目三——基于A*算法的迷宫游戏的实现(实验准备)

一、实验要求

1.利用prime算法或深度优先算法随机生成一个迷宫,并求解迷宫。

2.要求迷宫游戏支持玩家走迷宫,和系统走迷宫路径两种模式。玩家走迷宫,通过键盘方向键控制,并在行走路径上留下痕迹;系统提示迷宫路径要求基于A*算法实现,输出玩家当前位置到迷宫出口的最优路径。设计交互友好的游戏图形界面。

二、开发工具

编程语言:C++

工具:QT Creator

三、实验思路

1.迷宫图形界面的显示

可以参考项目二贪吃蛇界面显示,利用自定义信号与槽实现界面的跳转。

对于地图的表示,可以借助二维数组来表示,并通过遍历实现对地图的初始化。

2.随机迷宫的生成

迷宫的随机生成可以有两种方法,深度优先算法和prime算法

2.1prime算法

prime算法在找最小生成树时,将顶点分为两类,一类是在查找的过程中已经包含在树中的(假设为 A 类),剩下的是另一类(假设为 B 类)。
对于给定的连通网,起始状态全部顶点都归为 B 类。在找最小生成树时,选定任意一个顶点作为起始点,并将之从 B 类移至 A 类;然后找出 B 类中到 A 类中的顶点之间权值最小的顶点,将之从 B 类移至 A 类,如此重复,直到 B 类中没有顶点为止。所走过的顶点和边就是该连通图的最小生成树。

例如,通过普里姆算法查找上图的最小生成树的步骤为:
假如从顶点A出发,顶点 B、C、D 到顶点 A 的权值分别为 2、4、2,所以,对于顶点 A 来说,顶点 B 和顶点 D 到 A 的权值最小,假设先找到的顶点 B:

继续分析顶点 C 和 D,顶点 C 到 B 的权值为 3,到 A 的权值为 4;顶点 D 到 A 的权值为 2,到 B 的权值为无穷大(如果之间没有直接通路,设定权值为无穷大)。所以顶点 D 到 A 的权值最小:

最后,只剩下顶点 C,到 A 的权值为 4,到 B 的权值和到 D 的权值一样大,为 3。所以该连通图有两个最小生成树:

 采用prim算法形成的主路相对于深度优先算法,比较自然,但迷宫的分岔比较多,所以迷宫会更复杂,玩家需要做的选择次数可能会比较多。

2.2 深度优先算法(DFS) 

深度优先遍历可以大致分为以下几个步骤:

(1)访问顶点v;

(2)从v的未被访问的邻接点中选取一个顶点w,重复第一步,如果v没有未访问的邻接点,回溯至上一顶点;

(3)重复上述两步,直至图中所有和v有路径相通的顶点都被访问到。 

如果将这些节点放在迷宫这样的矩阵里,把这些节点全部遍历就行。就会在任两个节点之间形成一个通路。

 采用深度遍历算法这种方法生成的迷宫会有一条明显的主路,这条主路特别长,贯穿大部分区域的路线,同时,迷宫的路线一般比较扭曲。

 3.实现迷宫自动寻路

迷宫自动寻路用到的算法是A*算法

A*算法的具体流程

定义一个Open开放列表,这里面的结点可能更新可能移除。

定义一个Close封闭列表 ,这里面的结点不需要处理。

1. 把起点加入 open list 。

2.  重复如下过程:

     a. 遍历 open list ,查找 F 值最小的节点,把它作为当前要处理的节点。

     b. 把这个节点移到 close list 。

     c. 对当前方格的 8 个相邻方格的每一个方格:

         ◆ 如果它是不可抵达的或者它在 close list 中,忽略它。否则,做如下操作。

         ◆ 如果它不在 open list 中,把它加入 open list ,并且把当前方格设置为它的父亲,记录该方格的 F,G 和 H 值。

         ◆ 如果它已经在 open list 中,检查这条路径 ( 即经由当前方格到达它那里 ) 是否更好,用 G 值作参考。更小的 G 值表示这是更好的路径。如果是这样,把它的父亲设置为当前方格,并重新计算它的 G 和 F 值。如果你的 open list 是按 F 值排序的话,改变后你可能需要重新排序。

     d. 停止,当你:

         ◆ 把终点加入到了 open list 中,此时路径已经找到了,或者

         ◆ 查找终点失败,并且 open list 是空的,此时没有路径。

3. 保存路径。从终点开始,每个方格沿着父节点移动直至起点,这就是你的路径。
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值