【python A* pygame 格式化 自定义起点、终点、障碍】
- pip install pygame
test.py(chatgpt版本)
- 空格键:运行 A* 算法。
Ctrl+C
键:清空路径。Ctrl+S
键:保存当前地图到map.json
文件。Ctrl+L
键:从map.json
文件加载地图。
import pygame
import json
from queue import PriorityQueue
from tkinter import messagebox, Tk# Initialize pygame
pygame.init()# Constants
WIDTH, HEIGHT = 800, 800
ROWS, COLS = 40, 40
CELL_SIZE = WIDTH // COLS
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)
YELLOW = (255, 255, 0)
GREY = (200, 200, 200)# Pygame setup
WIN = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("A* Pathfinding Visualization")class Spot:def __init__(self, row, col):self.row = rowself.col = colself.x = row * CELL_SIZEself.y = col * CELL_SIZEself.color = WHITEself.neighbors = []def is_closed(self):return self.color == REDdef is_open(self):return self.color == YELLOWdef is_barrier(self):return self.color == BLACKdef is_start(self):return self.color == BLUEdef is_end(self):return self.color == GREENdef reset(self):self.color = WHITEdef make_start(self):self.color = BLUEdef make_closed(self):self.color = REDdef make_open(self):self.color = YELLOWdef make_barrier(self):self.color = BLACKdef make_end(self):self.color = GREENdef make_path(self):if not self.is_start() and not self.is_end():self.color = GREYdef draw(self, win):pygame.draw.rect(win, self.color, (self.x, self.y, CELL_SIZE, CELL_SIZE))def update_neighbors(self, grid):self.neighbors = []if (self.row < ROWS - 1 and not grid[self.row + 1][self.col].is_barrier()): # Downself.neighbors.append(grid[self.row + 1][self.col])if self.row > 0 and not grid[self.row - 1][self.col].is_barrier(): # Upself.neighbors.append(grid[self.row - 1][self.col])if (self.col < COLS - 1 and not grid[self.row][self.col + 1].is_barrier()): # Rightself.neighbors.append(grid[self.row][self.col + 1])if self.col > 0 and not grid[self.row][self.col - 1].is_barrier(): # Leftself.neighbors.append(grid[self.row][self.col - 1])def __lt__(self, other):return False# Utility functions
def h(p1, p2):x1, y1 = p1x2, y2 = p2return abs(x1 - x2) + abs(y1 - y2)def reconstruct_path(came_from, current, draw):while current in came_from:current = came_from[current]current.make_path()draw()def make_grid():return [[Spot(i, j) for j in range(COLS)] for i in range(ROWS)]def draw_grid_line(win):for i in range(ROWS):pygame.draw.line(win, GREY, (0, i * CELL_SIZE), (WIDTH, i * CELL_SIZE))for j in range(COLS):pygame.draw.line(win, GREY, (j * CELL_SIZE, 0), (j * CELL_SIZE, HEIGHT))def draw(win, grid):win.fill(WHITE)for row in grid:for spot in row:spot.draw(win)draw_grid_line(win)pygame.display.update()def get_clicked_pos(pos):y, x = posrow = y // CELL_SIZEcol = x // CELL_SIZEif 0 <= row < ROWS and 0 <= col < COLS:return row, colreturn None, Nonedef clear_grid(grid):for row in grid:for spot in row:if not (spot.is_start() or spot.is_end() or spot.is_barrier()):spot.reset()def save_grid(grid, filename="map.json"):data = {"start": None, "end": None, "barriers": []}for row in grid:for spot in row:if spot.is_start():data["start"] = (spot.row, spot.col)elif spot.is_end():data["end"] = (spot.row, spot.col)elif spot.is_barrier():data["barriers"].append((spot.row, spot.col))try:with open(filename, "w", encoding="utf-8") as f:json.dump(data, f, indent=4, ensure_ascii=False)Tk().withdraw()messagebox.showinfo("Save Successful", "The grid has been saved successfully.")print("Save Successful", "The grid has been saved successfully.")except Exception as e:Tk().withdraw()messagebox.showerror("Save Error", f"Error saving grid: {e}")print(f"Error saving grid: {e}")def load_grid(grid, filename="map.json"):try:with open(filename, "r", encoding='utf-8') as f:data = json.load(f)for row in grid:for spot in row:spot.reset()if data["start"]:start_row, start_col = data["start"]grid[start_row][start_col].make_start()if data["end"]:end_row, end_col = data["end"]grid[end_row][end_col].make_end()for barrier in data["barriers"]:barrier_row, barrier_col = barriergrid[barrier_row][barrier_col].make_barrier()Tk().withdraw()messagebox.showinfo("Load Successful", "The grid has been loaded successfully.")print('Load Successful", "The grid has been loaded successfully.')except (FileNotFoundError, KeyError, json.JSONDecodeError):Tk().withdraw()messagebox.showerror("Load Error", "Error loading grid: Invalid or missing map file.")print("Error loading grid: Invalid or missing map file.")# A* Algorithm
def a_star(draw, grid, start, end):if not start or not end or start == end:print("Error: Invalid start or end node.")return Falsecount = 0open_set = PriorityQueue()open_set.put((0, count, start))came_from = {}g_score = {spot: float("inf") for row in grid for spot in row}g_score[start] = 0f_score = {spot: float("inf") for row in grid for spot in row}f_score[start] = h((start.row, start.col), (end.row, end.col))open_set_hash = {start}while not open_set.empty():for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()current = open_set.get()[2]open_set_hash.remove(current)if current == end:current.make_end()reconstruct_path(came_from, end, draw)return Truefor neighbor in current.neighbors:temp_g_score = g_score[current] + 1if temp_g_score < g_score[neighbor]:came_from[neighbor] = currentg_score[neighbor] = temp_g_scoref_score[neighbor] = temp_g_score + h((neighbor.row, neighbor.col), (end.row, end.col))if neighbor not in open_set_hash:count += 1open_set.put((f_score[neighbor], count, neighbor))open_set_hash.add(neighbor)neighbor.make_open()draw()if current != start:current.make_closed()return False# Main function
def main(win):grid = make_grid()start = Noneend = Nonerunning = Truewhile running:draw(win, grid)for event in pygame.event.get():if event.type == pygame.QUIT:running = Falseif pygame.mouse.get_pressed()[0]: # Left mouse buttonpos = pygame.mouse.get_pos()row, col = get_clicked_pos(pos)if row is not None and col is not None:spot = grid[row][col]if not start and spot != end:start = spotstart.make_start()elif not end and spot != start:end = spotend.make_end()elif spot != start and spot != end:spot.make_barrier()elif pygame.mouse.get_pressed()[2]: # Right mouse buttonpos = pygame.mouse.get_pos()row, col = get_clicked_pos(pos)if row is not None and col is not None:spot = grid[row][col]spot.reset()if spot == start:start = Noneelif spot == end:end = Noneif event.type == pygame.KEYDOWN:print(f"KEYDOWN")if event.key == pygame.K_SPACE and start and end:clear_grid(grid)for row in grid:for spot in row:spot.update_neighbors(grid)a_star(lambda: draw(win, grid), grid, start, end)if event.key == pygame.K_c:print("press ctrl+c")clear_grid(grid)if event.key == pygame.K_s:print("press ctrl+s")save_grid(grid)if event.key == pygame.K_l:print("press ctrl+l")load_grid(grid)pygame.quit()main(WIN)
相关文章:

