当前位置: 首页 > news >正文

Python 绘制迷宫游戏,自带最优解路线

1、需要安装pygame
2、上下左右移动,空格实现物体所在位置到终点的路线,会有虚线绘制。
在这里插入图片描述

import pygame
import random
import math# 迷宫单元格类
class Cell:def __init__(self, x, y):self.x = xself.y = yself.walls = {'top': True, 'right': True, 'bottom': True, 'left': True}self.visited = Falseself.is_obstacle = Falsedef draw(self, screen, cell_size):x = self.x * cell_sizey = self.y * cell_sizeif self.walls['top']:pygame.draw.line(screen, (0, 0, 0), (x, y), (x + cell_size, y), 2)if self.walls['right']:pygame.draw.line(screen, (0, 0, 0), (x + cell_size, y), (x + cell_size, y + cell_size), 2)if self.walls['bottom']:pygame.draw.line(screen, (0, 0, 0), (x + cell_size, y + cell_size), (x, y + cell_size), 2)if self.walls['left']:pygame.draw.line(screen, (0, 0, 0), (x, y + cell_size), (x, y), 2)if self.is_obstacle:pygame.draw.rect(screen, (128, 128, 128), (x, y, cell_size, cell_size))def check_neighbors(self, grid, cols, rows):neighbors = []if self.x > 0:left = grid[self.y][self.x - 1]if not left.visited:neighbors.append(left)if self.x < cols - 1:right = grid[self.y][self.x + 1]if not right.visited:neighbors.append(right)if self.y > 0:top = grid[self.y - 1][self.x]if not top.visited:neighbors.append(top)if self.y < rows - 1:bottom = grid[self.y + 1][self.x]if not bottom.visited:neighbors.append(bottom)if neighbors:return random.choice(neighbors)else:return None# 移除两个单元格之间的墙
def remove_walls(current, next_cell):dx = current.x - next_cell.xif dx == 1:current.walls['left'] = Falsenext_cell.walls['right'] = Falseelif dx == -1:current.walls['right'] = Falsenext_cell.walls['left'] = Falsedy = current.y - next_cell.yif dy == 1:current.walls['top'] = Falsenext_cell.walls['bottom'] = Falseelif dy == -1:current.walls['bottom'] = Falsenext_cell.walls['top'] = False# 生成迷宫
def generate_maze(grid, cols, rows):stack = []current = grid[0][0]current.visited = Truestack.append(current)while stack:current = stack[-1]next_cell = current.check_neighbors(grid, cols, rows)if next_cell:next_cell.visited = Truestack.append(next_cell)remove_walls(current, next_cell)else:stack.pop()# 随机添加障碍物
def add_obstacles(grid, cols, rows, obstacle_ratio=0.3):obstacle_cells = []num_obstacles = int(cols * rows * obstacle_ratio)while len(obstacle_cells) < num_obstacles:x = random.randint(0, cols - 1)y = random.randint(0, rows - 1)if (x, y) not in [(0, 0), (cols - 1, rows - 1)] and not grid[y][x].is_obstacle:grid[y][x].is_obstacle = Trueobstacle_cells.append((x, y))return obstacle_cells# 检查从起点到终点是否有路径
def has_path(grid, start, end):path = find_path(grid, start, end)return bool(path)# 移除障碍物直到有路径
def ensure_path_exists(grid, start, end, obstacle_cells):random.shuffle(obstacle_cells)while not has_path(grid, start, end) and obstacle_cells:x, y = obstacle_cells.pop()grid[y][x].is_obstacle = False# 绘制迷宫
def draw_maze(screen, grid, cell_size, cols, rows):for i in range(rows):for j in range(cols):grid[i][j].draw(screen, cell_size)# 绘制起点和终点
def draw_start_end(screen, cell_size, start, end):start_x = start[0] * cell_size + cell_size // 2start_y = start[1] * cell_size + cell_size // 2end_x = end[0] * cell_size + cell_size // 2end_y = end[1] * cell_size + cell_size // 2pygame.draw.circle(screen, (0, 255, 0), (start_x, start_y), cell_size // 3)pygame.draw.circle(screen, (255, 0, 0), (end_x, end_y), cell_size // 3)# 绘制移动的物体
def draw_player(screen, cell_size, player_pos):player_x = player_pos[0] * cell_size + cell_size // 2player_y = player_pos[1] * cell_size + cell_size // 2pygame.draw.circle(screen, (0, 0, 255), (player_x, player_y), cell_size // 3)# 检查是否可以移动
def can_move(grid, player_pos, direction):x, y = player_posif direction == 'up':return y > 0 and not grid[y][x].walls['top'] and not grid[y - 1][x].is_obstacleelif direction == 'down':return y < len(grid) - 1 and not grid[y][x].walls['bottom'] and not grid[y + 1][x].is_obstacleelif direction == 'left':return x > 0 and not grid[y][x].walls['left'] and not grid[y][x - 1].is_obstacleelif direction == 'right':return x < len(grid[0]) - 1 and not grid[y][x].walls['right'] and not grid[y][x + 1].is_obstacle# 广度优先搜索找到最优路径
def find_path(grid, start, end):queue = [(start, [start])]visited = set()while queue:(x, y), path = queue.pop(0)if (x, y) == end:return pathif (x, y) not in visited:visited.add((x, y))if can_move(grid, (x, y), 'up'):new_path = list(path)new_path.append((x, y - 1))queue.append(((x, y - 1), new_path))if can_move(grid, (x, y), 'down'):new_path = list(path)new_path.append((x, y + 1))queue.append(((x, y + 1), new_path))if can_move(grid, (x, y), 'left'):new_path = list(path)new_path.append((x - 1, y))queue.append(((x - 1, y), new_path))if can_move(grid, (x, y), 'right'):new_path = list(path)new_path.append((x + 1, y))queue.append(((x + 1, y), new_path))return []# 绘制虚线
def draw_dashed_line(screen, color, start_pos, end_pos, dash_length=5):dx = end_pos[0] - start_pos[0]dy = end_pos[1] - start_pos[1]distance = math.sqrt(dx ** 2 + dy ** 2)num_dashes = int(distance / dash_length)for i in range(num_dashes):if i % 2 == 0:start = (start_pos[0] + dx * i / num_dashes, start_pos[1] + dy * i / num_dashes)end = (start_pos[0] + dx * (i + 1) / num_dashes, start_pos[1] + dy * (i + 1) / num_dashes)pygame.draw.line(screen, color, start, end, 2)# 显示提示信息
def show_message(screen, message, font, color, position):text = font.render(message, True, color)screen.blit(text, position)# 主函数
def main():pygame.init()cols = 35rows = 35cell_size = 20width = cols * cell_sizeheight = rows * cell_sizescreen = pygame.display.set_mode((width, height))pygame.display.set_caption("Random Maze")# 创建迷宫网格grid = [[Cell(j, i) for j in range(cols)] for i in range(rows)]# 生成迷宫generate_maze(grid, cols, rows)# 定义起点和终点start = (0, 0)end = (cols - 1, rows - 1)# 随机添加障碍物obstacle_cells = add_obstacles(grid, cols, rows)# 确保有路径ensure_path_exists(grid, start, end, obstacle_cells)# 初始化玩家位置player_pos = startfont = pygame.font.Font(None, 36)success_text = font.render("Successfully!!!", True, (0, 255, 0))help_text = font.render("", True, (0, 0, 0))success = Falseauto_move = Falserunning = Truewhile running:for event in pygame.event.get():if event.type == pygame.QUIT:running = Falseelif event.type == pygame.KEYDOWN and not success:if event.key == pygame.K_UP:if can_move(grid, player_pos, 'up'):player_pos = (player_pos[0], player_pos[1] - 1)elif event.key == pygame.K_DOWN:if can_move(grid, player_pos, 'down'):player_pos = (player_pos[0], player_pos[1] + 1)elif event.key == pygame.K_LEFT:if can_move(grid, player_pos, 'left'):player_pos = (player_pos[0] - 1, player_pos[1])elif event.key == pygame.K_RIGHT:if can_move(grid, player_pos, 'right'):player_pos = (player_pos[0] + 1, player_pos[1])elif event.key == pygame.K_SPACE:auto_move = Truepath = find_path(grid, player_pos, end)path_index = 0screen.fill((255, 255, 255))draw_maze(screen, grid, cell_size, cols, rows)draw_start_end(screen, cell_size, start, end)# 绘制路径if 'path' in locals() and path:for i in range(len(path) - 1):start_point = (path[i][0] * cell_size + cell_size // 2, path[i][1] * cell_size + cell_size // 2)end_point = (path[i + 1][0] * cell_size + cell_size // 2, path[i + 1][1] * cell_size + cell_size // 2)draw_dashed_line(screen, (255, 0, 0), start_point, end_point)draw_player(screen, cell_size, player_pos)# 显示提示信息show_message(screen, "", font, (0, 0, 0), (10, 10))if auto_move and 'path' in locals() and path_index < len(path):player_pos = path[path_index]path_index += 1if player_pos == end:auto_move = Falseif player_pos == end:success = Truescreen.blit(success_text,(width // 2 - success_text.get_width() // 2, height // 2 - success_text.get_height() // 2))pygame.display.flip()pygame.time.delay(100)pygame.quit()if __name__ == "__main__":main()

