Python使用A*算法实现路径规划,可自主设置起点终点和路径障碍,并用pugame输出
时间: 2024-03-21 18:42:15 浏览: 103
好的,让我来解答你的问题。首先,A*算法是一种启发式搜索算法,可用于求解最短路径问题。其基本思想是:在搜索过程中,通过启发式函数估计每个节点到目标节点的距离,从而选择最优的节点进行扩展,直到达到目标节点。
下面是一个Python实现A*算法的示例代码:
```python
import heapq
def heuristic(a, b):
# 计算启发式函数,这里使用曼哈顿距离
return abs(a[0] - b[0]) + abs(a[1] - b[1])
def astar(array, start, goal):
# 初始化起点和终点
neighbors = [(0,1),(0,-1),(1,0),(-1,0),(1,1),(1,-1),(-1,1),(-1,-1)]
close_set = set()
came_from = {}
gscore = {start:0}
fscore = {start:heuristic(start, goal)}
oheap = []
heapq.heappush(oheap, (fscore[start], start))
while oheap:
current = heapq.heappop(oheap)[1]
if current == goal:
data = []
while current in came_from:
data.append(current)
current = came_from[current]
return data[::-1]
close_set.add(current)
for i, j in neighbors:
neighbor = current[0] + i, current[1] + j
tentative_g_score = gscore[current] + heuristic(current, neighbor)
if 0 <= neighbor[0] < array.shape[0]:
if 0 <= neighbor[1] < array.shape[1]:
if array[neighbor[0]][neighbor[1]] == 1:
continue
else:
# 超出边界
continue
else:
# 超出边界
continue
if neighbor in close_set and tentative_g_score >= gscore.get(neighbor, 0):
continue
if tentative_g_score < gscore.get(neighbor, 0) or neighbor not in [i[1]for i in oheap]:
came_from[neighbor] = current
gscore[neighbor] = tentative_g_score
fscore[neighbor] = tentative_g_score + heuristic(neighbor, goal)
heapq.heappush(oheap, (fscore[neighbor], neighbor))
return None
# 主程序
import pygame as pg
import numpy as np
# 设置常量
WIDTH, HEIGHT = 640, 480
TILESIZE = 20
FPS = 30
# 初始化pygame
pg.init()
screen = pg.display.set_mode((WIDTH, HEIGHT))
clock = pg.time.Clock()
# 设置颜色
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
GREEN = (0, 255, 0)
RED = (255, 0, 0)
BLUE = (0, 0, 255)
# 设置地图
maze = np.zeros((int(HEIGHT/TILESIZE), int(WIDTH/TILESIZE)))
# 设置起点和终点
start = (int(np.random.randint(0, int(WIDTH/TILESIZE)-1)), int(np.random.randint(0, int(HEIGHT/TILESIZE)-1)))
goal = (int(np.random.randint(0, int(WIDTH/TILESIZE)-1)), int(np.random.randint(0, int(HEIGHT/TILESIZE)-1)))
# 设置障碍
for i in range(np.random.randint(50, 100)):
x = int(np.random.randint(0, int(WIDTH/TILESIZE)-1))
y = int(np.random.randint(0, int(HEIGHT/TILESIZE)-1))
if (x, y) != start and (x, y) != goal:
maze[y][x] = 1
# 运行A*算法
path = astar(maze, start, goal)
print(path)
# 绘制地图
def draw_grid():
for x in range(0, WIDTH, TILESIZE):
pg.draw.line(screen, WHITE, (x, 0), (x, HEIGHT))
for y in range(0, HEIGHT, TILESIZE):
pg.draw.line(screen, WHITE, (0, y), (WIDTH, y))
def draw_maze():
for i in range(maze.shape[0]):
for j in range(maze.shape[1]):
if maze[i][j] == 1:
pg.draw.rect(screen, RED, (j*TILESIZE, i*TILESIZE, TILESIZE, TILESIZE))
def draw_path():
for i in range(len(path)-1):
pg.draw.line(screen, BLUE, (path[i][0]*TILESIZE+TILESIZE/2, path[i][1]*TILESIZE+TILESIZE/2), (path[i+1][0]*TILESIZE+TILESIZE/2, path[i+1][1]*TILESIZE+TILESIZE/2), 5)
def draw_start_end():
pg.draw.rect(screen, GREEN, (start[0]*TILESIZE, start[1]*TILESIZE, TILESIZE, TILESIZE))
pg.draw.rect(screen, GREEN, (goal[0]*TILESIZE, goal[1]*TILESIZE, TILESIZE, TILESIZE))
# 主循环
running = True
while running:
# 事件处理
for event in pg.event.get():
if event.type == pg.QUIT:
running = False
# 绘制地图
screen.fill(BLACK)
draw_grid()
draw_maze()
draw_path()
draw_start_end()
# 刷新屏幕
pg.display.flip()
clock.tick(FPS)
# 退出pygame
pg.quit()
```
这段代码实现了以下功能:
1. 生成一个随机的地图,包括起点、终点和障碍;
2. 使用A*算法求解起点到终点的最短路径;
3. 使用Pygame绘制地图和路径。
你可以将这段代码保存为一个Python文件并运行它,然后就可以看到A*算法求解的最短路径了。注意,这段代码中使用了NumPy和Pygame库,你需要先安装这两个库才能运行代码。
希望我的回答能够帮到你!
阅读全文
相关推荐