【python A* pygame 格式化 自定义起点、终点、障碍】
- pip install pygame test.py(chatgpt版本) 空格键:运行 A* 算法。CtrlC 键:清空路径。CtrlS 键:保存当前地图到 map.json 文件。CtrlL 键:从 map.json 文件加载地图。 import pygame import json from queue import PriorityQ…...
12_Redis发布订阅
1.Redis发布订阅介绍 1.1 基本概念 Redis的发布订阅(Pub/Sub)是一种消息通信模式,允许消息的发布者(Publisher)将消息发布到一个或多个频道(Channel),订阅者(Subscriber)通过订阅这些频道来接收消息。 发布者(Publisher):发送消息的一方,使用PUBLISH命令将消息…...

归并排序:数据排序的高效之道
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/literature?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,…...

【redis初阶】浅谈分布式系统
目录 一、常见概念 1.1 基本概念 2.2 评价指标(Metric) 二、架构演进 2.1 单机架构 2.2 应用数据分离架构 2.3 应用服务集群架构 2.4 读写分离/主从分离架构 2.5 引入缓存 ⸺ 冷热分离架构 2.6 数据库分库分表 2.7 业务拆分 ⸺ 引入微服务 redis学习&…...

CatLog的使用
一 CatLog的简介 1.1 作用 CAT(Central Application Tracking) 是基于 Java 开发的实时应用监控平台,为美团点评提供了全面的实时监控告警服务。 1.2 组成部分 1.2.1 Transaction 1.Transaction 适合记录跨越系统边界的程序访问行为&a…...
头歌python实验:网络安全应用实践-恶意流量检测
第1关:re 库的使用 本关任务:编写一个能正则匹配出 ip 地址的小程序。 re 的主要功能函数 常用的功能函数包括: compile、search、match、split、findall(finditer)、sub(subn)。 re.search 函数 re.search 扫描整个字符串并返回第一个成功的匹配。 函数语法: re…...

