地图文件示例
map7.txt
s#####bbb###########
#bb###bbb######bbb##
#bb###bbb######bbb##
######bbb######bbb##
######bbb###########
#bbb##bbb###########
#bbb##bbb###########
#bbb##bbb#bbbb######
#bbb##bbb#bbbb######
#bbb######bbbb######
##########bbbb######
####################
#####bbb###bbb#bbbb#
#####bbb###bbb#bbbb#
bbbb#######bbb#bbbb#
bbbb##bbb###########
######bbb#bb#####bbb
##########bb#####bbb
##########bb########
##########bb#######g
全部代码
import matplotlib.pyplot as plt
height = 0 # 行数
weight = 0 # 列数
start = (0, 0) # 起点
goal = (0, 0) # 终点
road = [] # 路坐标 数组
wall = [] # 墙坐标 数组
closeList = [] # close 数组
openList = [] # open 数组
dirt = {
} # 父子节点 字典
valuedistance = {
} # 与起点终点距离和 字典
finalList = [] # 最终路径 数组
map_name = 'map7.txt' # 地图文件
# 读取地图
def read_Map():
FILE_STORAGE_WAY = map_name
ifile = open(FILE_STORAGE_WAY, 'r') # 作为只读文件打开
global height, weight, start, goal # 声明全局变量
fileLine = ifile.readline() # 按行读
while len(fileLine) > 0:
weight = len(fileLine.split('\n')[0]) # 去除换行符
for i in range(0, weight):
if 's' == fileLine[i]: # 起点
start = (height, i)
road.append((height, i))
if 'g' == fileLine[i]: # 终点
goal = (height, i)
road.append((height, i))
if '#' == fileLine[i]: # 路
road.append((height, i))
if 'b' == fileLine[i]: # 墙
wall.append((height, i))
height += 1
fileLine = ifile.readline()
# 计算节点和终点的曼哈顿距离
def goal_distance(value):
# 计算在x、y轴的移动距离差
tmp = abs(abs(value[0] - goal[0]) - abs(value[1] - goal[1]))
if tmp == 0:
# 如果仅为斜向距离,斜方向移动距离单位为1.4
goal_distance = abs(value[0] - goal[0]) * 1.4
else:
# 如果为x或y轴距离+斜向距离
goal_distance = tmp + min(abs(value[0] - goal[0]), abs(value[1] - goal[1])) * 1.4
return goal_distance
# 通过递归父节点至起点, 计算节点与起点距离。(不能直接计算两点距离,中间有障碍物)
def start_distance(value):
father_value = dirt[value]
if abs(value[0] - father_value[0]) == 1 and abs(value[1] - father_value[1]): # 如果是斜距
start_distance = 1.4
else:
start_distance = 1
while father_value is not start: # 父节点不是起点
value = father_value
father_value = dirt[father_value]
if abs(value[0] - father_value[0]) == 1 and abs(value[1] - father_value[1]): # 如果是斜距
start_distance += 1.4
else:
start_distance += 1
return start_distance
# 实现 更新节点距离 功能
def change_father_value(value, new_value, dis):
# 领接节点不是当前节点 且领接节点在openList或closeList中
if new_value != dirt[value] and (new_value in openList or new_value in closeList):
value_distance = start_distance(value) + goal_distance(value)
new_value_distance = start_distance(new_value) + goal_distance(value)
if round(new_value_distance + dis, 1) < round