python使用tkinter实现a星寻路可视化

A星寻路算法详解(C++实现 完整代码+图片演示 ) A星寻路算法 最小代价点,入树,保存容器,当前点移动到最小代价的点,删除最小代价点,以当前点的位置和终点比较来看是否到达了终点。地图行列数,方向枚举,地图,辅助地图的设计等在此不描述,具体请看之前我写的前两种寻路算法的博客。(如何计算:数格子即可,某个点到终点的格子数,只能行列,不能斜着),此代价为。,用于判断地图某个点是否能走,即不为墙,没越界,没走过,则能走。(即是代价最小点,但是这个点是死胡同),... 阅读详情

python使用tkinter实现a星寻路可视化

  • 运行结果
    • 在这里插入图片描述
  • A*寻路的核心公式是:F = G + H(我们的目标主要是计算F)
    • G代表当前点走到下一个点需要的代价
    • H代表下一个点到终点的距离
    • F代表这一操作需要的总的代价
  • A*寻路的两个核心列表
    • open_list: 该列表用来存放当前需要计算的点
    • close_list: 该列表用来存放过去已经计算过的点
  • A*寻路核心变量解释
    • base_point: 存放当前循环正在处理的基础点(每次循环处理都会让这个变量进行更新,且处理完后就把base_point这个变量追加进close_list列表里)

A*寻路的大致过程

循环概述

  1. 确定base_point
  2. 更新open_list列表
  3. 找到open_list列表代价F最小的点
  4. 把base_point追加进close_list列表里
  5. 下一次循环的base_point就是这次计算出来代价F最小的点
  6. 循环结束的条件是open_list为空或者已经找到了目标点(为空退出循环意味着没找到目标,坐标点被死路密封住了)

一步步流程的大致解释

  • 起点:绿色的那个点(1,4)
  • 目标点:黄色的星星(5,1)
  • 在这里插入图片描述

  • 开始寻路循环
  • base_point现在代表的是起点(1,4)
    • 以base_point生成A,B,C,D四个点,并把这四个点追加进open_list列表里,把起点放入close_list列表
      • 此时
        • open_list: [A点,B点,C点,D点]
        • close_list:[起点,]
  • 开始计算open_list列表里的点的F(代价值)
    • 因为 A.G:走到A点的代价G为1(这个G是自己定义的,我把每个格子走一步所花费的代价G均定义为1)
    • 因为 A.H:A点到终点的距离为√20
      • 两点间的距离公式:√((x1 - x2)² + (y1 - y2)²)
    • 所以 A.F:G + H 得出F为√20 + 1
    • 以此类推
      • B.F : √34 + 1
      • C.F : √32 + 1
      • D.F : √18 + 1
    • 该次处理结果得出D点的F是最小的,所以我们把D点当作下一次循环的base_point

  • 第一轮循环结束了,开始第二轮操作
  • 因为刚才得到D.F属于最小的,所以接下来就以D点为基础点生成下一步能走的点E(2,3)、F(2,5)这两个点,并把这两个点追加进open_list,然后把D点追加进close_list
    • 此时
      • base_point: D点
      • open_list: [A点,B点,C点,E点,F点]
      • close_list: [起点,D点]
  • 在这里插入图片描述
  • 根据之前的计算规则计算出
    • E.F:√13 + 1
    • F.F:√25 + 1
  • 此时
    • open_list: [A点,B点,C点,E点,F点]
    • 因为E点的总代价F在open_list里是最小的,下一次循环的base_point = E

  • 第二轮循环结束了,开始第三轮操作

  • 在这里插入图片描述

  • 此时

    • base_point: E点
    • open_list: [A点,B点,C点,F点,G点]
    • close_list: [起点,D点,E点]
  • G.F = √10 + 1,由此得到G是open_list里F最小的点


  • 然后按照这个思路就得到
  • 在这里插入图片描述

用python代码可视化a*寻路

  • A*寻路的核心代码AStar.py

  • GameManager.py负责可视化寻路(运行这个脚本,记住让其他脚本与这个脚本保持在同一个目录)

    • 方向键控制主角移动
    • 空格键刷新地图
    • a按键往地图追加一个障碍物
  • MapPoint.py用来生成地图的单个点

  • FreePoint.py用来生成玩家或目标

  • GameMap.py用来生成整个地图

python代码

GameManager.py
import threading
import tkinter
import time

from AStar import a_star
from FreePoint import FreePoint
from GameMap import GameMap
from MapPoint import MapPoint


