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

使用Pygame制作“走迷宫”游戏

1. 前言

迷宫游戏是最经典的 2D 游戏类型之一:在一个由墙壁和通道构成的地图里,玩家需要绕过障碍、寻找通路,最终抵达出口。它不但简单易实现,又兼具可玩性,还能在此基础上添加怪物、道具、机关等元素。本篇文章将展示如何在 Pygame 环境下,从零开始开发一个简易版的“迷宫游戏”。


2. 开发环境

  1. Python 3.x
  2. Pygame 库:若尚未安装,可使用 pip install pygame
  3. 桌面操作系统:Windows、macOS 或大多数 Linux。

在确保 import pygame 没有报错后,即可开始项目编写。


3. 设计思路

  1. 迷宫地图

    • 使用一个二维列表(二维数组)来表示迷宫。
    • 不同数字代表不同的地形或功能:
      • 0 表示可通行的地面;
      • 1 表示墙壁,玩家无法进入;
      • 2 表示出口,玩家走到此处表示胜利。
    • 也可以定义更多类型(比如 3 表示钥匙或道具),在本示例中暂不扩展。
  2. 地图渲染

    • 将迷宫的行列绘制成网格:每个格子用一定大小(如 40×40 像素)的矩形来表示;
    • 不同类型的格子绘制不同的颜色或贴图。
  3. 玩家

    • 记录玩家在迷宫网格中的坐标(例如 (row, col));
    • 通过方向键(上下左右)控制移动,每次移动到相邻格子;
    • 如果下一个格子是墙壁,则无法移动;如果是通道则可进入;如果是出口,则触发胜利。
  4. 胜利判定

    • 当玩家坐标到达一个带有 2 的格子,表示找到迷宫出口;
    • 游戏停止或弹出“通关”提示。
  5. 扩展

    • 在迷宫中添加钥匙、门、怪物、道具等机制;
    • 实现自动生成迷宫算法、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_row
        self.col = start_col

    def move(self, dr, dc):
        """
        尝试移动玩家:dr, dc分别表示行和列方向上的位移(-1, 0, +1)
        若下一格是墙壁,则无法移动
        """
        new_row = self.row + dr
        new_col = self.col + dc
        if 0 <= new_row < ROWS and 0 <= new_col < COLS:
            if MAZE_MAP[new_row][new_col] != 1:  # 不是墙壁就能走
                self.row = new_row
                self.col = new_col

    @property
    def x(self):
        return self.col * TILE_SIZE

    @property
    def y(self):
        return self.row * TILE_SIZE

# -----------------------------
# 主游戏函数
# -----------------------------
def main():
    # 初始化玩家位置:假设从 (1,1) 出发 (也可根据地图自定义)
    player = Player(1, 1)

    running = True
    game_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 = True
            running = False

        # 绘制场景
        screen.fill(BLACK)

        # 绘制迷宫
        for r in range(ROWS):
            for c in range(COLS):
                tile_type = MAZE_MAP[r][c]
                x = c * TILE_SIZE
                y = r * TILE_SIZE
                if 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()

主要逻辑解析

  1. 迷宫地图(MAZE_MAP)

    • 使用一个二维列表来存储迷宫。示例中尺寸为 10×10(行列),但你可以随意扩展或修改布局。
    • 0 表示地面可通行,1 表示墙壁不可通行,2 表示出口。
  2. Player(玩家)

    • 内部存储玩家在迷宫中的 (row, col) 网格坐标;
    • move(dr, dc) 用来尝试移动到相邻格子,若是墙壁则拒绝移动。
    • 通过属性 xy 将网格坐标转为像素坐标,用于在屏幕上绘制。
  3. 游戏循环

    • 处理键盘方向输入,调用 player.move(dr, dc)
    • 每帧绘制整个迷宫和玩家;
    • 若玩家到达 2(出口),标记为 game_won 并跳出循环。
  4. 结束界面

    • 在主循环结束后,根据 won 参数在屏幕中央显示文字,延时两秒再退出。

5. 运行效果

image.png


6. 总结

本篇示例通过一个二维数组简单地呈现了“迷宫”的概念,让玩家在 Pygame 中上下左右移动,并找到出口来取得胜利。
迷宫游戏的难度与趣味可以通过地图规模多种机制进一步提升:加上自动生成、怪物巡逻、钥匙门逻辑等,都能让该项目成为一个富有挑战性又无限可扩展的小作品。希望本文能帮助你掌握网格地图及碰撞检测的思路,并在游戏开发的道路上越走越远!


http://www.kler.cn/a/531117.html

相关文章:

  • Spring 面试题【每日20道】【其二】
  • 对象的实例化、内存布局与访问定位
  • 【PyTorch】7.自动微分模块:开启神经网络 “进化之门” 的魔法钥匙
  • 贪吃蛇实现
  • HarmonyOS简介:应用开发的机遇、挑战和趋势
  • openEuler系统磁盘管理方法
  • 54【ip+端口+根目录通信】
  • 【数据分析】案例04:豆瓣电影Top250的数据分析与Web网页可视化(numpy+pandas+matplotlib+flask)
  • 六百六十六,盐豆不带盐了
  • 解决SetWindowCompositionAttribute使控件文本透明的问题
  • git中文件的状态状态切换
  • 全栈开发:使用.NET Core WebAPI构建前后端分离的核心技巧(一)
  • 代码随想录算法训练营Day35
  • Docker 部署教程jenkins
  • 1-刷力扣问题记录
  • 学习并熟练使用MyBatis
  • Unity打包安卓报错sdk version 0.0 < 26.0(亲测解决)
  • 深度解读 Docker Swarm
  • OpenAI 实战进阶教程 - 第七节: 与数据库集成 - 生成 SQL 查询与优化
  • 98.2 AI量化开发:基于DeepSeek打造个人专属金融消息面-AI量化分析师(理论+全套Python代码)
  • I.MX6ULL 中断介绍下
  • 【linux学习指南】线程概念与控制
  • 【大数据技术】教程03:本机PyCharm远程连接虚拟机Python
  • 玩转ChatGPT:DeepSeek测评(科研思路梳理)
  • Codeforces Round 981 (Div. 3)
  • 【模块化编程关键字】C语言模块化编程关键技术及其应用研究