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 图片验证码代码分享
Jul 04 Python
十个Python程序员易犯的错误
Dec 15 Python
使用Python来编写HTTP服务器的超级指南
Feb 18 Python
python爬取w3shcool的JQuery课程并且保存到本地
Apr 06 Python
Python实现PS滤镜特效之扇形变换效果示例
Jan 26 Python
python用BeautifulSoup库简单爬虫实例分析
Jul 30 Python
详解PyCharm配置Anaconda的艰难心路历程
Aug 13 Python
python自动化生成IOS的图标
Nov 13 Python
详解Python爬取并下载《电影天堂》3千多部电影
Apr 26 Python
谈一谈基于python的面向对象编程基础
May 21 Python
在python3中使用shuffle函数要注意的地方
Feb 28 Python
Python文件的操作示例的详细讲解
Apr 08 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
php数组函数序列之array_intersect() 返回两个或多个数组的交集数组
2011/11/10 PHP
2014最热门的24个php类库汇总
2014/12/18 PHP
详解PHP对数组的定义以及数组的创建方法
2015/11/27 PHP
PHP串行化与反串行化实例分析
2016/12/27 PHP
php中的异常和错误浅析
2017/05/03 PHP
Mootools 1.2教程 滑动效果(Slide)
2009/09/15 Javascript
Javascript笔记一 js以及json基础使用说明
2010/05/22 Javascript
javascript 三种方法实现获得和设置以及移除元素属性
2013/03/20 Javascript
TypeScript具有的几个不同特质
2015/04/07 Javascript
Bootstrap创建可折叠的组件
2016/02/23 Javascript
JS中对象与字符串的互相转换详解
2016/05/20 Javascript
Angular.js跨controller实现参数传递的两种方法
2017/02/20 Javascript
详解小程序用户登录状态检查与更新实例
2019/05/15 Javascript
vue 路由守卫(导航守卫)及其具体使用
2020/02/25 Javascript
js防抖函数和节流函数使用场景和实现区别示例分析
2020/04/11 Javascript
[04:03]DOTA2肉山黑名单梦之声 风暴之灵中文配音鉴赏
2013/07/03 DOTA
Python语言的面相对象编程方式初步学习
2016/03/12 Python
浅谈python函数之作用域(python3.5)
2017/10/27 Python
详解PyTorch手写数字识别(MNIST数据集)
2019/08/16 Python
Python实现密钥密码(加解密)实例详解
2020/04/26 Python
python实现密度聚类(模板代码+sklearn代码)
2020/04/27 Python
Django nginx配置实现过程详解
2020/09/10 Python
一款恶搞头像特效的制作过程 利用css3和jquery
2014/11/21 HTML / CSS
HTML5 Canvas的事件处理介绍
2015/04/24 HTML / CSS
南非最大的花卉和送礼服务:NetFlorist
2017/09/13 全球购物
成人毕业生自我鉴定
2013/10/18 职场文书
财务部总监岗位职责
2014/03/12 职场文书
激励员工的口号
2014/06/16 职场文书
最美孝心少年事迹材料
2014/08/15 职场文书
考试没考好检讨书(精选篇)
2014/11/16 职场文书
2014年敬老院工作总结
2014/12/08 职场文书
2015年教师党员自我评价材料
2015/03/04 职场文书
交通事故起诉书
2015/05/19 职场文书
迎客户欢迎词三篇
2019/09/27 职场文书
教你怎么用Python监控愉客行车程
2021/04/29 Python
Python基础教程,Python入门教程(超详细)
2021/06/24 Python