class GameManager:
    def __init__(self):
        self.win = None
        self.canvas = None
        self.point_type_dict = {
            'player': ('circle', 'green'),
            'obstacle': ('square', 'black'),
            'AI': ('circle', 'yellow'),
            'path': ('square', 'skyblue'),
        }
        self.player = None
        self.AI = None
        self.key_list = []
        self.key_mapping = {
            38: 'up',
            40: 'down',
            37: 'left',
            39: 'right',
            32: 'restore_map',
            65: 'add_obstacle',
        }
        self.game_loop = True
        self.path_list = []
        self.width = 25
        self.height = 25
        self.game_map = GameMap(width=self.width, height=self.height)

    def start(self):
        # 创建窗口画背景
        self.create_win()
        self.draw_bg()
        # 创建玩家和AI且画出来
        self.player = FreePoint(x=22, y=9)
        self.AI = FreePoint(x=0, y=0)
        self.draw_point(self.point_type_dict['player'], self.player.get_coordinate(), 'player')
        self.draw_point(self.point_type_dict['AI'], self.AI.get_coordinate(), 'AI')
        # 初始化地图坐标讯息
        self.game_map.restore_map()
        # 生成随即障碍物
        obstacle_count = 100
        self.game_map.create_random_obstacle(self.get_occupied_points(), obstacle_count)
        # 画障碍
        self.draw_obstacle()
        # 画路径
        self.draw_path(self.AI.get_coordinate(), self.player.get_coordinate())
        # 监听键盘消息
        self.win.bind('<Key>', self.listen_key_board)
        # 开启画面循环更新线程
        t = threading.Thread(target=self.update_canvas)
        t.setDaemon(True)  # 设置为守护线程,也就退出程序时,关闭该线程
        t.start()

        self.win.protocol("WM_DELETE_WINDOW", self.close_game)  # 关闭窗口时触发

        # 窗口主循环
        self.win.mainloop()

    def create_win(self):
        if not self.win:
            self.win = tkinter.Tk()
            self.win.wm_title("测试")  # 窗口标题
            self.win.geometry("1000x600")  # 窗口大小
            self.win.update()

    # 画背景
    def draw_bg(self):
        if not self.canvas:
            self.canvas = tkinter.Canvas(self.win, width=520, height=520, bg='pink')
            self.canvas.place(x=int((self.win.winfo_width() - int(self.canvas.cget('width'))) // 2), y=int((self.win.winfo_height() - int(self.canvas.cget('height'))) // 2))
            # 画格子,一共25 * 25个格子(20单位一格)
            for x in range(self.width + 1):
                self.canvas.create_line(10, x * 20 + 10, 510, x * 20 + 10)  # 横线26条
                self.canvas.create_line(x * 20 + 10, 10, x * 20 + 10, 510)  # 

    # 根据坐标信息描绘点
    def draw_point(self, point_type, coordinate, tag):
        if point_type[0] == 'circle':
            self.canvas.create_oval(10 + coordinate[0] * 20, 10 + coordinate[1] * 20, 30 + coordinate[0] * 20, 30 + coordinate[1] * 20, fill=point_type[1], tags=tag)
        elif point_type[0] == 'square':
            self.canvas.create_rectangle(10 + coordinate[0] * 20, 10 + coordinate[1] * 20, 30 + coordinate[0] * 20, 30 + coordinate[1] * 20, fill=point_type[1], tags=tag)

    # 键盘监听
    def listen_key_board(self, key):
        self.key_list = []
        self.key_list.append(self.key_mapping.get(key.keycode))

    # 更新画布
    def update_canvas(self):
        while self.game_loop:
            command = None
            if self.key_list:
                command = self.key_list.pop(0)
            if command:
                if command == 'restore_map':
                    # 清理已有路径和障碍
                    self.clear_path()
                    self.clear_obstacle()
                    # 还原地图数据
                    self.game_map.obstacle_set.clear()
                    self.game_map.restore_map()
                    # 重画障碍和路径
                    self.game_map.create_random_obstacle(self.get_occupied_points(), 100)
                    self.draw_obstacle()
                    self.draw_path(self.AI.get_coordinate(), self.player.get_coordinate())
                elif command == 'add_obstacle':
                    self.clear_path()
                    # 新增一个随机障碍
                    point = self.game_map.create_random_obstacle(self.get_occupied_points(), 1)
                    self.draw_point(self.point_type_dict['obstacle'], point, 'obstacle')
                    self.draw_path(self.AI.get_coordinate(), self.player.get_coordinate())
                else:
                    check_point = self.player.check_move(command)
                    # 检测将要移动的点是否是障碍物或者是否出界
                    if check_point not in self.game_map.obstacle_set and not self.check_out(check_point):
                        self.player.move(command)
                        self.canvas.delete("player")
                        self.draw_point(self.point_type_dict['player'], self.player.get_coordinate(), 'player')
                        self.draw_path(self.AI.get_coordinate(), self.player.get_coordinate())
            time.sleep(0.01)

    # 获取占用点列表
    def get_occupied_points(self):
        occupied_points = (self.AI.get_coordinate(), self.player.get_coordinate())
        return occupied_points

    # 画障碍
    def draw_obstacle(self):
        for point in self.game_map.obstacle_set:
            self.draw_point(self.point_type_dict['obstacle'], point, 'obstacle')

    # 清除障碍
    def clear_obstacle(self):
        self.canvas.delete('obstacle')

    # 获取最新路径
    def draw_path(self, start, end):
        # 检测起点和终点是否在地图
        if start in self.game_map.map and end in self.game_map.map:
            # 使用A星寻路获取路径
            start_time = time.time()
            result_path = a_star(start, end, self.game_map.map)

            # 获取玩家对AI的寻路
            result_path_two = a_star(end, start, self.game_map.map)

            if len(result_path_two) < len(result_path):
                result_path = result_path_two

            # 若存在路径
            if result_path:
                self.path_list = result_path
                self.canvas.delete('path')
                for point in result_path[:-1]:
                    self.draw_point(self.point_type_dict['path'], point, 'path')

    # 清除路径
    def clear_path(self):
        self.canvas.delete('path')
        self.path_list = []

    # 检测坐标点是否出界
    def check_out(self, point):
        return point[0] < 0 or point[0] >= self.width or point[1] < 0 or point[1] >= self.height

    # 关闭程序
    def close_game(self):
        self.game_loop = False
        self.win.destroy()


def main():
    game_manager = GameManager()
    game_manager.start()


if __name__ == '__main__':
    main()

AStar.py
import copy
import random


def a_star(start, end, raw_map_point_dict, calculate_count=1):
    # 计算次数
    calculate_count = max(calculate_count, 1)
    for _ in range(calculate_count):
        pass
    map_point_dict = copy.deepcopy(raw_map_point_dict)
    # 建立open集合和close集合
    open_dict = {}
    close_dict = {}
    # 初始化地图起点
    map_point_dict[start].G = 0
    map_point_dict[start].H = get_H(start, end)
    map_point_dict[start].F = map_point_dict[start].G + map_point_dict[start].H
    # 把起点加紧open集合里
    open_dict[start] = map_point_dict[start].F
    # open为空时退结束循环
    is_find_end = False
    while open_dict and not is_find_end:
        # 找出F代价最小的作为基点
        base_point = list(list(open_dict.items())[0])
        ''' 随机找法 '''
        equal_list = []
        for key, value in open_dict.items():
            if value < base_point[1]:
                base_point[0] = key
                base_point[1] = value

                equal_list = [base_point]
            elif value == base_point[1]:
                equal_list.append((key, value))
        if equal_list:
            random.shuffle(equal_list)
            base_point = equal_list[0]
        ''' 固定顺序找法 '''
        # for key, value in open_dict.items():
        #     if value < base_point[1]:
        #         base_point[0] = key
        #         base_point[1] = value

        # print(base_point)
        # 把选出来的基点从open集合里去掉
        del open_dict[base_point[0]]
        # 获取基点相邻点坐标
        neighbor_list = []
        neighbor_list.append(('up', (base_point[0][0], base_point[0][1] - 1)))
        neighbor_list.append(('down', (base_point[0][0], base_point[0][1] + 1)))
        neighbor_list.append(('left', (base_point[0][0] - 1, base_point[0][1])))
        neighbor_list.append(('right', (base_point[0][0] + 1, base_point[0][1])))

        # 遍历相邻点(即处理相邻点)
        for key, value in neighbor_list:
            # 超出限定值
            if value[0] < 0 or value[0] > 24 or value[1] < 0 or value[1] > 24:
                continue
            # 判定为障碍物
            if map_point_dict[value].is_obstacle:
                continue
            # 判定该点是否已经在close里,即已经计算过的点
            if value in close_dict:
                continue
            # 判定该点是否已经在open里
            elif value in open_dict:
                new_G = map_point_dict[value].G + map_point_dict[value].neighbor_cost[key]
                if map_point_dict[value].G > new_G:
                    map_point_dict[value].parent_point.append(base_point[0])
                    map_point_dict[value].G = new_G
                    map_point_dict[value].F = new_G + map_point_dict[value].H
            else:
                map_point_dict[value].parent_point.append(base_point[0])
                map_point_dict[value].G = 0 + map_point_dict[value].neighbor_cost[key]
                map_point_dict[value].H = get_H(value, end)
                map_point_dict[value].F = map_point_dict[value].G + map_point_dict[value].H
                open_dict[value] = map_point_dict[value].F
                # 判定是否找到终点
                if value == end:
                    is_find_end = True

        close_dict[base_point[0]] = base_point[1]

    if is_find_end:
        result_path = get_path(start, end, map_point_dict)
        return result_path
    else:
        return []

# 计算终点代价
def get_H(start, end):
    # 计算两点间的距离
    distance = ((start[0] - end[0]) ** 2 + (start[1] - end[1]) ** 2) ** 0.5
    return distance

# 获取路径列表
def get_path(start, end, map_point_dict):
    result_path = []
    result_path.append(end)
    current_point = map_point_dict[end].get_parent()
    while current_point != start:
        result_path.append(current_point)
        current_point = map_point_dict[current_point].get_parent()

    result_path.reverse()
    return result_path


if __name__ == '__main__':
    from MapPoint import MapPoint
    # 建立地图点25 * 25 (0 ~ 24)
    map_point_dict = {}
    for x in range(25):
        for y in range(25):
            map_point_dict[(x, y)] = MapPoint(x=x, y=y)
    # 输入起点和终点
    start = (0, 0)
    end = (22, 9)
    print(a_star(start, end, map_point_dict))

MapPoint.py


class MapPoint:
    def __init__(self, **kwargs):
        self.x = kwargs.get('x', 0)
        self.y = kwargs.get('y', 0)
        self.F = kwargs.get('F')
        self.G = kwargs.get('G')
        self.H = kwargs.get('H')
        self.parent_point = []
        self.is_obstacle = False
        self.neighbor_cost = {}
        self.neighbor_cost['up'] = self.neighbor_cost['down'] = self.neighbor_cost['left'] = self.neighbor_cost['right'] = 1
        self.neighbor_cost['ul'] = self.neighbor_cost['ur'] = self.neighbor_cost['dl'] = self.neighbor_cost['dr'] = 1.414

    def set_neighbor_cost(self, direct, value):
        self.neighbor_cost[direct] = value

    def get_coordinate(self):
        return self.x, self.y

    def get_parent(self):
        return self.parent_point.pop() if self.parent_point else None


if __name__ == '__main__':
    # 建立地图点25 * 25 (0 ~ 24)
    map_point_dict = {}
    for x in range(25):
        for y in range(25):
            map_point_dict[(x, y)] = MapPoint(x=x, y=y)
    # print(map_point_dict)

GameMap.py
import copy
import random

from MapPoint import MapPoint


class GameMap:
    def __init__(self, **kwargs):
        self.width = kwargs.get('width', 0)
        self.height = kwargs.get('height', 0)
        self.raw_map = {}
        self.map = {}
        self.obstacle_set = set()

        self.init_map()

    def init_map(self):
        for x in range(self.width):
            for y in range(self.height):
                self.raw_map[(x, y)] = MapPoint(x=x, y=y)

    def restore_map(self):
        self.map = copy.deepcopy(self.raw_map)
        for point in self.obstacle_set:
            self.map[point].is_obstacle = True
        # self.obstacle_set.clear()

    def create_random_obstacle(self, occupied_points, create_num):
        map_list = []
        for point in self.map.keys():
            if point not in occupied_points and not self.map[point].is_obstacle:
                map_list.append(point)
        create_num = min(create_num, len(map_list))
        for _ in range(create_num):
            point = map_list.pop(random.choice(range(len(map_list))))
            self.map[point].is_obstacle = True
            self.obstacle_set.add(point)
        return point

    def clear_obstacle(self):
        while self.obstacle_set:
            self.map[self.obstacle_set.pop()].is_obstacle = False

    def delete_obstacle(self, points):
        for point in points:
            self.map[point].is_obstacle = False
            if point in self.obstacle_set:
                self.obstacle_set.remove(point)
        return self.obstacle_set


if __name__ == '__main__':
    GameMap(width=10, height=10).restore_map()

FreePoint.py


class FreePoint:
    def __init__(self, **kwargs):
        self.x = kwargs.get('x', 0)
        self.y = kwargs.get('y', 0)
        self.step = kwargs.get('step', 1)
        self.speed = kwargs.get('speed', 1)

    def move(self, direct):
        if direct == 'up':
            self.y -= self.step * self.speed
        elif direct == 'down':
            self.y += self.step * self.speed
        elif direct == 'left':
            self.x -= self.step * self.speed
        elif direct == 'right':
            self.x += self.step * self.speed

    def check_move(self, direct):
        x = self.x
        y = self.y
        if direct == 'up':
            y = self.y - self.step * self.speed
        elif direct == 'down':
            y = self.y + self.step * self.speed
        elif direct == 'left':
            x = self.x - self.step * self.speed
        elif direct == 'right':
            x = self.x + self.step * self.speed
        return x, y

    def set_speed(self, num):
        self.speed = num

    def get_coordinate(self):
        return self.x, self.y


if __name__ == '__main__':
    test_point = FreePoint(x=2, y=3, step=2, speed=4)
    print((test_point.x, test_point.y), test_point.step, test_point.speed)

代码大致解释

  • FreePoint.py
    • x坐标
    • y坐标
    • step
    • speed
    • move()
      • up: y - step * speed
      • down: y + step * speed
      • left: x - step * speed
      • right: x + step * speed
  • MapPoint.py
    • x坐标
    • y坐标
    • F # F = G + H
    • G
    • H
    • parent_point # 该点的父亲坐标点
    • is_obstacle # 障碍物标识
    • neighbor_cost # 邻近格子的代价
    •   # 默认初始直线代价为1,斜线代价为1.414
        neighbor_cost = {}
        neighbor_cost['up'] = neighbor_cost['down'] = neighbor_cost['left'] = neighbor_cost['right'] = 1
        neighbor_cost['ul'] = neighbor_cost['ur'] = neighbor_cost['dl'] = neighbor_cost['dr'] = 1.414
      
  • GameManager.py
    1. 生成窗口
    2. 在窗口里画背景
    3. 输入start和end且实例化FreePoint
    4. 画点
    5. 监听键盘消息取得消息队列
    6. 画面更新循环
      • 循环退出条件:游戏结束Flag
      1. pop出键盘消息队列
      2. 判断更新Flag
        • True:
          • FreePoint响应消息更新x, y
          • 根据待画列表画出点
          • 清除上一帧多余画点数据
  • AStar.py
    • 输入:起点 目标点 地图点信息
    • 输出:A*寻路的路径坐标列表

总结

关于我写的这个A星算法还是可以考虑下进一步的优化。
我的文底有限,关于A*寻路的原理也可以看下这一篇文章A星寻论算法解读

游戏地图寻路算法 -- A*(分析 + 实现 + 教学视频连接) 首先理解游戏地图怎么设定那里不让走那里让走: 把图片分成一块一块格子,标记各个格子是否能走; 介绍一下A* A*的核心就是 : 一个评估函数 F = G + H + 2个表假设 从A点到B点: F = G + H: - F: 从A到B的最短路径长度; - G: 从起点,沿着产生的路径, 移动到指定点的耗费; - H: 预估值,估计从A到B多长 阅读详情

相关推荐

基于Matiplotlib的可视化栅格图路径规划项目(A*、JPS、DA*、Dijkstra、BFS、DFS等)

** Path_planning_of_animation ** TODO(刚开始的思路): 迷宫生成器(mazeGenerator.py): func1: 制作一个n*m的矩阵 func2: 阔以通过鼠标设置起点和终点 func3: 阔以通过鼠标来设置和清除障碍物 寻路测试器(pathAnalyzer.py): func1: 包含迷宫生成器 func2: 阔以设置寻路算法 func3: 根据算法模拟寻路过程,并且进行算法分析 路径规划算法集合(ppa.py): contains: Dijkstra BFS

souldoms的博客 1073

【A星算法】A星A*寻路算法详解(小白一看就懂+C#代码+零基础学习A*)

【A星算法】A星A*寻路算法详解(小白一看就懂+C#代码+零基础学习A*)

qq_58047420的博客 1万+

Python实现A*寻路算法

算法评估每个节点的代价,这个代价包括起点到该节点的实际距离和从该节点到终点的估计距离。通过评估所有节点的代价,A*算法可以找到最小代价的路径。该代码输出的结果为[(0, 0), (1, 1), (2, 2), (3, 3), (4, 4)],表示寻找到的最佳路径。其中get_neighbors函数用于获取当前节点的相邻节点,get_distance函数用于计算两个节点之间的距离。其中f表示节点的总代价,parent表示当前节点的父节点,is_obstacle表示该节点是否为障碍物。

带你成为别人眼中的大佬! 1285

寻路算法 --- A星寻路算法

深度寻路算法应用场景 仅用于空旷地形,小游戏或者大游戏的某个小模块,点击地图,人物一步步试探 广度寻路算法应用场景 只适用于小地图,回合制的走格子游戏,上帝视角,在走之前已经把路都找出来了 A* 寻路算法应用场景 应用场景广泛 RPG游戏:为什么小兵追着人物砍?怎么样知道人物在哪?怎么样给它自动规划路径?人物自动跑图,怎么实现? 通过A星算法实现 以A星为基础的寻路算法:遗传算法,蚁群算法. . . A星寻路算法排除了广度的劣势:循环比较多,每一个点都要涉及到,集合了深度的思想实现..

weixin_60569662的博客 1万+

双击即玩的迷宫自动寻路工具:带手绘编辑、BFS最短路径高亮和个性化设置

不用装Python,Windows电脑上双击就能运行的迷宫解谜小工具。支持鼠标点选绘制迷宫、一键生成随机地图,内置BFS广度优先算法实时计算并高亮显示从起点到终点的最短路径。界面清爽直观,可自由调整格子尺寸、背景色和路径颜色,所有配置通过settings文件修改。压缩包里已打包好exe可执行文件,还附带完整源码(main.py为主程序)、资源文件夹(asset)、源码目录(src)和依赖安装脚本(安装第三方包.cmd),配合requirements.txt和使用说明.txt,新手也能快速上手。适合想动手理解

5f4d3s2a1q的博客 225

A星寻路算法之45度地图

经典寻路算法,需要的朋友们,欢迎下载喔

A星寻路算法在游戏开发中的实现与跨平台迁移指南

A星(A*)算法是一种经典的启发式搜索算法,通过评估函数F=G+H(实际代价+预估代价)来寻找最优路径。其核心原理是在网格地图中智能探索可能路径,避开障碍物,特别适合游戏开发中的自动寻路需求。该算法的技术价值在于平衡了搜索效率与路径质量,能够有效解决复杂地形下的导航问题。在复古传奇类游戏、996手游等应用场景中,A星算法支持八方向移动、自动绕障等高级功能,为玩家提供流畅的游戏体验。本文基于易语言、Python等开发环境,详细解析A星寻路的实现细节、性能优化方法以及跨平台迁移方案,帮助开发者快速掌握这一关键技

weixin_34008805的博客 412

Cesium创建无人机视锥,同步视锥与鹰眼地图视角,实现视锥键盘控制。解决视锥初始化位置不准确问题等

本文描述了一个基于Cesium的3D视锥体可视化系统开发过程。系统实现了主视图与鹰眼视图的双屏联动,支持通过键盘控制视锥体的空间移动(WASD前后左右,Q/E旋转,C/Z升降),并实时同步更新两个视图。关键技术包括:1)基于主视图Scene创建Camera实现视锥体精确绘制;2)通过PerspectiveFrustum设置视锥参数;3)建立双视图的相机位置及视角同步机制。目前暂未实现视锥体far/near边界在鹰眼视图中的可视化,该系统可应用于无人机视角监控等三维场景交互需求。

coder_bin的博客 1590

A*算法python可视化实现

A*算法python简单实现 A*算法详解: A*算法详解 python实现: 因为重在算法的实现,直接使用字典存储openlist和closelist,这里是开销最多的地方 (一)使用方法: 鼠标左键单击方格添加/删除障碍物,中键重置路径(不改变障碍物),右键开始寻路 (二)代码: # -*- coding: utf-8 -*- from tkinter import * import enum import time import _thread class PointState(enum.

Nomuo的博客 6204

Delphi 12社区版免费了!手把手教你搭建跨平台开发环境(Windows/macOS/Android/iOS)

本文详细介绍了如何利用新发布的Delphi 12社区版,免费搭建支持Windows、macOS、Android和iOS的跨平台开发环境。内容涵盖从环境准备、安装、配置各平台SDK(包括Android与macOS/iOS的PAServer连接),到创建首个FireMonkey跨平台应用、集成数据库以及调试部署的完整实战流程,帮助开发者零成本启动高效开发。

butter的博客 975

PTGui使用教程

PTGui使用教程为啥使用ptgui开始使用ptgui 为啥使用ptgui ptgui是一个全景拼接软件,在海思hi3559上做视频拼接的时候,需要拼接参数,这是就需要使用到ptgui,这里可以在该网站下下载ptgui:下载地址 开始使用ptgui 第一步,加载图片,我这里添加了三幅图 然后添加控制点(可以先多对准几次图像,这样会自动生成一些控制点,但是不保证准确),建议控制点不要太密集 点开镜头设置,勾选以下几个选项以及配置好镜头类型,如下图 点开优化器,在高级界面中配置如下参数,最后点

what_wrong的博客 1万+

DQN实现走迷宫tkinter编写环境:深度强化学习在迷宫寻路中的高效应用

DQN实现走迷宫tkinter编写环境:深度强化学习在迷宫寻路中的高效应用 去发现同类优质开源项目:https://gitcode.com/ 项目简介 DQN实现走迷宫tkinter编写环境,是一个结合了深度学习与迷宫自动寻路技术的Python项目。它利用TensorFlow框架,通过DQN(深度Q网络)算法,让智能体在迷宫中自动寻找到出路。项目采用tkinter编写环境,提供了直观的可视化界面,...

gitblog_06775的博客 1032

uniapp微信小程序 - 详解map地图markers图标不显示问题,自定义图标真机调试不显示变成默认marker标记点图标(解决微信小程序map组件markers自定义图标失效,兼容安卓苹果手机)

uniapp微信小程序 map地图markers图标不显示,markers图标真机调试不显示,uniapp map地图显示图标markers问题,自定义图标不显示,添加marker后不显示,uniapp 微信小程序 map marker图标不显示如何解决,uniapp小程序地图的marker图标不显示问题,微信小程序map组件markers自定义图标真机显示问题,uni-app, 微信小程序, map组件, markers图标不显示, 真机调试, 微信小程序map组件,地图加载后marker标记点ios设备

🏆 前端领域优质创作者 2912

python迷宫寻路_Python3 A*寻路算法实现方式

我就废话不多说了,直接上代码吧!# -*- coding: utf-8 -*-import mathimport randomimport copyimport timeimport sysimport tkinterimport threading# 地图tm = ['############################################################','#...

weixin_39551996的博客 1844

AOSP 8.0.0编译中的ANDROID_DATA缺失问题解决方案

在AOSP编译过程中,环境变量和路径设置的正确性至关重要。遇到相关的错误时,检查并修正环境配置通常是解决问题的关键。希望本文提供的分析和解决方案能帮助你顺利编译AOSP。

m0_74337424的博客 398

ansys 求解过程中出现未知错误。检查“求解信息”对象上的“求解器输出”,查找可能的原因。-静力学分析遇到的,这是什么原因——An unknown error occurred ——未找到解决方法

点击“确定”关闭弹窗后,进入Workbench的‌“求解信息”对象‌,查看‌“求解器输出”‌,搜索“Error”“Fatal”“Warning”等关键词,找到具体的错误描述,比如材料未定义、网格质量问题、内存不足等,这是精准解决问题的关键。进入“工具-选项-mechanical APDL”,取消勾选“分布式”,GPU加速器选择“none”。在“求解进程设置-高级”中调整内存分配参数,或切换为迭代求解器(如PCG求解器),它更省内存。尝试简化模型,比如删除非关键细节、合并重复部件,分步验证模型,定位问题源。

qq_15963745的博客 605

探索迷宫的艺术:A*寻路可视化项目

探索迷宫的艺术:A*寻路可视化项目 去发现同类优质开源项目:https://gitcode.com/ 1、项目介绍 在数字世界中,路径规划是一项至关重要的任务,无论是在自动驾驶汽车中导航,还是在游戏中寻找最佳移动路线。A-Path-Finding-Visualization 是一个精心设计的Python项目,它将复杂的A*寻路算法以直观可视化的形式呈现出来。通过这个项目,你可以亲眼目睹算法如何在二...

gitblog_00012的博客 504

Openclaw 错误分析 与 解决方案 之:Selected model is at capacity. Try a different model, or wait and retry.

Openclaw 错误分析 与 解决方案 :Selected model is at capacity. Try a different model, or wait and retry.

多媒体编程、网络编程、系统编程、网络安全编程、驱动编程 6421

DQN实现走迷宫(tkinter编写环境)

DQN实现走迷宫(tkinter编写环境) 去发现同类优质开源项目:https://gitcode.com/ 本仓库提供了一个使用Python语言,基于TensorFlow框架实现DQN算法走迷宫的完整示例。以下是该资源文件的详细介绍: 项目简介 本项目是一个迷宫自动寻路解决方案,采用DQN(深度Q网络)算法实现。环境使用tkinter编写,可视化展示迷宫及智能体行走过程。代码参考自莫烦Pytho...

gitblog_06732的博客 447

RH850从0搭建Autosar开发环境【17】- Davinci Configurator之DCM模块配置详解(下)

RH850从0搭建Autosar开发环境【17】- Davinci Configurator之DCM模块配置详解(下)

weixin_42412049的博客 2379

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

迷宫游戏python实现

在迷宫算法总结篇中我总结了生成迷宫的四种算法,在这一篇文章里面我侧重迷宫游戏的实现以及可视化。 首先我使用python3中的tkinter实现了一个简陋版的迷宫游戏,截图如下图所示,为了降低游戏的难度,在寻找路径的过程中你可以通过点击图中的空白点,生成从起点到你点击位置的暂时路径。迷宫的难度主要由以下几个参数决定: 迷宫的长和宽:尺寸越大,生成的地图越难 迷宫生成算法:难度:kruskal算法 ...

哆啦A瑶的博客 9180

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

贪吃蛇算法与双语言实现:从状态机到BFS寻路

贪吃蛇游戏是理解经典算法与数据结构的绝佳案例。其核心原理是将游戏抽象为一个状态机,通过蛇身队列、地图网格和碰撞检测来管理动态变化的状态。在算法层面,广度优先搜索(BFS)是实现自动寻路的关键技术,用于寻找从蛇头到食物的最短路径,这体现了图论在游戏AI中的应用价值。从工程实践角度看,用Python可以快速构建清晰的原型,而C++则能实现对内存和性能的精细控制,两者结合有助于深入理解不同编程范式的优劣。本文以PTA竞赛中的蛇年谐音梗题目为例,探讨了如何设计可扩展的规则引擎,并对比了Python和C++在实现状态

weixin_33851429的博客 397

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Python迷宫游戏开发:Pygame结合BFS算法实现AI自动寻路

路径搜索算法是人工智能和计算机科学中的基础概念,用于在图形或网格结构中寻找两点之间的可行路径。其核心原理是通过系统性地探索状态空间,利用队列或栈等数据结构记录待访问节点,确保搜索的完备性与最优性。在游戏开发、机器人导航和网络路由等领域,高效的路径规划技术能显著提升系统自主决策能力与用户体验。将经典的广度优先搜索(BFS)算法应用于迷宫求解,不仅能保证找到最短路径,还可通过Pygame库实现动态可视化,为学习算法原理和Python游戏开发提供直观的工程实践场景。本文通过构建一个完整的迷宫游戏项目,详细展示了如

weixin_34279246的博客 348

Python常用的GUI模块

Python GUI模块,Python常用的GUI模块,Tkinter,PyGame,PyQT,PySide,wxPython,kivy

Oblning的博客 1015

python遗传算法路径规划失败_遗传算法解决寻路问题——Python描述

1 importrandom2 importmath3 importcopy4 from tkinter import *5 importtkinter.font as tkFont6 importtime, threading78 WIDTH = 1009 HEIGHT = 10010 MIN =011 MAX = WIDTH * HEIGHT - 11213 PATH_COUNT = 1001...

weixin_39785600的博客 276

Python小游戏项目实战:从环境搭建到源码魔改的进阶指南

Python作为一门广泛应用于自动化、数据分析及Web开发的高级编程语言,其核心价值在于通过清晰的语法和丰富的库生态,帮助开发者高效构建各类应用。理解Python编程不仅需要掌握基础语法和数据结构,更需通过实际项目来深化对事件驱动、面向对象等编程范式的认知。在游戏开发这一具体应用场景中,Python凭借Pygame等库,为学习图形渲染、碰撞检测和游戏循环等核心概念提供了绝佳实践平台。通过系统学习Python小游戏源码,开发者能有效提升代码调试、功能扩展和项目重构能力,这正是从“摸鱼”消遣转向“精进”技能的关

weixin_34318326的博客 435
上一篇: wxPyhton实战笔记--窗口里显示图片
下一篇: windows环境下c++调用python
Paper_Sheep
博客等级 码龄7年 4粉丝 8原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值