文章目录

  • 前言
  • 一、项目要求
  • 二、A*算法
  • 三、项目实现
    • 1.框架结构
    • 2.数据结构
    • 3.主要功能函数
  • 总结

前言

本项目以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.endwhile (self.te.parentPoint != 0):self.te = self.te.parentPointself.route.append(self.te)else:self.sortOpenList()  # 将估值最小的节点放在index = 0current_min = self.openList[0]  # 估值最小节点self.openList.pop(0)self.closeList.append(current_min)# 设current_min节点,并放到open 表if current_min.x - 1 >= 0:  # 没有越界if (self.mapStatus[current_min.y][current_min.x - 1]) != 0:  # 无障碍点,可前行路径self.temp1 = mapPoint(current_min.x - 1, current_min.y, current_min.distanceStart + 1,self.endPoint.x, self.endPoint.y, current_min)if self.inOpenList(self.temp1) != -1:  # open表存在相同的节点if self.temp1.evaluate() < self.openList[self.inOpenList(self.temp1)].evaluate():self.openList[self.inOpenList(self.temp1)] = self.temp1elif self.inCloseList(self.temp1) != -1:  # 否则查看close表是否存在相同的节点,若存在进行if判断if self.temp1.evaluate() < self.closeList[self.inCloseList(self.temp1)].evaluate():self.closeList[self.inCloseList(self.temp1)] = self.temp1else:  # open、close表都不存在 temp1self.openList.append(self.temp1)if current_min.x + 1 < 15:if (self.mapStatus[current_min.y][current_min.x + 1]) != 0:  # 无障碍点,可前行路径self.temp2 = mapPoint(current_min.x + 1, current_min.y, current_min.distanceStart + 1,self.endPoint.x, self.endPoint.y, current_min)if self.inOpenList(self.temp2) != -1:  # open表存在相同的节点if self.temp2.evaluate() < self.openList[self.inOpenList(self.temp2)].evaluate():self.openList[self.inOpenList(self.temp2)] = self.temp2elif self.inCloseList(self.temp2) != -1:  # 否则,查看close表是否存在相同的节点(存在)if self.temp2.evaluate() < self.closeList[self.inCloseList(self.temp2)].evaluate():self.closeList[self.inCloseList(self.temp2)] = self.temp2else:self.openList.append(self.temp2)if current_min.y - 1 >= 0:if (self.mapStatus[current_min.y - 1][current_min.x]) != 0:  # 无障碍点,可前行路径self.temp3 = mapPoint(current_min.x, current_min.y - 1, current_min.distanceStart + 1,self.endPoint.x, self.endPoint.y, current_min)if self.inOpenList(self.temp3) != -1:  # open表中存在相同的节点if self.temp3.evaluate() < self.openList[self.inOpenList(self.temp3)].evaluate():self.openList[self.inOpenList(self.temp3)] = self.temp3elif self.inCloseList(self.temp3) != -1:  # 否则,查看close表是否存在相同的节点(存在)if self.temp3.evaluate() < self.closeList[self.inCloseList(self.temp3)].evaluate():self.closeList[self.inCloseList(self.temp3)] = self.temp3else:self.openList.append(self.temp3)if current_min.y + 1 < 15:if (self.mapStatus[current_min.y + 1][current_min.x]) != 0:  # 无障碍点,可前行路径self.temp4 = mapPoint(current_min.x, current_min.y + 1, current_min.distanceStart + 1,self.endPoint.x, self.endPoint.y, current_min)if self.inOpenList(self.temp4) != -1:  # open表存在相同的节点if self.temp4.evaluate() < self.openList[self.inOpenList(self.temp4)].evaluate():self.openList[self.inOpenList(self.temp4)] = self.temp4elif self.inCloseList(self.temp4) != -1:  # 否则查看close表是否存在相同的节点(存在)if self.temp4.evaluate() < self.closeList[self.inCloseList(self.temp4)].evaluate():self.closeList[self.inCloseList(self.temp4)] = self.temp4else:self.openList.append(self.temp4)

(3)菜单选项对应操作函数

def selectrestart(self)
def selectmaze(self)
def selectstart(self)
def selectend(self)
def selectfind(self)

总结

运行结果如下:

