---
title: 基于Python标准库实现的命令行推箱子游戏开发需求，包含核心BFS自动求解器与多级关卡设计
created: 2026-03-30
updated: 2026-03-30
type: summary
tags: ["game", "notes", "python", "sokoban", "telegram"]
external: http://go/ui/posts/2301/
status: inbox
---

请用 Python 实现一个可在命令行运行的推箱子游戏（Sokoban），所有代码写在单个 main.py 文件中，只使用标准库，代码总行数不超过 1000 行。

## 游戏规则

推箱子是一个仓库管理类益智游戏：
- 玩家（@）在地图上移动，可以推动箱子（$）
- 箱子被推到目标点（.）时变为已放置状态（*）
- 所有箱子放到目标点即通关
- 玩家和箱子均不能穿越墙壁（#）
- 玩家只能推一个箱子（不能拉），且箱子不能被推入墙壁或另一个箱子

## 关卡要求

游戏内置至少 3 个关卡，使用如下格式的字符地图表示（可硬编码）：

```
# = 墙
  = 空地（空格）
@ = 玩家初始位置
$ = 箱子
. = 目标点
* = 箱子已在目标点
+ = 玩家站在目标点上
```

第 1 关（简单，用于快速测试）示例：

```
#####
#   #
# $  #
#  .#
#@  #
#####
```

## 操作指令

游戏运行后进入命令行交互循环，每轮打印当前地图并提示玩家输入：

| 输入 | 动作 |
|------|------|
| w / W | 向上移动 |
| s / S | 向下移动 |
| a / A | 向左移动 |
| d / D | 向右移动 |
| u / U | 撤销上一步（undo，支持连续多步，历史不少于 20 步） |
| r / R | 重置当前关卡 |
| n / N | 下一关 |
| p / P | 上一关 |
| h / H | 触发自动求解器，输出提示路径（见下文）|
| q / Q | 退出游戏 |

任何不认识的输入给出友好提示，不崩溃。

## 显示要求

- 每次操作后清屏并重新渲染完整地图
- 显示当前步数（moves）
- 显示当前关卡编号
- 通关时显示明确的胜利信息（包含 "win" 或 "clear" 或 "congratulations" 字样）并询问是否进入下一关

## ★ 核心要求：内置自动求解器

这是本题最重要的功能，也是区分实现质量的关键。

按下 h/H 时，游戏必须：

1. 调用内置的推箱子求解器对**当前局面**进行搜索
2. 若找到解，打印出完整的移动路径（如：`解法：wasdwwasd...`，或逐步显示方向）
3. 若在合理时间内（建议 5 秒超时）找不到解，打印 `无解` 或 `未找到解`

**求解器要求：**
- 必须使用 **BFS（广度优先搜索）** 实现，保证找到最短解
- 搜索状态需要同时包含玩家位置和所有箱子位置
- 状态必须做去重（用集合/字典存储已访问状态），避免无限循环
- 当地图过大或解过长时需要有超时机制

**加分（可选）：** 实现 A* 搜索，使用箱子到最近目标的曼哈顿距离之和作为启发函数，提升搜索效率。

## 其他加分项（可选）

- 显示求解器找到的最优步数（par），与玩家当前步数对比
- 彩色输出（使用 ANSI 转义码）
- 求解器给出逐步提示（每次 h 只显示下一步）

## 关于代码质量

- 逻辑清晰，有适当注释
- 函数职责单一，避免超长函数
- main() 函数作为程序入口（必须）
- 求解器单独封装为函数/类

请直接输出完整可运行的 main.py，不要分段解释，代码写完整。
