前言
本项目以PyCharm为开发平台,使用python编程语言,基于A*算法随机生成一个迷宫,并求解迷宫。
一、项目要求
a)随机生成一个迷宫,并求解迷宫;
b)要求游戏支持玩家走迷宫,和系统走迷宫路径两种模式。玩家走迷宫,通过键盘方向键控制,并在行走路径上留下痕迹;系统走迷宫路径要求基于A*算法实现,输出走迷宫的最优路径并显示。
c)设计交互友好的游戏图形界面。
二、A*算法
A算法,A(A-Star)算法是一种静态路网中求解最短路径最有效的直接搜索方法,也是解决许多搜索问题的有效算法。
算法中的距离估算值与实际值越接近,最终搜索速度越快。选择路径中经过哪个方格的关键是下面这个等式:F = G + H。
其中,f是从初始状态经由状态n到目标状态的代价估计,g是在状态空间中从初始状态到状态n的实际代价,h是从状态n到目标状态的最佳路径的估计代价。(对于路径搜索问题,状态就是图中的节点,代价就是距离)
h的选取:保证找到最短路径(最优解的)条件,关键在于估价函数f的选取(或者说h的选取)。
以d(n)表达状态n到目标状态的距离,那么h(n)的选取大致有如下三种情况:
① 如果h(n)< d(n)到目标状态的实际距离,这种情况下,搜索的点数多,搜索范围大,效率低。但能得到最优解。
② 如果h(n)=d(n),即距离估计h(n)等于最短距离,那么搜索将严格沿着最短路径进行, 此时的搜索效率是最高的。
③如果 h(n)>d(n),搜索的点数少,搜索范围小,效率高,但不能保证得到最优解。
三、项目实现
1.框架结构
2.数据结构
(1)open表
(2)close表
(3)route表
3.主要功能函数
(1)估值函数
def evaluate(self): #估值函数
return self.distanceStart + abs(self.x - self.endX) + abs(self.y - self.endY)
(2)A*算法
def Astar(self):
# 将起点放到open表中
self.openList.append(self.startPoint)
while (not self.isOK):
# 先检查终点是否在open表中,若有则结束
if self.inOpenList(self.endPoint) != -1: # 在open表中,程序结束
self.isOK = True #
self.end = self.openList[self.inOpenList(self.endPoint)]
self.route.append(self.end)
self.te = self.end
while (self.te.parentPoint != 0):
self.te = self.te.parentPoint
self.route.append(self.te)
else:
self.sortOpenList() # 将估值最小的节点放在index = 0
current_min = self.openList[0] # 估值最小节点
self.openList.