(七)项目三日志 一

(七)项目三日志一

物联网工程 - 李涵 - 182210713119
Github:https://github.com/kevin-lh/SoftwarePractice/tree/main/Map


前言

项目三要求为实现基于A*算法的走迷宫游戏


一、需求分析

1) 迷宫游戏是非常经典的游戏,在该题中要求随机生成一个迷宫,并求解迷宫;
2)要求查找并理解迷宫生成的算法,并尝试用两种不同的算法来生成随机的迷宫。
3)要求游戏支持玩家走迷宫,和系统走迷宫路径两种模式。玩家走迷宫,通过键盘方向键控制,并在行走路径上留下痕迹;系统走迷宫路径要求基于 A*算法实现,输出走迷宫的最优路径并显示。设计交互友好的游戏图形界面。

二、算法设计

迷宫问题其实是一种最小生成树问题
首先是生成树的概念:
(1)对连通图进行遍历,过程中所经过的边和顶点的组合可看做是一棵普通树,通常称为生成树。

如上图所示,图 a) 是一张连通图,图 b) 是其对应的 2 种生成树。
连通图中,由于任意两顶点之间可能含有多条通路,遍历连通图的方式有多种,往往一张连通图可能有多种不同的生成树与之对应。
连通图中的生成树必须满足以下 2 个条件:
①包含连通图中所有的顶点;
②任意两顶点之间有且仅有一条通路;
(2)最小生成树
最小生成树问题即为权值最小的连通图:
在这里插入图片描述
如上图所示,图a为赋权值的连通图,图 b 为 图 a 的几种生成树,通过计算每个生成树的权值之和,即可求得 权值最小的生成树(最小生成树)。

2.1 迷宫生成算法(prim)

在这里插入图片描述
如上图所示,黄色1 表示通路,灰色 0 表示墙
我们要做的就是制造一颗连续生长的树,最后把所有值为1点的点都添加到这颗树中, 只不过Prim算法每步选取新节点的原则是最小边(也就是构造最小生成树),我们改成随机选取就好了。

过程
(1)如上图图左所示为一个19*19的迷宫,先假设迷宫中所有的通路都是完全封闭的,黄色的格子表示可以通过,灰色的格子表示墙壁不能通过。
(2)随机选择一个黄色的格子作为当前正在访问的格子,同时把该格子放入一个已经访问的列表中。
(3)循环以下操作,直到所有的格子都被访问到。
  1.得到当前访问格子的四周(上下左右)的格子,在这些格子中随机选择一个没有在访问列表中的格子,如果找到,则把该格子和当前访问的格子中间的墙打通(置为1),把该格子作为当前访问的格子,并放入访问列表。
  2.如果周围所有的格子都已经访问过,则从已访问的列表中,随机选取一个作为当前访问的格子。
通过以上的迷宫生成算法,我们就可以生成一个路径分布很自然随机迷宫

2.2 迷宫寻路算法(A*)

A*寻路算法就是启发式探索的一个典型实践,在寻路的过程中,给每个节点绑定了一个估计值(即启发式),在对节点的遍历过程中是采取估计值优先原则,估计值更优的节点会被优先遍历。所以估计函数的定义十分重要,显著影响算法效率。
在这里插入图片描述

2.2.1算法步骤

(1)将初始节点放入到open列表中。
(2)判断open列表。如果为空,则搜索失败。如果open列表中存在目标节点,则搜索成功。
(3)从open列表中取出F值最小的节点作为当前节点,并将其加入到close列表中。
(4)计算当前节点的相邻的所有可到达节点,生成一组子节点。对于每一个子节点:

  • 如果该节点在close列表中,则丢弃它
  • 如果该节点在open列表中,则检查其通过当前节点计算得到的F值是否更小,如果更小则更新其F值,并将其父节点设置为当前节点。
  • 如果该节点不在open列表中,则将其加入到open列表,并计算F值,设置其父节点为当前节点。

(5)转到2步骤

2.2.2说明

F值是一个估计值,用F(n) = G(n) + H(n) 表示,其中G(n)表示由起点到节点n的预估消耗,H(n)表示节点n到终点的估计消耗。
H(n)的计算方式有很多种,比如曼哈顿H(n) = x + y,或者欧几里得式H(n) = sqrt(x^2 + y^2)。一般使用曼哈顿式
F(n)就表示由起点经过n节点到达终点的总消耗

2.2.3 具体寻路过程

我们严格按照A*算法找出从绿色节点到红色节点的最佳路径,首先将绿色节点加入到open列表中,接着判断open列表不为空(有起始节点),红色节点不在open列表中。然后从open列表中取出F值最小的节点,此时,open列表中只有绿色节点,所以将绿色节点取出,作为当前节点,并将其加入到close列表中,计算绿色节点的相邻节点(暂不考虑斜方向移动),如下图所示的所有灰色节点,并计算它们的F值。这些子节点既没有在open列表中,也没有在close列表中,所以都加入到open列表中,并设置它们的父节点为绿色节点

2.2.4 F值计算方式:

以绿色节点右边的灰色节点为例
G(n) = 1,从绿色节点移动到该节点,都只需要消耗1步
H(n) = 3,其移动到红色节点需要消耗横向2步,竖向一步,所以共消耗3步(曼哈顿式)
F(n) = 4 = G(n) + H(n)
在这里插入图片描述

请见下文!!!


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值