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线程的两种编程方式
Apr 14 Python
python爬虫入门教程--正则表达式完全指南(五)
May 25 Python
python 简单的绘图工具turtle使用详解
Jun 21 Python
Python人脸识别初探
Dec 21 Python
python操作excel的包(openpyxl、xlsxwriter)
Jun 11 Python
用Python PIL实现几个简单的图片特效
Jan 18 Python
Python2 Selenium元素定位的实现(8种)
Feb 25 Python
Python实现打砖块小游戏代码实例
May 18 Python
Django外键(ForeignKey)操作以及related_name的作用详解
Jul 29 Python
Python socket模块方法实现详解
Nov 05 Python
重构Python代码的六个实例
Nov 25 Python
python+openCV对视频进行截取的实现
Nov 27 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
模板引擎Smarty深入浅出介绍
2006/12/06 PHP
php共享内存段示例分享
2014/01/20 PHP
php for 循环使用的简单实例
2016/06/02 PHP
php中__toString()方法用法示例
2016/12/07 PHP
thinkPHP实现签到功能的方法
2017/03/15 PHP
laravel 实现用户登录注销并限制功能
2019/10/24 PHP
javascript 获取图片颜色
2009/04/05 Javascript
jquery 表单取值常用代码
2009/12/22 Javascript
jQuery学习笔记之jQuery.extend(),jQuery.fn.extend()分析
2014/06/09 Javascript
省市区三级联动下拉框菜单javascript版
2015/08/11 Javascript
JavaScript简单实现弹出拖拽窗口(一)
2016/06/17 Javascript
Node.js DES加密的简单实现
2016/07/07 Javascript
微信小程序的分类页面制作
2017/06/27 Javascript
Vue ElementUI之Form表单验证遇到的问题
2017/08/21 Javascript
如何实现一个webpack模块解析器
2018/10/24 Javascript
vue路由前进后退动画效果的实现代码
2018/12/10 Javascript
如何在Vue中抽离接口配置文件
2019/10/31 Javascript
JS实现滑动拼图验证功能完整示例
2020/03/29 Javascript
从0搭建vue-cli4脚手架
2020/06/17 Javascript
关于vue 项目中浏览器跨域的配置问题
2020/11/10 Javascript
vue 实现基础组件的自动化全局注册
2020/12/25 Vue.js
win系统下为Python3.5安装flask-mongoengine 库
2016/12/20 Python
Python 机器学习库 NumPy入门教程
2018/04/19 Python
python爬虫 批量下载zabbix文档代码实例
2019/08/21 Python
深入浅析Python 中的sklearn模型选择
2019/10/12 Python
Python lxml模块的基本使用方法分析
2019/12/21 Python
html5文本内容_动力节点Java学院整理
2017/07/11 HTML / CSS
HTML5+CSS3实现机器猫
2016/10/17 HTML / CSS
瑞士国际航空官网:SWISS
2016/07/21 全球购物
党员公开承诺践诺书
2014/03/25 职场文书
承诺书怎么写
2014/03/26 职场文书
入党综合考察材料
2014/06/02 职场文书
党的群众路线教育实践活动实施方案
2014/10/31 职场文书
2014年职称评定工作总结
2014/11/26 职场文书
部门经理助理岗位职责
2015/04/13 职场文书
农村婚庆主持词
2015/06/29 职场文书