相关文章:

Python 绘制迷宫游戏,自带最优解路线

1、需要安装pygame 2、上下左右移动&#xff0c;空格实现物体所在位置到终点的路线&#xff0c;会有虚线绘制。 import pygame import random import math# 迷宫单元格类 class Cell:def __init__(self, x, y):self.x xself.y yself.walls {top: True, right: True, botto…...

vue3学习-1(基础)

vue3学习-1&#xff08;基础&#xff09; 1. 开始API 风格选项式 API (Options API)组合式 API (Composition API) 快速创建个应用 2.基础1. 创建个应用2.模板语法3.响应式基础reactive() 的局限性[](https://cn.vuejs.org/guide/essentials/reactivity-fundamentals.html#limi…...

deepseek使用记录18——文化基因之文化融合

文明长河中的生命浪花 在洛阳白马寺的银杏树下&#xff0c;年轻母亲指着"农禅并重"碑刻给孩子讲述祖辈耕作的故事&#xff1b;在哔哩哔哩的直播间里&#xff0c;00后女孩穿着汉服跳起街舞&#xff0c;弹幕飘过"这才是文化缝合怪"。当文明交融的宏大叙事照…...

Hadoop简介

1. Hadoop简介 官网&#xff1a;http://hadoop.apache.org 1.1 Hadoop架构 Hadoop由三个模块组成&#xff1a;分布式存储HDFS、分布式计算MapReduce、资源调度引擎YARN 1.2 Hadoop历史 Hadoop作者Doug Cutting Apache Lucene是一个文本搜索系统库 Apache Nutch作为前者的一部…...

