基于深度优先搜索(DFS)算法自动生成迷宫的python走迷宫游戏

目录

1. 前期准备

2. DFS 算法生成迷宫

3. 键盘操作

4. 判断游戏胜利

5. 游戏截图

6. 完整游戏代码


本文将用pygame实现迷宫的游戏,因为迷宫的地图需要提前生成,这样每次游戏地图都是一样的。而深度优先搜索(DFS)算法可以自动计算迷宫的最优路径,那么根据这个算法就可以自动生成迷宫小游戏,这样每次打开游戏都会是新的游戏!

1. 前期准备

  1. 迷宫生成算法:使用深度优先搜索(DFS)算法生成迷宫。迷宫初始化为全墙壁(1 表示墙壁,0 表示通路),从起点 (1, 1) 开始递归打通路径,确保生成的迷宫是连通的。

  2. 迷宫大小:游戏的复杂程度通过迷宫的大小控制,这里通过MAZE_WIDTHMAZE_HEIGHT参数控制

  3. 玩家和出口:玩家出生点固定在 (1, 1),出口固定在 (MAZE_WIDTH - 2, MAZE_HEIGHT - 2)

import pygame
import sys
import random# 初始化pygame
pygame.init()# 设置屏幕大小
SCREEN_WIDTH = 800
SCREEN_HEIGHT = 800
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
pygame.display.set_caption("迷宫游戏 - 自动生成")# 定义颜色
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)# 定义迷宫大小
MAZE_WIDTH = 25  # 迷宫的宽度(必须是奇数)
MAZE_HEIGHT = 25  # 迷宫的高度(必须是奇数)# 定义方块大小
BLOCK_SIZE = SCREEN_WIDTH // MAZE_WIDTH# 定义玩家初始位置
player_x, player_y = 1, 1# 定义出口位置
exit_x, exit_y = MAZE_WIDTH - 2, MAZE_HEIGHT - 2

2. DFS 算法生成迷宫

DFS(深度优先搜索,Depth-First Search)是一种用于遍历或搜索树或图的算法。其核心思想是从一个起始节点开始,沿着一条路径尽可能深入地探索,直到无法继续为止,然后回溯并探索其他路径。

DFS的基本步骤

  1. 选择起始节点:从图或树中选择一个起始节点。

  2. 标记已访问:访问当前节点,并将其标记为已访问。

  3. 递归探索邻居:对于当前节点的每一个未访问的邻居节点,递归地调用DFS。

  4. 回溯:当没有未访问的邻居节点时,回溯到上一个节点,继续探索其他路径。

# 生成迷宫的DFS算法
def generate_maze(width, height):# 初始化迷宫,全部为墙壁maze = [[1 for _ in range(width)] for _ in range(height)]# DFS生成迷宫def dfs(x, y):maze[y][x] = 0  # 打通当前单元格directions = [(1, 0), (-1, 0), (0, 1), (0, -1)]random.shuffle(directions)  # 随机打乱方向for dx, dy in directions:nx, ny = x + dx * 2, y + dy * 2  # 下一个单元格if 0 <= nx < width and 0 <= ny < height and maze[ny][nx] == 1:maze[y + dy][x + dx] = 0  # 打通中间的墙dfs(nx, ny)dfs(1, 1)  # 从起点开始生成maze[1][1] = 0  # 起点maze[exit_y][exit_x] = 0  # 终点return maze# 生成迷宫
maze = generate_maze(MAZE_WIDTH, MAZE_HEIGHT)

3. 键盘操作

通过pygame获取键盘的操作,这里用上下左右控制

    # 获取键盘输入keys = pygame.key.get_pressed()if keys[pygame.K_UP]:if maze[player_y - 1][player_x] == 0:player_y -= 1if keys[pygame.K_DOWN]:if maze[player_y + 1][player_x] == 0:player_y += 1if keys[pygame.K_LEFT]:if maze[player_y][player_x - 1] == 0:player_x -= 1if keys[pygame.K_RIGHT]:if maze[player_y][player_x + 1] == 0:player_x += 1

4. 判断游戏胜利

