
DSH Minigames
☆ 2DSH Web UI 右侧小游戏面板:18 款离线小游戏(恐龙跳一跳 / 俄罗斯方块 / 坦克大战 / 扫雷 / 2048 / 数独 / 吃豆人 / 跟枪练习等),可扩展游戏注册表,等待模型回复或修 bug 时的摸鱼神器
Get this plugin
Review the source, then continue to the publisher.
dsh plugin add @dsh-external/dsh-minigames@latestAbout this plugin
Source snapshot 8/13/2026dsh-minigames
简体中文 | English
DSH Web UI 右侧小游戏面板:等待模型回复或修 bug 时的摸鱼神器。
- 折叠态:浏览器右缘一条小竖条(🎮),不占空间。
- 展开态:点击后占据窗口右半部分(默认 50vw,可拖左缘调整 360px–80vw), 面板内自由选择游戏。
- 游戏(全部离线、零资源文件、Canvas 绘制):
- 🦖 恐龙跳一跳 —— Chrome 经典小恐龙(昼夜/雨天);
- 🧱 俄罗斯方块 —— 经典下落消除;
- 🛡️ 坦克大战(带 AI) —— 2D 坦克对战,敌军追踪 + 视线开火,共 3 波;
- 💎 消消乐 —— 点击消除四连通同色块,目标分过关、逐关递增;
- 🔢 华容道 —— 16 格数字华容道(15-puzzle),滑动方块按序排列,用时越短分越高;
- 🐍 贪吃蛇 —— 经典贪吃蛇,穿越边界会从对侧出现(环面地图);
- 🔢 2048 —— 方向键滑动合并数字,合成 2048 即达成;
- 💣 扫雷 —— 左键翻开、右键标旗、双击数字自动展开周围;
- 🃏 记忆翻牌 —— 翻开两张配对,步数越少分越高;
- ⚫ 五子棋 vs AI —— 15×15,AI 会进攻也会堵你;
- 🦘 跳一跳 —— 按住蓄力、松开起跳,落点越准加分越多;
- 🧱 打砖块 —— 移动挡板反弹小球,清完进入下一关、球速递增;
- 🔨 打地鼠 —— 30 秒限时点击打地鼠,命中 +1、打空 -1;
- ⚫ 黑白棋 vs AI —— 8×8 奥赛罗,角最重要,无棋可下自动让位;
- 🐦 Flappy —— 点击/空格振翅穿过柱子缝隙,越远分越高;
- 🧩 数独 —— 9×9 标准数独,D 键切换难度,填满无冲突即胜;
- 🟡 吃豆人 —— 经典迷宫吃豆,力量豆可反吃幽灵;
- 🎯 跟枪练习 —— FPS 跟枪:锁定鼠标转视角压住三维漂移靶子,左键射击有后坐力。
- 预留扩展接口:游戏注册表(
registerGame),新增游戏只需实现一个接口。 - 体验细节:折叠面板/切换标签页时自动暂停游戏、恢复时继续;每局最高分存 localStorage;键盘输入只在点击游戏区域后生效,不会劫持聊天输入框。
- 尺寸自适应:游戏画布按面板真实可用空间自适应(工具条+画布+按键提示整体 始终完整展示,不出现滚动条;浏览器缩放/面板拖宽缩窄都会自动重排),宽高上限 960px。
版本兼容 / Version compatibility
兼容 DSH snapshot0810(snapshots/20260810T155924Z)、snapshot0811(snapshots/20260811T152241Z)与最终快照 snapshot0812(snapshots/20260812T172954Z-final):纯浏览器端 bundle(node half 仅 loader 占位),客户端元数据声明为嵌套 dsh.client——0810 的 ClientModuleHostService 只读该字段,顶层 dshClient 会被静默忽略(无日志无报错,插件不进 boot 图)。0810 实机验证通过;0811 与 0812 最终快照实机 boot 验证通过(见下)。
npm 发版兼容:兼容 DSH npm 发版 @deepseek-ai/dsh@0.0.1-rc.5(dist-tag next,即最终快照 snapshot0812 的 npm 发版;npm exec -p @deepseek-ai/dsh@0.0.1-rc.5 -- dsh --profile web --port <port> 可访问指定版本并启动,lib 生产模式),同时保持兼容 @deepseek-ai/dsh@0.0.1-rc.2(snapshot0811 的 npm 发版)。实测(npm rc.5 基线):dsh web 启动后 window.__DSH_BOOT__ 清单包含 @dsh-external/dsh-minigames,/plugins/@dsh-external/dsh-minigames/client.js 返回 200;typecheck、build 与 201 个单测通过。注意:0811 起 vendored cordis 更名为 @deepseek-ai/cordis(npm 发版不再发布 cordis 名义的 vendored 包)。本插件源码对 cordis 只有 type-only 导入(src/index.ts、src/client/index.tsx、src/invariant.ts),已把类型导入与 peer/devDependencies 迁移至 @deepseek-ai/cordis(peer ^4.0.1-rc.1,npm rc.5 基线上为 4.0.1-rc.4)——构建产物(lib/*.js)零 cordis 运行时导入,纯 npm install 不再报 ERESOLVE,无需 --legacy-peer-deps。
0811 兼容要点(snapshot0811,实机验证)
- bundle 机制不变:0811 仍支持
dsh.bundle.patch→cordis.patch.yml的组合包层机制(本插件的 profile bundles 安装方式照旧),客户端dsh.client元数据发现与window.__ModuleLoader__加载协议均未变。 - cordis 更名:0811 将 vendored cordis 由
cordis@4.0.0-rc.7更名为@deepseek-ai/cordis@4.0.1-rc.1。本插件对 cordis 只有 type-only 导入,构建产物零 cordis 运行时导入——更名不影响已构建 bundle 的运行时加载;npm 基线 typecheck 时cordis裸导入解析到公开cordis包仍可通过,对齐建议见上。 - 实机 boot 验证:snapshot0811(
snapshots/20260811T152241Z)web 启动后window.__DSH_BOOT__清单包含@dsh-external/dsh-minigames,/plugins/@dsh-external/dsh-minigames/client.js返回 200,右侧面板(🎮 小游戏)实测渲染。typecheck 与 201 个单测对 0811 基线通过。
0812/最终快照 兼容要点(snapshots/20260812T172954Z-final,实机验证)
- cordis 更名落地:本插件已把 type-only 导入(
src/index.ts、src/client/index.tsx)与peerDependencies/devDependencies迁移至@deepseek-ai/cordis(^4.0.1-rc.1;npm rc.5 基线上为@deepseek-ai/cordis@4.0.1-rc.4)——构建产物(lib/*.js)零 cordis 运行时导入,npm rc.5 消费者 typecheck 全绿,npm install无需--legacy-peer-deps。 - bundle 机制不变:最终快照仍支持
dsh.bundle.patch→cordis.patch.yml的组合包层机制,客户端dsh.client元数据发现与window.__ModuleLoader__加载协议未变;面板不依赖任何宿主服务与布局槽(纯document.bodyportal),与主框架版本解耦。 - 实机 boot 验证:最终快照(
snapshots/20260812T172954Z-final)web 启动后window.__DSH_BOOT__清单包含@dsh-external/dsh-minigames,/plugins/@dsh-external/dsh-minigames/client.js返回 200;npm rc.5 consumerdsh web启动后 boot 清单同样包含本插件。typecheck、build 与 201 个单测对最终快照基线通过。
更新记录 / Changelog
2026-08-11 · v0.3.2 — 恐龙跳一跳角色美化
- 🦖 小恐龙:按经典像素矩阵重绘——大头朝右、上翘尾巴、流线身体、 两条跑步腿(跳跃收起)、白色像素眼;白天近黑、夜晚反白
- 🐦 鸟:圆润身体 + 前伸头 + 尖嘴 + 扑动翅膀 + 尾巴,双调色板
- 🌵 仙人掌:圆角圆顶 + 弯折手臂 + 竖纹肋线 + 顶部高光,双株同理
- 验证:typecheck 与 201 个单测通过;实机加载验证通过
2026-08-11 · v0.3.1 — 跟枪练习 FPS 化与多游戏打磨
- 🎯 跟枪练习 FPS 化:Pointer Lock 鼠标锁定(光标隐藏)、准星固定屏幕中央、 鼠标增量转视角(含俯仰,修复上下方向)、目标三维漂移(横向 + 高度浮动)、 左键射击(后坐力视角上跳回落 + 随机横向晃动衰减 + 可见子弹弹道与命中火花)、 右下角第一人称步枪 viewmodel、开枪枪口火光、暂停/开始覆盖层提示
- 🔨 打地鼠:3×3 → 5×5(25 洞),同时冒头最多 5 只
- 🟡 吃豆人:嘴巴补集动画(张嘴闭嘴)、幽灵走路与眼睛转向、 格子对齐移动(不再中心/墙体晃动)、撞墙回中不卡死、开局幽灵缓冲、 幽灵出生点移到上部通道两端
- 移除:🏓 乒乓
- 验证:typecheck 与 201 个单测通过;实机加载验证通过
2026-08-11 · v0.3.0 — 新增 6 款小游戏(共 18 款,后移除乒乓)
- 新增游戏:🔨 打地鼠(最多 3 只同现)、⚫ 黑白棋 vs AI、🐦 Flappy、 🧩 数独(三档难度 + 计时)、🟡 吃豆人(双幽灵 AI + 力量豆)
- 移除:🏓 乒乓(对局体验不佳)
- 验证:typecheck 与 189 个单测通过;实机加载验证通过
2026-08-11 · v0.2.0 — 新增 7 款小游戏与细节打磨
- 新增游戏(共 12 款):🐍 贪吃蛇(环面穿越)、🔢 2048、💣 扫雷(双击展开)、 🃏 记忆翻牌、⚫ 五子棋 vs AI、🦘 跳一跳、🧱 打砖块
- 贪吃蛇:穿越边界从对侧镜像位置继续,不再撞墙死亡
- 扫雷:双击已翻开的数字,若周围标记雷数 == 数字则自动翻开剩余未开启位置
- 验证:typecheck 与 128 个单测通过;实机加载验证通过
2026-08-11 · v0.1.1 — snapshot0810 适配与面板自适应修复
- 迁移:package.json 客户端元数据从顶层
dshClient迁移为嵌套dsh.client(inject 原样保留) - 修复:面板可用高度不足时不再出现纵向滚动条——
.dmg-body改为 flex 列布局,游戏区拿到真实可用高度,画布按"工具条+画布+按键提示"整体自适应(此前画布高度由自身内容决定、形成循环测量,窄窗口下画布溢出并触发滚动条) - 变大:画布显示宽度上限 640 → 960,游戏在大面板下显示更大
- 验证:typecheck 与 70 个单测通过;DSH snapshot0810 实机 + 多视口(1600×900 / 1536×864 / 1366×640 / 1280×600 / 1024×600 / 960×540 / 1600×500)实测均无滚动条
游戏玩法与细节
🦖 恐龙跳一跳
- 空格 / ↑ / 点击跳跃,↓ 蹲下;速度会随分数提升(
320 + 分数×0.15)直到 760 px/s 上限,越跑越快。 - 分数 = 移动距离 ÷ 10,持续增长(约 50–150 分/秒)。
- 障碍:单柱仙人掌 / 双柱仙人掌 / 三种鸟——
- 高空鸟:从站姿头顶飞过,惩罚乱跳;
- 低空鸟:蹲下可躲,或跳到最高点越过;
- 贴地鸟:紧贴地面,只能跳跃躲(蹲下无效)。
- 后期障碍更密:生成间隔随分数缩短(1.1–2.4s → 0.5–1.2s)。
- 每 800 分切换昼夜:白天(米色)↔ 黑夜(反白)。
- 雨天机制:每 1000 分起有 300 分(1000–1300、2000–2300 …)—— 斜落雨点 + 迷雾遮挡视线,并随机闪电全屏白闪。
- 计分上报节流为每 10 分一次,避免面板频繁刷新。
🧱 俄罗斯方块
- ←→ 移动,↑/X 旋转(Z 逆时针),空格硬降,C 暂存,P 暂停。
- 标准 10×20 棋盘、7 种方块(T/S/Z/J/L 采用 3×3 方阵旋转,不截断)、 幽灵落点、下一个/暂存预览、等级加速(每 10 行一级)。
- 画布随面板自适应缩放(devicePixelRatio 高清),高度不足时收缩保比例,顶部不会被截断。
🛡️ 坦克大战(带 AI)
- WASD/方向键移动(自由转向,车身可贴墙转弯),空格开火,P 暂停,R 重开。
- 碰撞体积略小于一格(32×32 → 26×26),能过略窄通道;撞墙自动回吸网格线, 直行时吸附网格边界,不会卡半格。
- 场景叠加半透明网格线,车道走向一目了然。
- 敌军 AI:贪心追踪 + 视线直射,出生口 2 格宽不卡墙;共 3 波(每波 5 辆)。
- 爆炸特效、出生闪烁无敌、履带动画、波次/生命 HUD。
💎 消消乐
- 点击任意格子,消除与它上下左右四连通的同色块(对角线不算);
- 一次消得越多分越高(平方级:
得分 = 10 × 消除数²); - 消除后上方宝石自由落体补位(带下落动画、消除闪光、得分飘字),本关内不补新宝石;
- 达到目标分过关,目标逐关 +400(800 → 1200 → 1600 → …);
- 无 ≥2 的同色块且未达标 → 游戏结束(R 重开);支持鼠标点击与方向键+空格。
- 支持鼠标点击/拖动与键盘(方向键 + 空格)。
🔢 华容道
- 16 格数字华容道(15-puzzle):4×4 棋盘,15 个编号方块 + 1 个空位;
- 从已解状态做随机有效滑动来打乱,保证每次都可解;
- 点击空位同行/同列的方块(支持一次推多个);或方向键滑动(方块朝箭头方向滑入空位);
- 方块滑动带插值动画,在正确位置的方块自动变绿;
- 按最短用时计分(
max(0, 1000 − 用时×2)):用时越短分数越高; - HUD 显示步数 + 计时;完成显示步数/用时,R 或点击重新打乱。
🐍 贪吃蛇
- 方向键 / WASD 移动,R 重开,P 暂停。
- 16×12 网格,吃食物变长、+1 分。
- 环面地图:穿越任意边界会从对侧镜像位置继续出现,不会撞墙死亡; 唯一死亡方式是撞到自己身体(即将移出的尾格不算)。
- 棋盘填满即胜利(
over同时置为胜态)。
🔢 2048
- 方向键 / WASD 滑动合并,R 重开,P 暂停;也支持点击方向按钮。
- 4×4 棋盘,相同数字相邻滑动时合并为两倍并加分(合并分累加进总分);
- 每次有效移动后随机生成新块(90% 为 2、10% 为 4);
- 合成 2048 达成(
won),无任何可移动/合并方向时游戏结束; - 计分:合并产生的数值累加(合成 2048 的合并即 +2048)。
💣 扫雷
- 左键翻开、右键标旗/取消、双击已翻开的数字自动展开,R 重开,P 暂停。
- 9×9 棋盘、10 颗雷;首次点击必定安全(避开 3×3 安全区布雷);
- 数字 0 自动洪水展开周围;全部安全格翻开即胜(
won); - 双击展开(chord):当周围已标旗数 == 该数字时,自动翻开剩余未开启的 位置——若旗子标错,翻到雷则游戏结束并亮出全部雷;
- 计时与最短用时:首次点击开始计时(HUD 右上角实时显示),排雷完成
停止;按用时计分(
max(0, 1000 − 用时×2))上报,面板保留最高分 = 最短通关用时,越快分越高。
🃏 记忆翻牌
- 点击翻牌,R 重开,P 暂停。
- 4×4 共 8 对符号,两张成对即消除,全部消除即胜(
finished); - 翻到不匹配自动翻回;步数越少分越高
(
max(0, 500 − 步数×5))。
⚫ 五子棋 vs AI
- 点击落子(黑子先行),R 重新开始,P 暂停。
- 15×15 棋盘,五子连珠(横/竖/斜)即胜;棋盘满为平局;
- AI 策略:优先自己连五 → 其次堵你的连五 → 再按 「进攻 ×1.1 + 防守」启发式打分选点(只考虑已有棋子附近);
- AI 有约 0.5s 的思考停顿,模拟对弈节奏。
🦘 跳一跳
- 按住蓄力(力度条上升)、松开起跳,R 重开,P 暂停。
- 高抛物线:跳起高度显著,空中带地面阴影与方块前倾,跳跃感强。
- 蓄力决定跳距与滞空时间;落到下一个平台前进 +1 分, 落点越靠近平台中心额外 +2/+1 分;
- 落回当前平台不扣分继续;落空(掉下)游戏结束(带下坠动画);
- 间距与宽度混合分布:间距近(55–105)约 40%、中(105–140)约 35%、 远(140–160)约 25%;平台宽度有的宽有的窄——窄(42–52)约 30%、 普通(56–64)约 40%、宽(72–88)约 30%,窄平台更难精准落中;
- 满蓄力可跨越最远平台(跳距约 202),但满蓄力会飞过近/中平台, 需要按实际间距与宽度调节蓄力,不能无脑满蓄力。
🧱 打砖块
- 鼠标 / ←→ 移动挡板,R 重开,P 暂停。
- 480×320 视口:5 行 × 8 列砖墙,小球碰砖即碎、+10×关数 分;
- 挡板反弹角度随击点位置变化(打两侧球更斜);
- 清空一墙进入下一关:砖墙重建、球速提升(
250 + 关数×20); - 3 条命,球落地扣除,扣完游戏结束。
- 颜色机制:每行砖固定一种颜色(删砖不变色);小球会变成所消除 方块的颜色,消除同色方块得分 ×3,连续同色可连锁高分。
🔨 打地鼠
- 30 秒限时:点击冒头的地鼠,R 重开,P 暂停。
- 5×5 草地(25 洞),最多 5 只地鼠同时冒头,每只 0.9–1.6s 后缩回;
- 命中 +1、打空 -1(最低 0 分);时间耗尽游戏结束。
⚫ 黑白棋 vs AI
- 点击落子(黑子先行),R 重开,P 暂停。
- 8×8 奥赛罗:落子翻转被夹住的对方棋子;无棋可下自动让位, 双方都无棋可下时子多者胜;
- 合法位置有提示点;AI 启发式:优先占角、避让角邻位、偏爱边缘, 也考虑当前翻转数与中心机动性。
🐦 Flappy
- 点击 / 空格 / ↑ / W 振翅,R 重开,P 暂停。
- 重力下落、每穿过一对柱子 +1 分、球速随分数略增;
- 撞柱、触地或触顶即结束;小鸟带俯仰与振翅动画。
🧩 数独
- 点击选中格子,1–9 填入 / 0 或退格清除,方向键移动光标;
- D 键切换难度(简单 45 线索 / 普通 35 / 困难 30),R 开新题;
- 题面深色不可改,玩家填入蓝色、冲突标红;
- 填满且无冲突即胜;按用时计分(
max(0, 1000 − 用时×2)), 越快分越高,面板保留最短用时。
🟡 吃豆人
- 方向键 / WASD 移动(只在路口转向),R 重开,P 暂停。
- 15×19 迷宫:吃豆 +10、力量豆 +50 并让幽灵变蓝可反吃(吃幽灵 +200);
- 幽灵追逐玩家(力量期间反向逃跑);开局与复活后幽灵有 1.5s 缓冲 不参与碰撞,不会开局即死;撞到正常幽灵损失一条命, 3 条命扣完结束;吃完所有豆子过关。
🎯 跟枪练习
- 鼠标转动视角(准星固定在屏幕中央),左键射击,R 重开,P 暂停。
- 第一人称场景:天空 + 透视地面网格,地平线随俯仰移动,右下角手持步枪 viewmodel;
- 靶子在大型世界里三维漂移(横向随机变向、上下高度浮动、碰壁反弹), 投影到视野中,越远越小;
- 锁定(准星压住靶子)持续得分(10 分/秒);射击命中 +20 分, 开火带后坐力(视角上跳、随恢复回落)与随机横向晃动(快速衰减), 子弹可见:发光弹道从枪口飞向目标(命中)或飞向远处(脱靶), 命中目标处有爆炸火花,枪口有火光;
- 30 秒限时,结束显示总分与射击命中率。
安装
前置:已构建的 DSH 20260808+ 快照、pnpm。
git clone https://github.com/lhh010/dsh-minigames.git # 或直接使用本目录
cd dsh-minigames
pnpm install
pnpm build
# 装入当前 web profile(自动写入依赖并加入 dsh.profile.bundles)
dsh plugin --profile web add /绝对路径/to/dsh-minigames
# 可选:确认组合配置只出现一个插件行
dsh --profile web --dump-config | grep dsh-minigames
插件集合变更在重启 dsh web 后生效。卸载:
dsh plugin --profile web remove @dsh-external/dsh-minigames
本仓库同时携带
dsh.plugin.json(registry 通道清单)与cordis.patch.yml(官方 profile bundle 通道);二选一安装,不要同时启用。
使用
- 打开 DSH Web UI(
dsh web),页面右缘出现 🎮 小竖条。 - 点击竖条 → 面板展开为窗口右半部分。
- 点击游戏卡片开始;
P暂停、R(结算后)重开、点「选游戏」返回选择列表。 - 再次点击「收起」折叠为竖条(游戏自动暂停,进度保留)。
开发
pnpm install
pnpm run typecheck # tsc --noEmit
pnpm run test # vitest 纯逻辑单测(189 个:引擎/棋盘/世界模型/三消/华容道/贪吃蛇/2048/扫雷/翻牌/五子棋/跳一跳/打砖块/打地鼠/黑白棋/Flappy/数独/吃豆人/跟枪/注册表)
pnpm run build # tsc 声明 + tsdown:lib/index.js(node half)+ lib/client.js(浏览器 bundle)
产物结构(随源码提交,与 dsh-web-panel 一致):
lib/index.js—— node half(loader 行实现,仅日志;客户端插件扫描依赖该行存在)。lib/client.js—— 浏览器 bundle,window.__ModuleLoader__.load({ id: '@dsh-external/dsh-minigames', factory }),id 必须与package.json的name一致(client-modules 以包名作为 compose 键)。lib/types/—— 声明文件。
架构
src/
index.ts node half(loader 行实现)
invariant.ts 不变式伴生文件
client/
index.tsx 客户端插件:DOM portal 挂载面板(ctx.effect 管理生命周期)
app.css 面板样式(全部 dmg- 前缀,随 bundle 注入 <style>)
panel/Panel.tsx 折叠条 / 展开面板 / 游戏选择器 / GameArea 生命周期
games/
types.ts 游戏扩展接口(MiniGameDefinition / MiniGameInstance)
registry.ts 注册表(registerGame / getGames / getGame)
focus.ts 键盘焦点门控(避免劫持聊天输入)
canvas-fit.ts 画布按宿主自适应缩放(devicePixelRatio,防截断)
index.ts 内置游戏注册点
dino/ 纯逻辑(引擎:物理/计分/昼夜/雨天/生成密度)+ 渲染 + 游戏定义
tetris/ 纯逻辑(棋盘:旋转/消行/暂存/等级)+ 渲染 + 游戏定义
tanks/ 纯逻辑(世界:网格/转向吸附/AI/波次/特效)+ 渲染 + 游戏定义
match3/ 纯逻辑(三消:四连通/落体/目标分/关卡)+ 渲染 + 游戏定义
huarong/ 纯逻辑(华容道:滑动/打乱/解状态)+ 渲染 + 游戏定义
snake/ 纯逻辑(贪吃蛇:环面穿越/自撞/成长)+ 渲染 + 游戏定义
game2048/ 纯逻辑(2048:滑动合并/生成/胜负判定)+ 渲染 + 游戏定义
minesweeper/ 纯逻辑(扫雷:布雷/洪水展开/标旗/双击展开)+ 渲染 + 游戏定义
memory/ 纯逻辑(翻牌:配对/步数)+ 渲染 + 游戏定义
gomoku/ 纯逻辑(五子棋:落子/胜负/启发式 AI)+ 渲染 + 游戏定义
hop/ 纯逻辑(跳一跳:蓄力/落地判定/计分)+ 渲染 + 游戏定义
breakout/ 纯逻辑(打砖块:挡板/碰撞/关卡/球速)+ 渲染 + 游戏定义
whack/ 纯逻辑(打地鼠:计时/冒头/得分)+ 渲染 + 游戏定义
othello/ 纯逻辑(黑白棋:翻转/让位/终局/启发式 AI)+ 渲染 + 游戏定义
flappy/ 纯逻辑(Flappy:重力/柱子/碰撞/计分)+ 渲染 + 游戏定义
sudoku/ 纯逻辑(数独:生成/挖洞/冲突/计时)+ 渲染 + 游戏定义
pacman/ 纯逻辑(吃豆人:迷宫/移动/幽灵 AI/力量豆)+ 渲染 + 游戏定义
aimtrack/ 纯逻辑(跟枪:视角转向/三维漂移/射击后坐/晃动/命中率)+ 渲染 + 游戏定义
tests/ 纯逻辑单元测试
面板不依赖任何宿主服务与布局槽(纯 document.body portal),因此:
- 与主框架版本解耦,
dsh.client.inject为空,客户端零@deepseek-ai依赖; - 无论 DSH 布局如何变化(左栏/右栏/折叠)都不会冲突。
添加新游戏(预留接口)
实现 MiniGameDefinition(src/client/games/types.ts):
import { registerGame, type MiniGameDefinition } from './index.ts'
const myGame: MiniGameDefinition = {
id: 'my-game', // 唯一 id(作为选中记忆与最高分 key)
title: '我的游戏',
icon: '🎯',
description: '一句话介绍',
controls: ['空格:跳跃', 'P:暂停'], // 画布下方的按键图例
create(host, options) {
// 在 host 内创建 <canvas>;返回实例:
return {
start() {}, // 启动/恢复主循环
pause() {}, // 暂停(面板折叠/切标签页/用户暂停时调用)
resume() {}, // 恢复
destroy() {}, // 释放 rAF/键盘监听等
}
},
}
registerGame(myGame)
create 返回的实例由面板驱动生命周期:切换游戏时先 destroy() 旧实例再
create() 新实例;面板折叠、标签页隐藏或用户点暂停时调用 pause()。
分数通过 options.onScore?.(score) 上报(仅在变化时调用),面板负责显示与
最高分持久化。建议把游戏逻辑拆成纯函数模块(不碰 DOM/定时器),与现有游戏
一样用单元测试覆盖。
已知限制与后续计划
- 键盘控制依赖游戏区域焦点;点击聊天输入框后需点回游戏区域才能继续操作(有意为之)。
- 坦克大战 AI 为贪心追踪 + 视线开火,无寻路;后续可加障碍绕行与不同装甲类型。
- 消消乐与方块/坦克的关卡进度不跨会话保存(仅最高分持久化)。
- 恐龙雨天/昼夜为纯视觉氛围,不影响判定。