大模型WebUI:Gradio全解11——Chatbots:融合大模型的多模态聊天机器人(2)
大模型WebUI:Gradio全解11——Chatbots:融合大模型的聊天机器人(2) 前言本篇摘要11. Chatbot:融合大模型的多模态聊天机器人11.2 使用流行的LLM库和API11.2.1 Llama Index11.2.2 LangChain11.2.3 OpenAI1. 基本用法2. …...

如何用 Python 实现简单的 AI 模型?
💖 欢迎来到我的博客! 非常高兴能在这里与您相遇。在这里,您不仅能获得有趣的技术分享,还能感受到轻松愉快的氛围。无论您是编程新手,还是资深开发者,都能在这里找到属于您的知识宝藏,学习和成长…...

单片机-直流电机实验
1、ULN2003芯片介绍 ULN2003, 该芯片是一个单片高电压、高电流的达林顿晶体管阵列集成电路。不仅可以用来 驱动直流电机,还可用来驱动五线四相步进电机。支持驱动大功率电器 因为 ULN2003 的输出是集电极开路,ULN2003 要输出高电平࿰…...
python【数据结构】
1. 列表 Python 中列表是可变的,这是它区别于字符串和元组的最重要的特点;即,列表可以修改,而字符串和元组不能。 以下是 Python 中列表的方法: 方法描述list.append(x)把一个元素添加到列表的结尾,相当…...

详解Sonar与Jenkins 的集成使用!
本文阅读前提 本文假设读者熟悉Jenkins和SonarQube的基础操作。 核心实现功能 Jenkins中运行的job来调用SonarScanner,最后可实现测试结果与SonarQube中同步查看。 Jenkins中安装Sonar相关插件 配置Sonarqube Dashboard>Manage Jenkins>Systems 指定son…...

《笔记》青蛙跳台阶——斐波那契数列
斐波那契数列 斐波那契数列(Fibonacci Sequence)是一个经典的数学数列,其特点是每一项都是前两项的和。数列的前两项通常定义为 0 和 1(或 1 和 1),后续每一项都是前两项的和。 斐波那契数列的定义 斐波那…...

SpringBoot3动态切换数据源
背景 随着公司业务战略的发展,相关的软件服务也逐步的向多元化转变,之前是单纯的拿项目,赚人工钱,现在开始向产品化\服务化转变。最近雷袭又接到一项新的挑战:了解SAAS模型,考虑怎么将公司的产品转换成多租…...

