python游戏地图最短路径求解


Posted in Python onJanuary 16, 2019

一.题目要求

参考下图完成游戏地图中从起点到目标点的最短路径寻找问题。

 python游戏地图最短路径求解

二.设计思路

先对游戏地图做了几个设定,以矩阵来模拟游戏地图。将可行的区域位置赋值0,障碍区赋值为inf。考虑到地图大小,将起始点和终点区域赋值99。

从Start点A开始向外层扩展,每扩展一层pathlen加一。List Q存储当前需要扩展的点,list P 存储当前扩展层。当扩展到End点B时扩展结束,路径可规划。当Q为空时,本次层扩展结束,检查P,若P非空,从P层向外扩展,若P为空,则End点B无法到达。

寻找最短路径时,从End点B开始,寻找当前点附近8个点的标记中比当前点标记小的点,直到标记为1为止。

三.程序主体

# -*-coding:gbk -*-
from numpy import *
dirs = [(1,1),(1,0),(1,-1),(0,-1),(-1,-1),(-1,0),(-1,1),(0,1)] # 四邻位置:从右下角开始顺时针得到,是按坐标差得到的
def find_path(oldmap,A,B):
 oldmap[A[0], A[1]] = 99
 oldmap[B[0], B[1]] = 99
 [a,b]=oldmap.shape
 pathmap=oldmap.copy()
 Q=[]#存储扩展节点
 P=[]#往外一层
 pathlen=1
 if A==B:
  print('start point is equal to end point')
  return True
 current=A
 while (True):
  for i in range(8):
   neighbor=[current[0]+dirs[i][0], current[1]+dirs[i][1]]
   if neighbor==B:
    print('the way is found')######################wrong
    print('中间过程')
    print(oldmap)
    find_way(oldmap,pathmap,A,B,a,b)#####调用路径函数
    return True
   if (neighbor[0]>=0 and neighbor[1]>=0 and neighbor[0]<a and neighbor[1]<b and oldmap[neighbor[0],neighbor[1]]==0):
    P.append(neighbor)
    oldmap[neighbor[0],neighbor[1]]=pathlen

  if Q==[]:
   if P ==[]:
    print(oldmap) ##############
    print('No path')
    return False
   else:
    Q.extend(P)
    P=[]
    pathlen += 1

  else:
   current=Q.pop()

###################寻找最短路径
def find_way(oldmap,pathmap,A,B,a,b):
 currentpos=B
 while (oldmap[currentpos[0],currentpos[1]]!=1):
  for i in range(8):
   neighborpos=[currentpos[0]+dirs[i][0], currentpos[1]+dirs[i][1]]
   if (neighborpos[0] >= 0 and neighborpos[1] >= 0 and neighborpos[0] < a and neighborpos[1] < b and oldmap[neighborpos[0],neighborpos[1]]!=0):
    if oldmap[neighborpos[0],neighborpos[1]]<oldmap[currentpos[0],currentpos[1]]:
     pathmap[neighborpos[0],neighborpos[1]]=oldmap[neighborpos[0],neighborpos[1]]
     currentpos=neighborpos
     break
 print('the way:')
 print(pathmap)

 四.主函数

def main():
 map =mat([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, inf,inf, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0,inf, 0, 0, 0, 0, 0, 0, 0],
    [inf,inf,inf, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0,inf, 0, 0, 0, 0, 0, 0, 0, 0, 0, inf],
    [0, 0,inf, 0, 0, 0, 0, 0, 0, 0, 0, 0, inf],
    [0, 0,inf, 0, 0, 0, 0, 0, 0, 0, 0, 0,inf],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, inf],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],])
 print('最初地图')
 print(map)
 print('**********************************')
 A = [5, 0]
 # B=[5,0]
 B = [3, 12]
 find_path(map,A, B)


if __name__=='__main__':
 main()

五.运行结果

 python游戏地图最短路径求解

python游戏地图最短路径求解

六.结果分析