密码学(哈希函数)

4.1 Hash函数与数据完整性 数据完整性&#xff1a; 检测传输消息&#xff08;加密或未加密&#xff09;的修改。 密码学Hash函数&#xff1a; 构建某些数据的简短“指纹”&#xff1b;如果数据被篡改&#xff0c;则该指纹&#xff08;以高概率&#xff09;不再有效。Hash函数…...

谈谈单例模式中通过Htools包的SpringUtil.getBean获取Bean的好处

目录 优势 解决依赖注入失效问题&#xff1a; 典型应用场景&#xff1a; 好处 1. 实例化时序问题 2. 延迟获取解决空指针 3. 设计模式与 Spring 的权衡 代码对比&#xff1a;错误 vs 正确 错误示例&#xff08;空指针&#xff09;&#xff1a; 正确实现&#xff08;延…...

本地部署大语言模型-DeepSeek

DeepSeek 是国内顶尖 AI 团队「深度求索」开发的多模态大模型&#xff0c;具备数学推理、代码生成等深度能力&#xff0c;堪称"AI界的六边形战士"。 Hostease AMD 9950X/96G/3.84T NVMe/1G/5IP/RTX4090 GPU服务器提供多种计费模式。 DeepSeek-R1-32B配置 配置项 规…...

adb的安装

