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

embedded/2025/3/4 17:00:45/

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()

http://www.ppmy.cn/embedded/169971.html

相关文章

探秘基带算法:从原理到5G时代的通信变革【一】引言

文章目录 一、引言1.1 研究背景与意义1.2 研究目的与方法1.3 研究内容与创新点 本博客为系列博客&#xff0c;主要讲解各基带算法的原理与应用&#xff0c;包括&#xff1a;viterbi解码、Turbo编解码、Polar编解码、CORDIC算法、CRC校验、FFT/DFT、QAMtiaozhi/解调、QPSK调制/解…

51c自动驾驶~合集52

我自己的原文哦~ https://blog.51cto.com/whaosoft/13383340 #世界模型如何推演未来的千万种可能 驾驶世界模型&#xff08;DWM&#xff09;&#xff0c;专注于预测驾驶过程中的场景演变&#xff0c;已经成为追求自动驾驶的一种有前景的范式。这些方法使自动驾驶系统能够更…

Tailwind CSS 问题:npm error could not determine executable to run

问题与处理策略 问题描述 npx tailwindcss init -p在使用 Tailwind CSS 的前端项目中&#xff0c;执行上述指令&#xff0c;即初始化 Tailwind CSS 时&#xff0c;报如下错误 npm error could not determine executable to run# 报错npm 错误无法确定要运行的可执行文件问题…

【Python】基础知识四

> 作者&#xff1a;დ旧言~ > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;了解Python的字典、文件。 > 毒鸡汤&#xff1a;有些事情&#xff0c;总是不明白&#xff0c;所以我不会坚持。早安! > 专栏选自&#xff1a;Pyt…

在CentOS 7上安装和配置Nginx

引言 Nginx是一款高性能的HTTP和反向代理服务器。本文将详细介绍如何在CentOS 7系统上安装、配置以及管理Nginx服务。 一、安装Nginx 步骤1&#xff1a;下载并添加Nginx YUM源 首先&#xff0c;为您的系统添加Nginx官方提供的YUM源&#xff1a; wget http://nginx.org/pac…

C# 泛型 使用详解

总目录 前言 在 C# 编程中&#xff0c;代码的复用性和灵活性是至关重要的。 在传统编程方式中&#xff0c;若需处理不同数据类型的相似逻辑&#xff0c;往往需要为每个类型编写重复代码。例如&#xff0c;针对int和string的集合操作需分别实现&#xff0c;这不仅冗余&#xf…

安全渗透测试的全面解析与实践

引言 随着网络安全威胁的日益增加&#xff0c;企业和组织对自身系统的安全性提出了更高的要求。安全渗透测试&#xff08;Penetration Testing&#xff0c;简称渗透测试&#xff09;作为主动发现和修复系统安全漏洞的重要手段&#xff0c;已成为安全防护体系中的关键环节。本文…

一篇带你速通差分算法(C/C++)

个人主页&#xff1a;摆烂小白敲代码 创作领域&#xff1a;算法、C/C 持续更新算法领域的文章&#xff0c;让博主在您的算法之路上祝您一臂之力 欢迎各位大佬莅临我的博客&#xff0c;您的关注、点赞、收藏、评论是我持续创作最大的动力 差分算法是一种在计算机科学中常用的算法…