基于A*算法的迷宫游戏相关推荐

  1. 实验三 基于A*算法的迷宫游戏

    软件实习项目三 -- Java实现基于A*算法的迷宫游戏 一.实验任务 (1)该题要求随机生成一个迷宫,并求解迷宫: (2)要求游戏支持玩家走迷宫,和系统走迷宫路径两种模式.玩家走迷宫,通过键盘方向键 ...

  2. 实验三 基于A*算法的迷宫游戏开发

    实验要求: 1.迷宫随机生成 2.玩家走迷宫,留下足迹: 3.系统用A*算法寻路,输出路径 解决问题: 1.如何显示迷宫的图形界面: 2.如何生成随机的迷宫: 3.怎样移动游戏中走迷宫的"玩 ...

  3. 【项目三 基于A*算法的迷宫游戏开发】

    一. 实验要求 1.迷宫随机生成 2.玩家走迷宫,留下足迹 3.系统用A*算法寻路,输出路径 二.前期准备 解决迷宫问题要用到两个算法,深度优先遍历(DFS)生成迷宫,A*算法寻路.那么首先要对这两种 ...

  4. 基于A*算法的迷宫小游戏

    文章目录 前言 一.程序设计说明 1.功能描述 2.算法思想 二.模块设计 1.流程设计 2.算法实现 3.界面设计 三.功能演示 前言 本文采用A*算法的思想,借助pycharm下的python环境 ...

  5. 基于深度优先算法和A*算法的迷宫游戏开发(Java实现)

    先上图 文章目录 一.实验内容 二.深度优先算法生成迷宫 三.A*算法走迷宫 四.结果测试 五.源代码 六.参考文献 一.实验内容 1.要求: 1)迷宫随机生成 2)系统用A*算法寻路,输出路径 3) ...

  6. python迷宫小游戏代码_课内资源 - 基于python实现的迷宫游戏

    一.项目概述与编译环境 本次大作业选题为题目2,即小兔子找胡萝卜的迷宫问题,最终完成开发的游戏名为Caveman and Treasure(穴居人寻宝),游戏整体界面如下: 该项目在windows下编 ...

  7. 基于JAVA的简单迷宫游戏

    一.实验要求 1. 迷宫游戏是非常经典的游戏,在该题中要求随机生成一个迷宫,并求解迷宫. 2. 要求游戏支持玩家走迷宫,和系统走迷宫路径两种模式.玩家走迷宫,通过键盘方向键控制,并在行走路径上留下痕迹 ...

  8. 实验三:基于A*算法的迷宫

    实验要求: 1.迷宫随机生成 2.玩家走迷宫,留下足迹: 3.系统用A*算法寻路,输出路径 解决问题: 1.如何显示迷宫的图形界面: 2.如何生成随机的迷宫: 3.怎样移动游戏中走迷宫的"玩 ...

  9. 基于python实现的迷宫游戏

    目录 一.项目概述与编译环境 1 二.问题的数学建模 2 三.算法实现 2 1.迷宫的创建 2 (1)对每一小格随机添加障碍物 2 2.搜索算法描述 3 (1)深度优先搜索 3 (2)宽度优先搜索 3 ...

最新文章

  1. linux 云主机 卡顿 排查过程
  2. 安装Ubuntu server并实现远程访问
  3. mysql5.7.25源码安装_源码编译安装 mysql5.7.25
  4. Qt修炼手册12_线程同步与线程等待条件
  5. matlab 检测gpu,康奈尔大学使用MATLAB进行GPU性能测试
  6. 两种方式带你爬点你想要的东西
  7. php相册上传和删除吗,php如何删除上传图片
  8. 前端之JavaScript进阶
  9. CAS3.5.x(x1)支持OAuth2 server
  10. HiKey试用体验 烧写系统至Flash之诡异事件
  11. linux 检测SSD寿命
  12. 修改bounds属性后的效果
  13. 程序员收入高,听说要被整治了?
  14. pytest学习和使用8-fixture如何实现teardown功能?(yield的使用)
  15. 聚名网:华为申请“燃力红”商标,广告语注册商标需要符合哪些条件呢?
  16. HorizontalScrollView和ViewPager联动效果
  17. There is no Qt version assigned to project
  18. 基于泰勒级数展开求余弦函数值
  19. 蚂蚁开放平台开发第三方授权登陆(一):开发前期准备
  20. c语言中的void类型解析

热门文章

  1. win10家庭版桌面软件图标左下角箭头删除
  2. JavaScript中字符串连接/拼接的四种方式
  3. xml 入门 shema_02
  4. OBS Studio使用教程/工具高速下载
  5. mybatis异常:java.lang.ExceptionInInitializerError
  6. Joda - 日期时间
  7. 支付宝小程序与生活号可互相关联啦!
  8. 工业控制计算机固态硬盘,我们如何选择一款好的工业级固态硬盘?
  9. Shell脚本之IP验证
  10. 我喜欢邓丽君,死掉了;