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 相关文章推荐
从CentOS安装完成到生成词云python的实例
Dec 01 Python
PyTorch上实现卷积神经网络CNN的方法
Apr 28 Python
详解python列表生成式和列表生成式器区别
Mar 27 Python
Python实现性能自动化测试竟然如此简单
Jul 30 Python
如何在mac环境中用python处理protobuf
Dec 25 Python
Python random库使用方法及异常处理方案
Mar 02 Python
python检查目录文件权限并修改目录文件权限的操作
Mar 11 Python
Jupyter notebook运行Spark+Scala教程
Apr 10 Python
Python使用plt.boxplot() 参数绘制箱线图
Jun 04 Python
python语言中有算法吗
Jun 16 Python
详解python tkinter 图片插入问题
Sep 03 Python
怎么用Python识别手势数字
Jun 07 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
如何限制访问者的ip(PHPBB的代码)
2006/10/09 PHP
PHP多例模式介绍
2013/06/24 PHP
php实现aes加密类分享
2014/02/16 PHP
Nigma vs AM BO3 第二场2.13
2021/03/10 DOTA
JavaScript Prototype对象
2009/01/07 Javascript
javascript数组的使用
2013/03/28 Javascript
input 输入框获得/失去焦点时隐藏/显示文字(jquery版)
2013/04/02 Javascript
JS OffsetParent属性深入解析
2014/01/13 Javascript
JavaScript数组常用操作技巧汇总
2014/11/17 Javascript
jQuery中实现prop()函数控制多选框(全选,反选)
2016/08/19 Javascript
老生常谈JavaScript 函数表达式
2016/09/01 Javascript
jQuery和JavaScript节点插入元素的方法对比
2016/11/18 Javascript
Vue.js render方法使用详解
2017/04/05 Javascript
xmlplus组件设计系列之分隔框(DividedBox)(8)
2017/05/02 Javascript
微信小程序实现刷脸登录
2018/05/25 Javascript
详解Vue开发微信H5微信分享签名失败问题解决方案
2018/08/09 Javascript
js实现文件上传功能 后台使用MultipartFile
2018/09/08 Javascript
微信小程序实现随机验证码功能
2018/12/20 Javascript
java和js实现的洗牌小程序
2019/09/30 Javascript
jQuery实现带进度条的轮播图
2020/09/13 jQuery
详解Typescript里的This的使用方法
2021/01/08 Javascript
Python的for和break循环结构中使用else语句的技巧
2016/05/24 Python
CentOS 7下Python 2.7升级至Python3.6.1的实战教程
2017/07/06 Python
python PyTorch参数初始化和Finetune
2018/02/11 Python
django的登录注册系统的示例代码
2018/05/14 Python
Python Selenium 之关闭窗口close与quit的方法
2019/02/13 Python
python实现ip代理池功能示例
2019/07/05 Python
Python中flatten( ),matrix.A用法说明
2020/07/05 Python
用Python制作音乐海报
2021/01/26 Python
PyCharm2020.3.2安装超详细教程
2021/02/08 Python
意大利香水和化妆品购物网站:Parfimo.it
2019/10/06 全球购物
GOLFINO英国官网:高尔夫服装
2020/04/11 全球购物
励志演讲稿600字
2014/08/21 职场文书
消夏晚会主持词
2015/06/30 职场文书
2019如何书写演讲稿?
2019/07/01 职场文书
使用Mysql计算地址的经纬度距离和实时位置信息
2022/04/29 MySQL