由中间过程对应的矩阵可知,共经历了12次向外层扩展,第12次扩展即可将目标点包含进去。最短路径如the way对应的矩阵所示,是通过一种类似梯度下降的方法得到的。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
解决谷歌搜索技术文章时打不开网页问题的python脚本
Feb 10 Python
python中二维阵列的变换实例
Oct 09 Python
用实例解释Python中的继承和多态的概念
Apr 27 Python
Python2.x版本中maketrans()方法的使用介绍
May 19 Python
Python爬虫爬验证码实现功能详解
Apr 14 Python
python爬虫_微信公众号推送信息爬取的实例
Oct 23 Python
使用Python向C语言的链接库传递数组、结构体、指针类型的数据
Jan 29 Python
Django项目之Elasticsearch搜索引擎的实例
Aug 21 Python
python 实现turtle画图并导出图片格式的文件
Dec 07 Python
Python打开文件、文件读写操作、with方式、文件常用函数实例分析
Jan 07 Python
python中的 zip函数详解及用法举例
Feb 16 Python
python中用ctypes模拟点击的实例讲解
Nov 26 Python
python调用百度地图WEB服务API获取地点对应坐标值
Jan 16 #Python
Python3 关于pycharm自动导入包快捷设置的方法
Jan 16 #Python
在Pycharm中自动添加时间日期作者等信息的方法
Jan 16 #Python
解析Python的缩进规则的使用
Jan 16 #Python
在Pycharm中将pyinstaller加入External Tools的方法
Jan 16 #Python
浅谈python3.x pool.map()方法的实质
Jan 16 #Python
在Pycharm terminal中字体大小设置的方法
Jan 16 #Python
You might like
PHP4实际应用经验篇(5)
2006/10/09 PHP
php购物网站支付paypal使用方法
2010/11/28 PHP
php实现aes加密类分享
2014/02/16 PHP
PHP的mysqli_sqlstate()函数讲解
2019/01/23 PHP
window.showModalDialog使用手册
2007/01/11 Javascript
返回对象在当前级别中是第几个元素的实现代码
2011/01/20 Javascript
解析DHTML,JavaScript,DOM,BOM以及WEB标准的描述
2013/06/19 Javascript
JavaScript中的this关键字介绍与使用实例
2013/06/21 Javascript
利用JS实现浏览器的title闪烁
2013/07/08 Javascript
js简单实现点击左右运动的方法
2015/04/10 Javascript
详解JavaScript中的forEach()方法的使用
2015/06/08 Javascript
jquery实现的简单二级菜单效果代码
2015/09/22 Javascript
jQuery实现页面顶部显示的进度条效果完整实例
2015/12/09 Javascript
Angular 中 select指令用法详解
2016/09/29 Javascript
详解微信小程序开发之下拉刷新 上拉加载
2016/11/24 Javascript
如何利用@angular/cli V6.0直接开发PWA应用详解
2018/05/06 Javascript
Angular 2使用路由自定义弹出组件toast操作示例
2019/05/10 Javascript
javascript实现滚动条效果
2020/03/24 Javascript
js回到页面指定位置的三种方式
2020/12/17 Javascript
[59:59]EG vs IG 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
用python处理图片之打开\显示\保存图像的方法
2018/05/04 Python
python安装twisted的问题解析
2018/08/21 Python
Django项目中实现使用qq第三方登录功能
2019/08/13 Python
Python 类的魔法属性用法实例分析
2019/11/21 Python
Python字符串格式化输出代码实例
2019/11/22 Python
python利用Excel读取和存储测试数据完成接口自动化教程
2020/04/30 Python
Python基于pip实现离线打包过程详解
2020/05/15 Python
纯css3实现的竖形无限级导航
2014/12/10 HTML / CSS
介绍一下RMI的基本概念
2016/12/17 面试题
会计毕业生自荐信
2013/11/21 职场文书
工商管理专业职业生涯规划
2014/01/01 职场文书
大学生入党积极分子党校学习思想汇报
2014/10/25 职场文书
心理健康教育主题班会
2015/08/13 职场文书
再见,2019我们不负使命;你好,2020我们砥砺前行
2020/01/03 职场文书
你真的会用Mysql的explain吗
2022/03/31 MySQL
PYTHON InceptionV3模型的复现详解
2022/05/06 Python