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中的fileinput模块的简单实用示例
Jul 09 Python
python3 实现的人人影视网站自动签到
Jun 19 Python
python批量设置多个Excel文件页眉页脚的脚本
Mar 14 Python
Sanic框架安装与简单入门示例
Jul 16 Python
python调用摄像头显示图像的实例
Aug 03 Python
对python读取CT医学图像的实例详解
Jan 24 Python
Python 异常处理Ⅳ过程图解
Oct 18 Python
OpenCV模板匹配matchTemplate的实现
Oct 18 Python
python实现从wind导入数据
Dec 03 Python
Pygame框架实现飞机大战
Aug 07 Python
matplotlib部件之矩形选区(RectangleSelector)的实现
Feb 01 Python
Python用any()函数检查字符串中的字母以及如何使用all()函数
Apr 14 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
如何选购合适的收音机
2021/03/01 无线电
咖啡豆要不要放冰箱的原因
2021/03/04 冲泡冲煮
通过PHP的内置函数,通过DES算法对数据加密和解密
2012/06/21 PHP
PHP7 安装event扩展的实现方法
2019/10/08 PHP
基于jquery的网页SELECT下拉框美化代码
2010/10/28 Javascript
js修改table中Td的值(定义td的双击事件)
2013/01/10 Javascript
正负小数点后两位浮点数实现原理及代码
2013/09/06 Javascript
JS短路原理的应用示例 精简代码的途径
2013/12/13 Javascript
详解Javascript 装载和执行
2014/11/17 Javascript
使用React实现轮播效果组件示例代码
2016/09/05 Javascript
JavaScript实现同一个页面打开多张图片
2016/12/29 Javascript
AngularJS中filter的使用实例详解
2017/08/25 Javascript
javaScript实现滚动条事件详解
2020/03/24 Javascript
JS立即执行函数功能与用法分析
2019/01/15 Javascript
js如何验证密码强度
2020/03/18 Javascript
jQuery实现颜色打字机的完整代码
2020/03/19 jQuery
详谈Object.defineProperty 及实现数据双向绑定
2020/07/18 Javascript
你真的了解Python的random模块吗?
2017/12/12 Python
Python使用re模块正则提取字符串中括号内的内容示例
2018/06/01 Python
python爬虫开发之urllib模块详细使用方法与实例全解
2020/03/09 Python
openCV提取图像中的矩形区域
2020/07/21 Python
Python脚本实现Zabbix多行日志监控过程解析
2020/08/26 Python
美国修容界大佬创建的个人美妆品牌:Kevyn Aucoin Beauty
2018/12/12 全球购物
德国药房apodiscounter中文官网:德国排名前三的网上药店
2019/06/03 全球购物
FILA德国官方网站:来自意大利的体育和街头服饰品牌
2019/07/19 全球购物
哈弗商学院毕业生求职信
2014/02/26 职场文书
优秀经理获奖感言
2014/03/04 职场文书
2014年基层党建工作总结
2014/11/11 职场文书
灵山大佛导游词
2015/02/04 职场文书
支行行长岗位职责
2015/02/15 职场文书
公司环境卫生管理制度
2015/08/05 职场文书
2016优秀员工先进事迹材料
2016/02/25 职场文书
班干部竞选演讲稿(精选5篇)
2019/09/24 职场文书
Python编程根据字典列表相同键的值进行合并
2021/10/05 Python
MySQL提取JSON字段数据实现查询
2022/04/22 MySQL
spring IOC容器的Bean管理XML自动装配过程
2022/05/30 Java/Android