使用Pygame制作“走迷宫”游戏
1. 前言
迷宫游戏是最经典的 2D 游戏类型之一:在一个由墙壁和通道构成的地图里,玩家需要绕过障碍、寻找通路,最终抵达出口。它不但简单易实现,又兼具可玩性,还能在此基础上添加怪物、道具、机关等元素。本篇文章将展示如何在 Pygame 环境下,从零开始开发一个简易版的“迷宫游戏”。
2. 开发环境
- Python 3.x
- Pygame 库:若尚未安装,可使用
pip install pygame - 桌面操作系统:Windows、macOS 或大多数 Linux。
在确保 import pygame 没有报错后,即可开始项目编写。
3. 设计思路
-
迷宫地图
- 使用一个二维列表(二维数组)来表示迷宫。
- 不同数字代表不同的地形或功能:
0表示可通行的地面;1表示墙壁,玩家无法进入;2表示出口,玩家走到此处表示胜利。
- 也可以定义更多类型(比如
3表示钥匙或道具),在本示例中暂不扩展。
-
地图渲染
- 将迷宫的行列绘制成网格:每个格子用一定大小(如 40×40 像素)的矩形来表示;
- 不同类型的格子绘制不同的颜色或贴图。
-
玩家
- 记录玩家在迷宫网格中的坐标(例如
(row, col)); - 通过方向键(上下左右)控制移动,每次移动到相邻格子;
- 如果下一个格子是墙壁,则无法移动;如果是通道则可进入;如果是出口,则触发胜利。
- 记录玩家在迷宫网格中的坐标(例如
-
胜利判定
- 当玩家坐标到达一个带有
2的格子,表示找到迷宫出口; - 游戏停止或弹出“通关”提示。
- 当玩家坐标到达一个带有
-
扩展
- 在迷宫中添加钥匙、门、怪物、道具等机制;
- 实现自动生成迷宫算法、AI 寻路、计时器、排行榜等增强功能。
4. 完整示例代码
将以下示例保存为 maze_game.py 并运行。你可以在里面更改地图的大小、布局、颜色等,实现更多个性化。
import pygame
import sys# 初始化 Pygame
pygame.init()# -----------------------------
# 全局配置
# -----------------------------
TILE_SIZE = 40 # 每个方格的像素大小
FPS = 30# 颜色定义 (R, G, B)
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
GRAY = (128, 128, 128)
GREEN = (0, 200, 0)
BLUE = (0, 0, 255)
BROWN = (139, 69, 19)# 迷宫地图:0-通道,1-墙壁,2-出口
# 你可自由调整此二维列表,打造不同迷宫关卡
MAZE_MAP = [[1,1,1,1,1,1,1,1,1,1],[1,0,0,0,1,0,0,0,0,1],[1,0,1,0,0,0,1,1,0,1],[1,0,1,0,1,0,1,0,0,1],[1,0,0,0,1,0,0,0,1,1],[1,1,1,0,1,1,1,0,1,1],[1,0,1,0,0,0,0,0,0,1],[1,0,1,1,1,1,1,1,0,1],[1,0,0,0,0,0,2,0,0,1],[1,1,1,1,1,1,1,1,1,1]
]ROWS = len(MAZE_MAP)
COLS = len(MAZE_MAP[0])# 创建窗口
SCREEN_WIDTH = COLS * TILE_SIZE
SCREEN_HEIGHT = ROWS * TILE_SIZE
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
pygame.display.set_caption("迷宫游戏 - Pygame 示例")clock = pygame.time.Clock()
font = pygame.font.SysFont("arial", 32)# -----------------------------
# 玩家类
# -----------------------------
class Player:def __init__(self, start_row, start_col):self.row = start_rowself.col = start_coldef move(self, dr, dc):"""尝试移动玩家:dr, dc分别表示行和列方向上的位移(-1, 0, +1)若下一格是墙壁,则无法移动"""new_row = self.row + drnew_col = self.col + dcif 0 <= new_row < ROWS and 0 <= new_col < COLS:if MAZE_MAP[new_row][new_col] != 1: # 不是墙壁就能走self.row = new_rowself.col = new_col@propertydef x(self):return self.col * TILE_SIZE@propertydef y(self):return self.row * TILE_SIZE# -----------------------------
# 主游戏函数
# -----------------------------
def main():# 初始化玩家位置:假设从 (1,1) 出发 (也可根据地图自定义)player = Player(1, 1)running = Truegame_won = False # 是否已通关while running:clock.tick(FPS)for event in pygame.event.get():if event.type == pygame.QUIT:running = False# 键盘输入 (上下左右)keys = pygame.key.get_pressed()if keys[pygame.K_UP]:player.move(-1, 0)elif keys[pygame.K_DOWN]:player.move(1, 0)elif keys[pygame.K_LEFT]:player.move(0, -1)elif keys[pygame.K_RIGHT]:player.move(0, 1)# 检测是否到达出口if MAZE_MAP[player.row][player.col] == 2:game_won = Truerunning = False# 绘制场景screen.fill(BLACK)# 绘制迷宫for r in range(ROWS):for c in range(COLS):tile_type = MAZE_MAP[r][c]x = c * TILE_SIZEy = r * TILE_SIZEif tile_type == 1:# 墙壁pygame.draw.rect(screen, BROWN, (x, y, TILE_SIZE, TILE_SIZE))elif tile_type == 2:# 出口pygame.draw.rect(screen, BLUE, (x, y, TILE_SIZE, TILE_SIZE))else:# 通道pygame.draw.rect(screen, GRAY, (x, y, TILE_SIZE, TILE_SIZE))# 绘制玩家(用绿色方块表示)pygame.draw.rect(screen, GREEN, (player.x, player.y, TILE_SIZE, TILE_SIZE))pygame.display.flip()# 游戏结束,显示结果game_over(game_won)def game_over(won):screen.fill(BLACK)if won:msg = "恭喜通关!"else:msg = "游戏已退出"label = font.render(msg, True, WHITE)rect = label.get_rect(center=(SCREEN_WIDTH//2, SCREEN_HEIGHT//2))screen.blit(label, rect)pygame.display.flip()pygame.time.wait(2000)pygame.quit()sys.exit()if __name__ == "__main__":main()
主要逻辑解析
-
迷宫地图(MAZE_MAP)
- 使用一个二维列表来存储迷宫。示例中尺寸为 10×10(行列),但你可以随意扩展或修改布局。
0表示地面可通行,1表示墙壁不可通行,2表示出口。
-
Player(玩家)
- 内部存储玩家在迷宫中的
(row, col)网格坐标; move(dr, dc)用来尝试移动到相邻格子,若是墙壁则拒绝移动。- 通过属性
x、y将网格坐标转为像素坐标,用于在屏幕上绘制。
- 内部存储玩家在迷宫中的
-
游戏循环
- 处理键盘方向输入,调用
player.move(dr, dc); - 每帧绘制整个迷宫和玩家;
- 若玩家到达
2(出口),标记为game_won并跳出循环。
- 处理键盘方向输入,调用
-
结束界面
- 在主循环结束后,根据
won参数在屏幕中央显示文字,延时两秒再退出。
- 在主循环结束后,根据
5. 运行效果

6. 总结
本篇示例通过一个二维数组简单地呈现了“迷宫”的概念,让玩家在 Pygame 中上下左右移动,并找到出口来取得胜利。
迷宫游戏的难度与趣味可以通过地图规模与多种机制进一步提升:加上自动生成、怪物巡逻、钥匙门逻辑等,都能让该项目成为一个富有挑战性又无限可扩展的小作品。希望本文能帮助你掌握网格地图及碰撞检测的思路,并在游戏开发的道路上越走越远!
相关文章:
使用Pygame制作“走迷宫”游戏
1. 前言 迷宫游戏是最经典的 2D 游戏类型之一:在一个由墙壁和通道构成的地图里,玩家需要绕过障碍、寻找通路,最终抵达出口。它不但简单易实现,又兼具可玩性,还能在此基础上添加怪物、道具、机关等元素。本篇文章将展示…...
AJAX案例——图片上传个人信息操作
黑马程序员视频地址: AJAX-Day02-11.图片上传https://www.bilibili.com/video/BV1MN411y7pw?vd_source0a2d366696f87e241adc64419bf12cab&spm_id_from333.788.videopod.episodes&p26 图片上传 <!-- 文件选择元素 --><input type"file"…...
Day35-【13003】短文,什么是双端队列?栈和队列的互相模拟,以及解决队列模拟栈时出栈时间开销大的方法
文章目录 第三节进一步讨论栈和队列双端队列栈和队列的相互模拟使用栈来模拟队列类型定义入队出队判空,判满 使用队列来模拟栈类型定义初始化清空操作判空,判满栈长度输出入栈出栈避免出栈时间开销大的方法 第三节进一步讨论栈和队列 双端队列 假设你芷…...
力扣 55. 跳跃游戏
🔗 https://leetcode.cn/problems/jump-game 题目 给一个数组 nums,最开始在 index 0,每次可以跳跃的区间是 0-nums[i]判断是否可以跳到数组末尾 思路 题解是用贪心,实际上模拟也可以过遍历可以到达的下标,判断其可…...
深入剖析 HTML5 新特性:语义化标签和表单控件完全指南
系列文章目录 01-从零开始学 HTML:构建网页的基本框架与技巧 02-HTML常见文本标签解析:从基础到进阶的全面指南 03-HTML从入门到精通:链接与图像标签全解析 04-HTML 列表标签全解析:无序与有序列表的深度应用 05-HTML表格标签全面…...
本地快速部署DeepSeek-R1模型——2025新年贺岁
一晃年初六了,春节长假余额马上归零了。今天下午在我的电脑上成功部署了DeepSeek-R1模型,抽个时间和大家简单分享一下过程: 概述 DeepSeek模型 是一家由中国知名量化私募巨头幻方量化创立的人工智能公司,致力于开发高效、高性能…...
MVC 文件夹:架构之美与实际应用
MVC 文件夹:架构之美与实际应用 引言 MVC(Model-View-Controller)是一种设计模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种架构模式不仅提高了代码的可维护性和可扩展性,而且使得开发流程更加清晰。本文将深入探讨MVC文…...
Redis --- 秒杀优化方案(阻塞队列+基于Stream流的消息队列)
下面是我们的秒杀流程: 对于正常的秒杀处理,我们需要多次查询数据库,会给数据库造成相当大的压力,这个时候我们需要加入缓存,进而缓解数据库压力。 在上面的图示中,我们可以将一条流水线的任务拆成两条流水…...
如何确认设备文件 /dev/fb0 对应的帧缓冲设备是开发板上的LCD屏?如何查看LCD屏的属性信息?
要判断 /dev/fb0 是否对应的是 LCD 屏幕,可以通过以下几种方法: 方法 1:使用 fbset 命令查看帧缓冲设备的属性信息 Linux 的 帧缓冲设备(Framebuffer) 通常在 /dev/fbX 下,/dev/fb0 一般是主屏幕ÿ…...
C++多线程编程——基于策略模式、单例模式和简单工厂模式的可扩展智能析构线程
1. thread对象的析构问题 在 C 多线程标准库中,创建 thread 对象后,必须在对象析构前决定是 detach 还是 join。若在 thread 对象销毁时仍未做出决策,程序将会终止。 然而,在创建 thread 对象后、调用 join 前的代码中ÿ…...
AI与SEO关键词的完美结合如何提升网站流量与排名策略
内容概要 在当今数字营销环境中,内容的成功不仅依赖于高质量的创作,还包括高效的关键词策略。AI与SEO关键词的结合,正是这一趋势的重要体现。 AI技术在SEO中的重要性 在数字营销领域,AI技术的引入为SEO策略带来了前所未有的变革。…...
保姆级教程Docker部署Kafka官方镜像
目录 一、安装Docker及可视化工具 二、单节点部署 1、创建挂载目录 2、运行Kafka容器 3、Compose运行Kafka容器 4、查看Kafka运行状态 三、集群部署 在Kafka2.8版本之前,Kafka是强依赖于Zookeeper中间件的,这本身就很不合理,中间件依赖…...
解析PHP文件路径相关常量
PHP文件路径相关常量包括以下几个常量: __FILE__:表示当前文件的绝对路径,包括文件名。 __DIR__:表示当前文件所在的目录的绝对路径,不包括文件名。 dirname(__FILE__):等同于__DIR__,表示当前…...
WPS计算机二级•幻灯片的配色、美化与动画
听说这是目录哦 配色基础颜色语言❤️使用配色方案🩷更改PPT的颜色🧡PPT动画添加的原则💛PPT绘图工具💚自定义设置动画💙使用动画刷复制动画效果🩵制作文字打字机效果💜能量站😚 配色…...
C#,shell32 + 调用控制面板项(.Cpl)实现“新建快捷方式对话框”(全网首发)
Made By 于子轩,2025.2.2 不管是使用System.IO命名空间下的File类来创建快捷方式文件,或是使用Windows Script Host对象创建快捷方式,亦或是使用Shell32对象创建快捷方式,都对用户很不友好,今天小编为大家带来一种全新…...
单纯信息展示的站点是否可以用UML建模
凌钦亮 More options Aug 7 2010, 10:36 am 现在社会上大量的网站需求都还只是用于单纯的企业信息展示,那此种网站是否有必要用UML 建模呢?业务用例图的一个个用例是用来卖的,但是他只有信息展示这个需 求,我是否在划分业务用例…...
FinRobot:一个使用大型语言模型的金融应用开源AI代理平台
“FinRobot: An Open-Source AI Agent Platform for Financial Applications using Large Language Models” 论文地址:https://arxiv.org/pdf/2405.14767 Github地址:https://github.com/AI4Finance-Foundation/FinRobot 摘要 在金融领域与AI社区间&a…...
【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】2.19 线性代数核武器:BLAS/LAPACK深度集成
2.19 线性代数核武器:BLAS/LAPACK深度集成 目录 #mermaid-svg-yVixkwXWUEZuu02L {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-yVixkwXWUEZuu02L .error-icon{fill:#552222;}#mermaid-svg-yVixkwXWUEZ…...
开发板目录 /usr/lib/fonts/ 中的字体文件 msyh.ttc 的介绍【微软雅黑(Microsoft YaHei)】
本文是博文 https://blog.csdn.net/wenhao_ir/article/details/145433648 的延伸扩展。 本文是博文 https://blog.csdn.net/wenhao_ir/article/details/145433648 的延伸扩展。 问:运行 ls /usr/lib/fonts/ 发现有一个名叫 msyh.ttc 的字体文件,能介绍…...
Love Tester:探索爱情的深度与维度
爱情是什么?是相互帮助、耐心、理解、鼓励、保护、可靠和牺牲。Love Tester 通过先进的算法,分析名字的兼容性和关系的潜力,帮助你计算爱情匹配的准确性。 相互帮助:在伴侣遇到困难时伸出援手,这是爱情的体现。耐心&a…...
Python|GIF 解析与构建(5):手搓截屏和帧率控制
目录 Python|GIF 解析与构建(5):手搓截屏和帧率控制 一、引言 二、技术实现:手搓截屏模块 2.1 核心原理 2.2 代码解析:ScreenshotData类 2.2.1 截图函数:capture_screen 三、技术实现&…...
3.3.1_1 检错编码(奇偶校验码)
从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…...
从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路
进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...
STM32F4基本定时器使用和原理详解
STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...
JVM垃圾回收机制全解析
Java虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称GC)是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象,从而释放内存空间,避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...
生成 Git SSH 证书
🔑 1. 生成 SSH 密钥对 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 参数说明: -t rsa&#x…...
MySQL账号权限管理指南:安全创建账户与精细授权技巧
在MySQL数据库管理中,合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号? 最小权限原则…...
Android第十三次面试总结(四大 组件基础)
Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成,用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机: onCreate() 调用时机:Activity 首次创建时调用。…...
Linux 内存管理实战精讲:核心原理与面试常考点全解析
Linux 内存管理实战精讲:核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用,还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...
接口自动化测试:HttpRunner基础
相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具,支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议,涵盖接口测试、性能测试、数字体验监测等测试类型…...
