字数 1194,阅读大约需 6 分钟
用现代 Python 复刻 CakeGame:架构设计与核心决策
系列文章第 2 篇 / 共 5 篇基于 CakeGame (CGPD) 20220312 易语言源码分析
一、整体架构
┌─────────────────────────────────────────────────────────────┐│ CakeGame2026bot │├──────────────────────┬──────────────────┬───────────────────┤│ 消息网关层 │ 游戏引擎层 │ 数据持久层 ││ (NoneBot2) │ (core/) │ (SQLite3) │├──────────────────────┼──────────────────┼───────────────────┤│ • OneBot V11 接收 │ • 指令系统 │ • 30+ 数据表 ││ • 消息解析 │ • 战斗/伤害计算 │ • 数据库迁移 ││ • 速率限制 │ • 背包/物品 │ • 自动备份 ││ • 群屏蔽/接收 │ • 地图/移动 │ • 日志存储 │├──────────────────────┼──────────────────┼───────────────────┤│ 指令层 │ 图片生成层 │ 编辑器层 ││ (plugins/commands/) │ (core/presentation) │ (Web UI) │├──────────────────────┼──────────────────┼───────────────────┤│ • 用户指令 │ • 变量替换 │ • 数据管理 ││ • 战斗指令 │ • 文本→图片 │ • 版本迁移 ││ • 系统指令 │ • 消息模板 │ • 配置管理 │└──────────────────────┴──────────────────┴───────────────────┘
二、目录结构
CakeGame2026bot/├── bot.py # NoneBot2 入口├── pyproject.toml # 项目依赖├── .env.example # 环境变量模板├── 启动.bat # Windows 启动脚本│├── core/ # 核心引擎(框架无关,可独立测试)│ ├── models.py # SQLAlchemy ORM(30+ 表)│ ├── database.py # 数据库连接、迁移、备份│ ├── config.py # 配置管理│ ├── constants.py # 常量定义│ ├── user.py # 用户系统│ ├── inventory.py # 背包/物品系统│ ├── combat.py # 战斗系统│ ├── skill.py # 技能系统│ ├── map.py # 地图系统│ ├── quest.py # 任务系统│ ├── union.py # 公会系统│ ├── team.py # 队伍系统│ ├── synthesis.py # 合成系统│ ├── enhance.py # 装备强化│ ├── decomp.py # 物品分解│ ├── shop.py # 商店系统│ ├── monster.py # 怪物模型管理│ ├── presentation.py # 消息格式化、变量替换、图片生成│ └── event.py # 插件事件广播│├── plugins/│ ├── __init__.py # 事件预处理器│ ├── common.py # core/* 模块桥接│ ├── game.py # on_command 注册入口│ └── commands/ # 指令 handler│ ├── user.py # 喊话、注册、签到、修改昵称、查看角色│ ├── inventory.py # 查看背包、使用物品、丢弃物品、背包筛选│ ├── combat.py # 锁定目标、攻击、自动攻击、释放技能│ ├── map.py # 查看地图、进入地图、位置信息│ ├── quest.py # 我的任务、任务信息、领取、提交、放弃│ ├── union.py # 创建公会、公会列表、解散、退出、成员│ ├── team.py # 创建队伍、加入队伍│ ├── synthesis.py # 合成物品、查看合成、合成列表│ ├── enhance.py # 选择强化、确认强化│ ├── equip.py # 卸下装备、查看装备│ ├── occupation.py # 转换职业、职业列表、查看职业│ └── system.py # 帮助列表、查看帮助、JScript、自动查看│├── tests/ # Mock 测试├── tools/ # 工具├── data/ # 数据目录└── admin/ # Web 管理后台
三、核心设计决策
决策 1:core/plugins 分离
理由:团队已有 NoneBot2 项目(位面9066)验证了此架构的价值。core/ 不依赖 NoneBot,可直接用 mock 测试。plugins/commands/ 只做"翻译"——把 QQ 消息转成函数调用,再把结果转回消息。
数据流:
QQ 消息 → 消息网关 → 指令匹配 → core/ 游戏逻辑 → 消息处理 → 回复发送
决策 2:SQLite3 而非 MySQL
理由:
- • SRS 明确要求兼容原版 SQLite 数据库文件
决策 3:Pillow 替代 GDI+
理由:
- • GDI+ 是 Windows 专属,Pillow 跨平台
- • 输出 PNG 字节集,通过 OneBot 发送
决策 4:Web UI 替代 LibExDui
理由:
- • LibExDui 是易语言专属 UI 框架,无法移植
- • 编辑器功能用 FastAPI + HTML 实现更简洁
决策 5:纯文本优先,图片可选
理由:
- • 原版强制图片输出,但现代 QQ 群更接受纯文本
- • 配置项
image_mode: "text" | "image" 控制输出格式 - • 图片模式用 Pillow 生成,文本模式直接发送 Markdown 格式
四、与原版架构对比
系列文章第 2 篇完。下篇将介绍 Phase 实施规划。