使用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 中上下左右移动,并找到出口来取得胜利。
迷宫游戏的难度与趣味可以通过地图规模多种机制进一步提升:加上自动生成、怪物巡逻、钥匙门逻辑等,都能让该项目成为一个富有挑战性又无限可扩展的小作品。希望本文能帮助你掌握网格地图及碰撞检测的思路,并在游戏开发的道路上越走越远!

### 大模型对齐微调DPO方法详解 #### DPO简介 直接偏好优化(Direct Preference Optimization, DPO)是一种用于改进大型语言模型行为的技术,该技术通过结合奖励模型训练和强化学习来提升训练效率与稳定性[^1]。 #### 实现机制 DPO的核心在于它能够依据人类反馈调整模型输出的概率分布。具体来说,当给定一对候选响应时,DPO试图使更受偏好的那个选项具有更高的生成概率。这种方法不仅简化了传统强化学习所需的复杂环境设置,而且显著增强了模型对于多样化指令的理解能力和执行精度[^2]。 #### PAI平台上的实践指南 为了便于开发者实施这一先进理念,在PAI-QuickStart框架下提供了详尽的操作手册。这份文档覆盖了从环境配置直至完成整个微调流程所需的一切细节,包括但不限于数据准备、参数设定以及性能评估等方面的内容。尤其值得注意的是,针对阿里云最新发布的开源LLM——Qwen2系列,文中给出了具体的实例说明,使得即使是初次接触此类工作的用户也能顺利上手。 ```python from transformers import AutoModelForCausalLM, Trainer, TrainingArguments model_name_or_path = "qwen-model-name" tokenizer_name = model_name_or_path training_args = TrainingArguments( output_dir="./results", per_device_train_batch_size=8, num_train_epochs=3, ) trainer = Trainer( model_init=lambda: AutoModelForCausalLM.from_pretrained(model_name_or_path), args=training_args, train_dataset=train_dataset, ) # 假设已经定义好了train_dataset trainer.train() ``` 这段代码片段展示了如何使用Hugging Face库加载预训练模型并对其进行微调的过程。虽然这里展示的例子并不完全对应于DPO的具体实现方式,但它提供了一个基础模板供进一步定制化开发之用[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Damon小智

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值