游戏胜利很简单,当玩家的位置走到出口的位置就行了

    # 检查是否到达出口if player_x == exit_x and player_y == exit_y:font = pygame.font.Font(None, 74)text = font.render('You Win!', True, GREEN)screen.blit(text, (SCREEN_WIDTH // 2 - 100, SCREEN_HEIGHT // 2 - 50))pygame.display.flip()pygame.time.wait(3000)running = False

5. 游戏截图

 

6. 完整游戏代码

游戏代码:

import pygame
import sys
import random# 初始化pygame
pygame.init()# 设置屏幕大小
SCREEN_WIDTH = 800
SCREEN_HEIGHT = 800
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
pygame.display.set_caption("迷宫游戏 - 自动生成")# 定义颜色
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)# 定义迷宫大小
MAZE_WIDTH = 51  # 迷宫的宽度(必须是奇数)
MAZE_HEIGHT = 51  # 迷宫的高度(必须是奇数)# 定义方块大小
BLOCK_SIZE = SCREEN_WIDTH // MAZE_WIDTH# 定义玩家初始位置
player_x, player_y = 1, 1# 定义出口位置
exit_x, exit_y = MAZE_WIDTH - 2, MAZE_HEIGHT - 2# 生成迷宫的DFS算法
def generate_maze(width, height):# 初始化迷宫,全部为墙壁maze = [[1 for _ in range(width)] for _ in range(height)]# DFS生成迷宫def dfs(x, y):maze[y][x] = 0  # 打通当前单元格directions = [(1, 0), (-1, 0), (0, 1), (0, -1)]random.shuffle(directions)  # 随机打乱方向for dx, dy in directions:nx, ny = x + dx * 2, y + dy * 2  # 下一个单元格if 0 <= nx < width and 0 <= ny < height and maze[ny][nx] == 1:maze[y + dy][x + dx] = 0  # 打通中间的墙dfs(nx, ny)dfs(1, 1)  # 从起点开始生成maze[1][1] = 0  # 起点maze[exit_y][exit_x] = 0  # 终点return maze# 生成迷宫
maze = generate_maze(MAZE_WIDTH, MAZE_HEIGHT)# 游戏主循环
running = True
while running:for event in pygame.event.get():if event.type == pygame.QUIT:running = False# 获取键盘输入keys = pygame.key.get_pressed()if keys[pygame.K_UP]:if maze[player_y - 1][player_x] == 0:player_y -= 1if keys[pygame.K_DOWN]:if maze[player_y + 1][player_x] == 0:player_y += 1if keys[pygame.K_LEFT]:if maze[player_y][player_x - 1] == 0:player_x -= 1if keys[pygame.K_RIGHT]:if maze[player_y][player_x + 1] == 0:player_x += 1# 清屏screen.fill(WHITE)# 绘制迷宫for y in range(MAZE_HEIGHT):for x in range(MAZE_WIDTH):if maze[y][x] == 1:pygame.draw.rect(screen, BLACK, (x * BLOCK_SIZE, y * BLOCK_SIZE, BLOCK_SIZE, BLOCK_SIZE))elif x == exit_x and y == exit_y:pygame.draw.rect(screen, RED, (x * BLOCK_SIZE, y * BLOCK_SIZE, BLOCK_SIZE, BLOCK_SIZE))elif x == 1 and y == 1:pygame.draw.rect(screen, GREEN, (x * BLOCK_SIZE, y * BLOCK_SIZE, BLOCK_SIZE, BLOCK_SIZE))# 绘制玩家pygame.draw.rect(screen, BLUE, (player_x * BLOCK_SIZE, player_y * BLOCK_SIZE, BLOCK_SIZE, BLOCK_SIZE))# 检查是否到达出口if player_x == exit_x and player_y == exit_y:font = pygame.font.Font(None, 74)text = font.render('You Win!', True, GREEN)screen.blit(text, (SCREEN_WIDTH // 2 - 100, SCREEN_HEIGHT // 2 - 50))pygame.display.flip()pygame.time.wait(3000)running = False# 更新屏幕pygame.display.flip()# 控制帧率pygame.time.Clock().tick(20)# 退出游戏
pygame.quit()
sys.exit()

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/69989.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

