侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

python游戏地图最短路径求解

Python  /  管理员 发布于 7年前   140

一.题目要求

参考下图完成游戏地图中从起点到目标点的最短路径寻找问题。

 

二.设计思路

先对游戏地图做了几个设定,以矩阵来模拟游戏地图。将可行的区域位置赋值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()

五.运行结果

 

六.结果分析

由中间过程对应的矩阵可知,共经历了12次向外层扩展,第12次扩展即可将目标点包含进去。最短路径如the way对应的矩阵所示,是通过一种类似梯度下降的方法得到的。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


  • 上一条:
    python广度优先搜索得到两点间最短路径
    下一条:
    python调用百度地图WEB服务API获取地点对应坐标值
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在python语言中Flask框架的学习及简单功能示例(0个评论)
    • 在Python语言中实现GUI全屏倒计时代码示例(0个评论)
    • Python + zipfile库实现zip文件解压自动化脚本示例(0个评论)
    • python爬虫BeautifulSoup快速抓取网站图片(1个评论)
    • vscode 配置 python3开发环境的方法(0个评论)
    • 近期文章
    • 在windows10中升级go版本至1.24后LiteIDE的Ctrl+左击无法跳转问题解决方案(0个评论)
    • 智能合约Solidity学习CryptoZombie第四课:僵尸作战系统(0个评论)
    • 智能合约Solidity学习CryptoZombie第三课:组建僵尸军队(高级Solidity理论)(0个评论)
    • 智能合约Solidity学习CryptoZombie第二课:让你的僵尸猎食(0个评论)
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2018-04
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2022-01
    • 2023-07
    • 2023-10
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客