1、概念 &#xff08;1&#xff09;adb&#xff08;android debug bridge&#xff09;安卓调试桥&#xff0c;用于完成电脑和手机之间的通信控制。 &#xff08;2&#xff09;xcode来完成对于ios设备的操控&#xff0c;前提是有个mac电脑。 2、adb的安装 &#xff08;1&…...

Python 如何实现 Markdown 记账记录转 Excel 存储

文章精选推荐 1 JetBrains Ai assistant 编程工具让你的工作效率翻倍 2 Extra Icons&#xff1a;JetBrains IDE的图标增强神器 3 IDEA插件推荐-SequenceDiagram&#xff0c;自动生成时序图 4 BashSupport Pro 这个ides插件主要是用来干嘛的 &#xff1f; 5 IDEA必装的插件&…...

随机播放音乐 伪随机

import java.util.*;/*** https://cloud.tencent.com.cn/developer/news/1045747* 伪随机播放音乐*/ public class MusicPlayer {private List<String> allSongs; // 所有歌曲列表private List<String> playedSongs; // 已经播放过的歌曲列表private Map<String…...

latex 环境配置

编译器可选 miktex和 tex live ① miktex 下载地址 Portable 版本用的也是 Installer版的安装程序 basic-miktex-24.1-x64.exe&#xff0c;但是需要修改文件名为 miktex-portable.exe ├──texmfs │ ├─config │ ├─data │ └─install │ └─miktex/…...

fortify安全扫描Access Control: Database问题解决

概述 Access Control: Database说白了就是权限控制。在访问数据库(sql和nosql)需要加入当前用户的权限控制。不然会被fortify扫描出来&#xff0c;认为客户端可能不挟持和假冒&#xff0c;从而导致数据被泄露。 但是这个并不是任何时候都需要的&#xff0c;有的接口本来…...

Java 设计模式:软件开发的精髓与艺

目录 一、设计模式的起源二、设计模式的分类1. 创建型模式2. 结构型模式3. 行为型模式三、设计模式的实践1. 单例模式2. 工厂模式3. 策略模式四、设计模式的优势五、设计模式的局限性六、总结在软件开发的浩瀚星空中,设计模式犹如一颗颗璀璨的星辰,照亮了开发者前行的道路。它…...

初学者如何用 Python 写第一个爬虫?

?? 欢迎来到我的博客&#xff01; 非常高兴能在这里与您相遇。在这里&#xff0c;您不仅能获得有趣的技术分享&#xff0c;还能感受到轻松愉快的氛围。无论您是编程新手&#xff0c;还是资深开发者&#xff0c;都能在这里找到属于您的知识宝藏&#xff0c;学习和成长。 ?? …...

Cocos Creator3.8.6拖拽物体的几种方式

文章目录 前言一、第一种通过UILocation二、第二种通过UIDelta实现总结 前言 在游戏开发中&#xff0c;拖拽物体是一个非常常见的交互功能&#xff0c;无论是用于UI元素的拖动&#xff0c;还是场景中物体的移动&#xff0c;拖拽操作都能极大地提升用户体验。Cocos Creator 3.8…...

分布式Session

我用「餐厅点餐代码实战」帮你彻底搞懂分布式Session&#xff0c;看完不仅能应对面试&#xff0c;还能直接应用到实际开发。先记住这个核心矛盾&#xff1a;多服务员如何记住同一顾客的喜好&#xff1f; 一、从生活场景理解Session的本质 传统单机场景&#xff08;小餐馆&…...

Kotlin 运算符重载

在Kotlin中&#xff0c;常用的运算符重载函数名如下&#xff1a; 1.算术操作符&#xff1a; 加法&#xff1a;plus 减法&#xff1a;minus 乘法&#xff1a;times 除法&#xff1a;div 取模&#xff1a;rem 或 mod 整数除法&#xff1a;floorDiv 求幂&#xff1a;pow 自增&…...

OpenHarmony4.1-轻量与小型系统ubuntu开发环境

因OpenHarmony官网提供包含轻量、小型与标准系统的全量代码非常宠大&#xff0c;解包后大概需要70G以上硬盘空间&#xff0c;如要编译标准系统则需要140G以上空间。 如硬盘空间有限与只使用轻量/小型OpenHarmony系统&#xff0c;则可以下载并直接使用本人裁剪源码过的ubuntu硬盘…...

AVR 单片机硬件供电处理

摘自AVR 单片机应用笔记&#xff1a;AN2519 - AVR Microcontroller Hardware Design Considerations。 2. 供电 供电设计是任何硬件设计的关键一环&#xff0c;直接影响到系统的性能。在设计供电时&#xff0c;有两个重要的方面需要考虑&#xff1a;ESD 防护和噪声干扰。这些内…...

LeetCode 27 移除元素

LeetCode 27 - 移除元素&#xff08;Remove Element&#xff09;是一个简单但经典的双指针问题&#xff0c;主要考察数组操作的基本功。虽然问题容易&#xff0c;但掌握多种解法以及衍生的变体问题对解决更复杂的操作数组问题有帮助。 题目描述 输入&#xff1a;整数数组 nums…...

内存分配函数malloc kmalloc vmalloc

内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...

K8S认证|CKS题库+答案| 11. AppArmor

目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作&#xff1a; 1&#xff09;、切换集群 2&#xff09;、切换节点 3&#xff09;、切换到 apparmor 的目录 4&#xff09;、执行 apparmor 策略模块 5&#xff09;、修改 pod 文件 6&#xff09;、…...

前端倒计时误差!

提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

QMC5883L的驱动

简介 本篇文章的代码已经上传到了github上面&#xff0c;开源代码 作为一个电子罗盘模块&#xff0c;我们可以通过I2C从中获取偏航角yaw&#xff0c;相对于六轴陀螺仪的yaw&#xff0c;qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端

&#x1f31f; 什么是 MCP&#xff1f; 模型控制协议 (MCP) 是一种创新的协议&#xff0c;旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议&#xff0c;它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...

聊聊 Pulsar:Producer 源码解析

一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台&#xff0c;以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中&#xff0c;Producer&#xff08;生产者&#xff09; 是连接客户端应用与消息队列的第一步。生产者…...

对WWDC 2025 Keynote 内容的预测

借助我们以往对苹果公司发展路径的深入研究经验&#xff0c;以及大语言模型的分析能力&#xff0c;我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际&#xff0c;我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测&#xff0c;聊作存档。等到明…...

iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈

在日常iOS开发过程中&#xff0c;性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期&#xff0c;开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发&#xff0c;但背后往往隐藏着系统资源调度不当…...

打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用

一、方案背景​ 在现代生产与生活场景中&#xff0c;如工厂高危作业区、医院手术室、公共场景等&#xff0c;人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式&#xff0c;存在效率低、覆盖面不足、判断主观性强等问题&#xff0c;难以满足对人员打手机行为精…...

BLEU评分:机器翻译质量评估的黄金标准

BLEU评分&#xff1a;机器翻译质量评估的黄金标准 1. 引言 在自然语言处理(NLP)领域&#xff0c;衡量一个机器翻译模型的性能至关重要。BLEU (Bilingual Evaluation Understudy) 作为一种自动化评估指标&#xff0c;自2002年由IBM的Kishore Papineni等人提出以来&#xff0c;…...