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 相关文章推荐
Python3 入门教程 简单但比较不错
Nov 29 Python
测试、预发布后用python检测网页是否有日常链接
Jun 03 Python
Python切换pip安装源的方法详解
Nov 18 Python
Flask框架的学习指南之用户登录管理
Nov 20 Python
Ubuntu下创建虚拟独立的Python环境全过程
Feb 10 Python
Python 实现删除某路径下文件及文件夹的实例讲解
Apr 24 Python
python 对key为时间的dict排序方法
Oct 17 Python
Python/Django后端使用PIL Image生成头像缩略图
Apr 30 Python
numpy数组之存取文件的实现示例
May 24 Python
用Pytorch训练CNN(数据集MNIST,使用GPU的方法)
Aug 19 Python
Python处理session的方法整理
Aug 29 Python
matplotlib.pyplot画图并导出保存的实例
Dec 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
php中将一个对象保存到Session中的方法
2015/03/13 PHP
php短信接口代码
2016/05/13 PHP
PHP重定向与伪静态区别
2017/02/19 PHP
fancybox1.3.1 基于Jquery的插件在IE中图片显示问题
2010/10/01 Javascript
js和jquery中循环的退出和继续学习记录
2014/09/06 Javascript
Javascript 数组排序详解
2014/10/22 Javascript
jQuery+AJAX实现网页无刷新上传
2015/02/22 Javascript
javascript中setAttribute()函数使用方法及兼容性
2015/07/19 Javascript
jQuery实现的表头固定效果实例【附完整demo源码下载】
2016/08/01 Javascript
js实现移动端微信页面禁止字体放大
2017/02/16 Javascript
JavaScript中的this陷阱的最全收集并整理(没有之一)
2017/02/21 Javascript
一个简易时钟效果js实现代码
2020/03/25 Javascript
解决vue-router进行build无法正常显示路由页面的问题
2018/03/06 Javascript
JavaScript模板引擎原理与用法详解
2018/12/24 Javascript
在vue使用clipboard.js进行一键复制文本的实现示例
2019/01/15 Javascript
JavaScript实现HSL拾色器
2020/05/21 Javascript
如何利用JS将手机号中间四位变成*号
2020/09/29 Javascript
js中延迟加载和预加载的具体使用
2021/01/14 Javascript
Python创建日历实例
2014/08/21 Python
python list元素为tuple时的排序方法
2018/04/18 Python
python3将视频流保存为本地视频文件
2018/06/20 Python
深入浅析python变量加逗号,的含义
2020/02/22 Python
django迁移文件migrations的实现
2020/03/31 Python
pycharm中如何自定义设置通过“ctrl+滚轮”进行放大和缩小实现方法
2020/09/16 Python
HTML5 文件域+FileReader 分段读取文件并上传到服务器
2017/10/23 HTML / CSS
Urban Outfitters英国官网:美国平价服饰品牌
2016/11/25 全球购物
植物选择:Botanic Choice
2017/02/15 全球购物
师范生实习个人的自我评价
2013/09/28 职场文书
事业单位辞职信范文
2014/01/19 职场文书
中学生国旗下讲话稿
2014/04/26 职场文书
关于运动会的口号
2014/06/07 职场文书
居委会四风问题个人对照检查材料
2014/09/25 职场文书
php 获取音视频时长,PHP 利用getid3 获取音频文件时长等数据
2021/04/01 PHP
一看就懂的MySQL的聚簇索引及聚簇索引是如何长高的
2021/05/25 MySQL
MySQL去除重叠时间求时间差和的实现
2021/08/23 MySQL
python数字图像处理之图像的批量处理
2022/06/28 Python