OSPF - 特殊区域
OSPF路由器需要同时维护域内路由、域间路由、外部路由信息数据库。当网络规模不断扩大时,LSDB规模也不断增长。如果某区域不需要为其他区域提供流量中转服务,那么该区域内的路由器就没有必要维护本区域外的链路状态数据库。 OSPF通过划分区域可以减少网…...
Linux 系统下磁盘相关指令:df、du、fdisk、lsblk
文章目录 I df、du、fdisk、lsblk指令df命令用于显示文件系统的磁盘空间使用情况du命令用于估算目录或文件的磁盘空间使用情况fdisk命令用于对磁盘进行分区操作lsblk指令查看设备信息II 应用du估算目录或文件的磁盘空间使用情况lsblk查看服务器上查看硬盘个数III 知识扩展磁盘阵…...
基于单片机的肺功能MVV简单测算
肺功能MVV一般是指肺部每分钟的最大通气量。 MVV本身是最大值的英文缩写,在临床上,肺功能MVV表示肺部每分钟最大通气量,用以衡量气道的通畅度,以及肺部和胸廓的弹性、呼吸肌的力量。 肺部每分钟的最大通气量的参考值男性与女性之…...

如何用Python编程实现自动整理XML发票文件
传统手工整理发票耗时费力且易出错,而 XML 格式发票因其结构化、标准化的特点,为实现发票的自动化整理与保存提供了可能。本文将详细探讨用python来编程实现对 XML 格式的发票进行自动整理。 一、XML 格式发票的特点 结构化数据:XML 格式发票…...

腾讯云AI代码助手编程挑战赛-百事一点通
作品简介 百事通问答是一款功能强大的智能问答工具。它依托海量知识储备,无论你是想了解生活窍门、学习难点,还是工作中的专业疑惑,只需输入问题,就能瞬间获得精准解答,以简洁易懂的方式呈现,随时随地为你…...
Spring学习笔记1
目录 1 什么是spring2 spring的优势3 IOC的概念和作用3.1 无参数构造函数的实例化方式3.2 使用工厂中的普通方法实例化对象 4 Bean4.1 Bean相关概念4.2 Bean对象的作用范围 5 DI5.1 构造函数注入5.2 set方法注入5.3 复杂类型数据注入5.4 基于注解的IOC5.4.1 包扫描5.4.2 Compon…...
LeetCode 2185. Counting Words With a Given Prefix
🔗 https://leetcode.com/problems/counting-words-with-a-given-prefix 题目 给一个字符串数组,返回其中前缀为 pref 的个数 思路 模拟 代码 class Solution { public:int prefixCount(vector<string>& words, string pref) {int count…...

大数据学习栈记——Neo4j的安装与使用
本文介绍图数据库Neofj的安装与使用,操作系统:Ubuntu24.04,Neofj版本:2025.04.0。 Apt安装 Neofj可以进行官网安装:Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...
在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能
下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...
【Linux】C语言执行shell指令
在C语言中执行Shell指令 在C语言中,有几种方法可以执行Shell指令: 1. 使用system()函数 这是最简单的方法,包含在stdlib.h头文件中: #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力
引言: 在人工智能快速发展的浪潮中,快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型(LLM)。该模型代表着该领域的重大突破,通过独特方式融合思考与非思考…...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现
摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序,以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务,提供稳定高效的数据处理与业务逻辑支持;利用 uniapp 实现跨平台前…...

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列,以便知晓哪些列包含有价值的数据,…...

push [特殊字符] present
push 🆚 present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中,push 和 present 是两种不同的视图控制器切换方式,它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...

华为OD机考-机房布局
import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...
苹果AI眼镜:从“工具”到“社交姿态”的范式革命——重新定义AI交互入口的未来机会
在2025年的AI硬件浪潮中,苹果AI眼镜(Apple Glasses)正在引发一场关于“人机交互形态”的深度思考。它并非简单地替代AirPods或Apple Watch,而是开辟了一个全新的、日常可接受的AI入口。其核心价值不在于功能的堆叠,而在于如何通过形态设计打破社交壁垒,成为用户“全天佩戴…...