github - 使用

注册账户以及创建仓库 要想使用github第一步当然是注册github账号了, github官网地址:https://github.com/。 之后就可以创建仓库了(免费用户只能建公共仓库),Create a New Repository,填好名称后Create,之后会出现一些仓库的配置信息,这也是一个git的简单教程。 Git…

基于Odoo的数据中台建设:助力企业数据驱动决策

在数字化时代&#xff0c;数据已成为企业最宝贵的资产之一。数据中台作为企业数字化转型的核心&#xff0c;承担着整合数据资源、优化业务流程、提升决策效率的重要使命。Odoo作为全球领先的开源ERP系统&#xff0c;凭借其强大的数据整合与分析能力&#xff0c;正在成为企业构建…

如何使用DHTMLX Scheduler的拖放功能,在 JS 日程安排日历中创建一组相同的事件

DHTMLX Scheduler 是一个全面的调度解决方案&#xff0c;涵盖了与规划事件相关的广泛需求。假设您在我们的 Scheduler 文档中找不到任何功能&#xff0c;并且希望在我们的 Scheduler 文档中看到您的项目。在这种情况下&#xff0c;很可能可以使用自定义解决方案来实现此类功能。…

往年5级考题(c++)

考级在即&#xff0c;这篇文章就来看看往年的c5级考试真题 逃离迷宫 题目描述 你在一个地下迷宫中找到了宝藏&#xff0c;但是也触发了迷宫机关&#xff0c;导致迷宫将在T分钟后坍塌&#xff0c;为此你需要在T分钟内逃离迷宫&#xff0c;你想知道你能不能逃离迷宫。 迷宫是一…

总结:如何在SpringBoot中使用https协议以及自签证书?

总结&#xff1a;如何在SpringBoot中使用https协议以及自签证书&#xff1f; 前提一&#xff1a;什么是http协议&#xff1f;前提二&#xff1a;什么是https协议&#xff1f;一生成自签证书二 将证书转换为PKCS12格式三 配置SpringBoot&#xff08;1&#xff09;修改配置文件&a…

Humanoid Robot Price Break 人形机器人价格突破

Humanoid Robot Price Break 人形机器人价格突破 中国机器人制造商宇树科技&#xff08;Unitree&#xff09;和EngineAI在2025年CES展会上展示的人形机器人。这些机器人价格相对较低&#xff0c;功能较为先进&#xff0c;有望将人形机器人技术从实验室或工业场景推向日常生活应…

用大模型学大模型03-数学基础 概率论 最大似然估计(MLE)最大后验估计(MAP)

https://metaso.cn/s/r4kq4Ni 什么是最大似然估计&#xff08;MLE&#xff09;最大后验估计&#xff08;MAP&#xff09;&#xff1f;深度学习中如何应用&#xff0c;举例说明。 好的&#xff0c;我现在需要回答关于最大似然估计&#xff08;MLE&#xff09;和最大后验估计&…

基于 Filebeat 的日志收集

在现代分布式系统中&#xff0c;日志数据作为关键的监控与故障排查依据&#xff0c;越来越受到重视。本文将深入探讨 Filebeat 的技术原理、配置方法及在 ELK&#xff08;Elasticsearch、Logstash、Kibana&#xff09;生态系统中的应用&#xff0c;帮助开发者构建高效、稳定的日…

【新品解读】AI 应用场景全覆盖!解码超高端 VU+ FPGA 开发平台 AXVU13F

「AXVU13F」Virtex UltraScale XCVU13P Jetson Orin NX 继发布 AMD Virtex UltraScale FPGA PCIE3.0 开发平台 AXVU13P 后&#xff0c;ALINX 进一步研究尖端应用市场&#xff0c;面向 AI 场景进行优化设计&#xff0c;推出 AXVU13F。 AXVU13F 和 AXVU13P 采用相同的 AMD Vir…

【去雨去雾小工具】用python实现去雨去雾的小工具

