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之Python文档
Oct 10 Python
Python爬取Coursera课程资源的详细过程
Nov 04 Python
python连接远程ftp服务器并列出目录下文件的方法
Apr 01 Python
浅析Python中的for 循环
Jun 09 Python
python微信跳一跳游戏辅助代码解析
Jan 29 Python
Django框架实现的普通登录案例【使用POST方法】
May 15 Python
python脚本实现音频m4a格式转成MP3格式的实例代码
Oct 09 Python
Python 爬虫实现增加播客访问量的方法实现
Oct 31 Python
解决pandas展示数据输出时列名不能对齐的问题
Nov 18 Python
Python 操作 MySQL数据库
Sep 18 Python
怎么解决pycharm license Acti的方法
Oct 28 Python
python线程优先级队列知识点总结
Feb 28 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生成EAN_13标准条形码实例
2013/11/13 PHP
PHP翻页跳转功能实现方法
2020/11/30 PHP
网上应用的一个不错common.js脚本
2007/08/08 Javascript
jQuery 使用手册(七)
2009/09/23 Javascript
js实现格式化金额,字符,时间的方法
2015/02/26 Javascript
js实现的二分查找算法实例
2016/01/21 Javascript
JavaScript位移运算符(无符号) &gt;&gt;&gt; 三个大于号 的使用方法详解
2016/03/31 Javascript
NodeJS学习笔记之Module的简介
2017/03/24 NodeJs
9种使用Chrome Firefox 自带调试工具调试javascript技巧
2017/12/22 Javascript
vue watch监听对象及对应值的变化详解
2018/02/24 Javascript
js构建二叉树进行数值数组的去重与优化详解
2018/03/26 Javascript
详解javascript对数组和json数组的操作
2019/04/15 Javascript
微信小程序修改数组长度的问题的解决
2019/12/17 Javascript
Python 连连看连接算法
2008/11/22 Python
Python加pyGame实现的简单拼图游戏实例
2015/05/15 Python
一篇文章入门Python生态系统(Python新手入门指导)
2015/12/11 Python
python函数的5种参数详解
2017/02/24 Python
浅谈DataFrame和SparkSql取值误区
2018/06/09 Python
Python实现的各种常见分布算法示例
2018/12/13 Python
在python Numpy中求向量和矩阵的范数实例
2019/08/26 Python
win10子系统python开发环境准备及kenlm和nltk的使用教程
2019/10/14 Python
python元组和字典的内建函数实例详解
2019/10/22 Python
浅谈keras中的keras.utils.to_categorical用法
2020/07/02 Python
全球速卖通西班牙站:AliExpress西班牙
2017/10/30 全球购物
购买美国制造的相框和画框架:Picture Frames
2018/08/14 全球购物
美国亚马逊旗下男装网站:East Dane(支持中文)
2019/09/25 全球购物
Hotels.com泰国:酒店预订网站
2019/11/20 全球购物
马智宇结婚主持词
2014/04/01 职场文书
报到证办理个人委托书
2014/10/06 职场文书
2015年银行员工工作总结
2015/04/24 职场文书
故意伤害辩护词
2015/05/21 职场文书
热血教师观后感
2015/06/10 职场文书
学术研讨会主持词
2015/07/04 职场文书
2016大学生求职自荐信范文
2016/01/28 职场文书
创业计划书之密室逃脱
2019/11/08 职场文书
Go语言空白表示符_的实例用法
2021/07/04 Golang