目录 🍓🍓1.效果 🍂🍂2.去雨功能实现 🍇2.1训练模型: 🍇2.2保存模型: 🙋🙋3.去雾功能实现 🐸🐸4.python代码实现可视化界面 🍋4.1完整代码 🍋4.2代码解释 1. 创建主窗口 2. 创建原始图像显示区域 3. 创建去雨后图像显示区域 4. …

使用python脚本提取html网页上的所有文本信息

你可以使用 BeautifulSoup 库来提取 HTML 网页上的所有文本信息。以下是一个示例脚本&#xff1a; 步骤 安装 beautifulsoup4 和 requests&#xff08;如果尚未安装&#xff09;&#xff1a; pip install beautifulsoup4 requestsPython 脚本&#xff1a; import requests fro…

11.推荐系统的安全与隐私保护

接下来我们将学习推荐系统的安全与隐私保护。在推荐系统中&#xff0c;用户的数据是至关重要的资产。保护用户的隐私和数据安全&#xff0c;不仅是法律和道德的要求&#xff0c;也是提升用户信任和满意度的关键因素。在这一课中&#xff0c;我们将介绍以下内容&#xff1a; 推…

k8s优雅操作pod容器组

k8s优雅操作pod容器组 回退备份 kubectl get deploy deployName -o yaml>>deployName-bak-date "%Y-%m-%d".yaml获取副本数 replicasecho | kubectl get -o template deploy/deployName --template{{.spec.replicas}}停止容器组 kubectl scale deployment …

DeepSeek R1打造本地化RAG知识库

本文将详细介绍如何使用Ollama、Deepseek R1大语音模型、Nomic-Embed-Text向量模型和AnythingLLM共同搭建一个本地的私有RAG知识库。 一. 准备工作 什么是RAG&#xff1f; RAG是一种结合了信息检索和大模型&#xff08;LLM&#xff09;的技术&#xff0c;在对抗大模型幻觉、…

Node.js使用教程

Node.js使用教程 Node.js是一个基于Chrome V8引擎的JavaScript运行环境&#xff0c;它让JavaScript运行在服务器端。以下是一个简单的Node.js使用教程&#xff1a; 一、 Node.js开发环境和编译 1.1 安装Node.js 访问Node.js官网下载并安装适合您操作系统的Node.js版本。 1…

MySQL和SQL server的区别

在当今数据驱动的世界里&#xff0c;数据库技术的选择对于企业和个人开发者来说至关重要。MySQL 和 SQL Server 是两个广泛使用的数据库管理系统&#xff08;DBMS&#xff09;&#xff0c;它们各自拥有独特的优势和适用场景。本文将深入探讨这两个数据库系统之间的区别&#xf…

从零开始人工智能Matlab案例-粒子群优化

目标&#xff1a;求解Rastrigin函数最小值&#xff08;多峰测试函数&#xff09; 粒子群优化算法是一种基于群体智能的优化算法&#xff0c;模拟了鸟群或鱼群等群体的行为&#xff0c;通过粒子在搜索空间中的移动来寻找最优解。 % PSO参数 nParticles 30; % 粒子数量 max…

无人机遥感图像拼接及处理教程

无人机遥感图像采集流程&#xff1a; 无人机遥感监测 无人机航线规划设计 无人机飞行软件操作 无人机航拍一般过程 无人机遥感图像拼接软件&#xff1a; Photoscan软件 软件基本操作 遥感图像拼接的一般流程 遥感图像分组拼接与点云分类 无人机遥感图像拼接&#xff1a; 基于无…

LeetCode每日精进:876.链表的中间结点

题目链接&#xff1a;876.链表的中间结点 题目描述&#xff1a; 给你单链表的头结点 head &#xff0c;请你找出并返回链表的中间结点。 如果有两个中间结点&#xff0c;则返回第二个中间结点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[3,4,5…

Vue 发送 PDF 文件链接到 WinForm 程序进行打印

Vue 发送 PDF 文件链接到 WinForm 程序进行打印的完整流程如下&#xff1a; 1. Vue 端 Vue 通过 fetch 或 axios 发送 PDF 文件的 URL 给 WinForms 程序&#xff08;WinForms 需要开启一个本地 API&#xff09;。 <template><div><button click"sendPri…