dsh-game-center:一个面板里玩小游戏

前言

用 DeepSeek Harness(DSH)做插件的人,通常不会只写一个功能:今天加一个面板,明天加一个小工具,时间一长,侧边栏里会攒下一堆零散入口——要么各自弹窗,要么各自塞一个按钮,用户要找就得到处翻。dsh-game-center 要解决的是这件事:把为这个 harness 做的小游戏集中到一处,在原来的窗口里点开就玩,不新开标签页,也不新开窗口。

下面介绍这个插件的定位、安装方式、自带游戏和扩展办法。

这是什么

dsh-game-center 是一个 DeepSeek Harness 面板插件,仓库是 stallenlu/dsh-game-center,维护者 stallenlu。它提供一张「游戏库」面板:每款游戏一张卡片,带示意图、名称、分类、版本和状态,点开就在面板内游玩。社区目录页上的简介是「DeepSeek Harness panel plugin: a mini-game library that plays them in the same window. Ships with Tetris.」,分类归在「趣味换装」下,star 数为 0——刚起步的社区插件,功能是否完整比热度更值得看。

它自带两款游戏:俄罗斯方块、警察抓小偷。

核心功能

一个列表管理游戏。 面板本身就是游戏库:每款游戏一张卡片,示意图由游戏本身生成,不用装饰性的图。游玩不离开当前面板,没有新窗口或新标签页。

俄罗斯方块。 10×20 棋盘、七种方块(含靠墙微调 wall kicks)、落点虚影、下一个方块预览、消行计分、等级越高落得越快、暂停/重开,最高分存在 localStorage。

警察抓小偷。 你扮演小偷,在有墙的棋盘上把赃物全部捡完即过关。警察绕开墙走最短路线追你,每过一关多一个,你有三条命。

每个游戏各自的难度。 难度是游戏自身的设置,在各自的开始界面上选,按游戏分别记住:简单 / 普通 / 困难让俄罗斯方块从第 1 / 3 / 5 级起步,让警察抓小偷开局有 1 / 2 / 3 个警察;等级仍会随游玩继续上升。

面板自己的设置。 只有两项:显示或隐藏侧边栏入口,以及恢复默认。面板右上角的齿轮和插件页里都能改。

主题。 配色取自 harness 主题变量 --dsw-alias-*,明暗模式自动跟随,没有自己写死颜色。

环境要求

来自 README:

DeepSeek Harness 0.2.1-rc.5(Web UI)
Node.js >= 22
npm 依赖 运行时无依赖——面板只注入 @deepseek-ai/dsh-client-locale 和 @deepseek-ai/dsh-client-ui-slots,由 harness 自身提供

package.json 的 peerDependencies 把这两个包的兼容范围写到 >=0.2.0-rc.1 || >=0.2.1-0 || >=0.2.2-0。插件版本 1.0.0,许可证 MIT。

安装与启用

安装命令就是 README 里那一条:

dsh plugin add github:stallenlu/dsh-game-center

装完重启 DSH(或刷新 Web UI),从侧边栏打开「游戏中心」。如果侧边栏没出现入口,先看面板设置里是否把它隐藏了,再核对 peer 依赖版本是否满足上面那条要求。

操作方式

俄罗斯方块

按键 作用
← → 移动
↑ X 旋转
↓ 软降
Space 硬降
P 暂停

警察抓小偷

按键 作用
W A S D 走一格
← ↑ ↓ → 走一格
P 暂停

两款游戏都支持两套按键,暂停统一是 P。

目录结构

client.js          Web 客户端插件:面板、设置、游戏、俄罗斯方块、警察抓小偷
index.js           宿主侧入口(无宿主行为)
cordis.patch.yml   挂载 bundle 的 insert 行
locale/*.json      插件列表的标题与描述
icon.svg           应用内图标
assets/            商店图片
verify.mjs         可运行自检(node verify.mjs):接线 + 两款游戏的核心逻辑

宿主侧的 index.js 基本是空壳——这款插件的价值集中在 Web 客户端一侧。

增加小游戏

client.js 里有一个 GAMES 注册表。新增一条记录,声明这些字段:

{ id, nameKey, descKey, categoryKey, version, statusKey, thumb, thumbCell, thumbGap, render(t) }

它会自动出现在游戏库中。render(t) 收到翻译函数,返回游戏元素。新游戏还要把文案加进 apply() 顶部注册的 zh / en 字典,否则列表里对应的名称、描述会是空字符串。

卡片示意图必须来自游戏本身,不能用装饰性的图。 写一个 xxxThumb(),拿这款游戏自己的常量搭出矩阵——棋盘、地图、真实配色——再用 thumbCell / thumbGap 让它放进 104px 的图区。现有两款都是这么做的:tetrisThumb() 通过 SHAPES / COLORS / collides 真的落下方块,chaseThumb() 画的就是 CHASE_MAP。一个实现细节值得记住:.gc-thumb 是 grid,它曾经是 flex 单行,会把二维矩阵排成一行再裁掉。

自检

verify.mjs 不依赖 harness 就能跑:

node verify.mjs

它加载 client.js、捕获模块、用桩上下文调用 apply(),断言三个插槽(主面板、侧边栏入口、插件页配置)与语言注册,再跑一遍俄罗斯方块核心逻辑(旋转、碰撞、消行、下落计分)和追捕逻辑(地图连通性、寻路、拾取赃物、命数)。其中还包括一条对游戏库的硬约束:注册表里每一款游戏的示意图都必须是非空网格、每行等宽、格子是颜色。因此手画的装饰图或空图会被自检拦下。改动卡片渲染方式的时候,这条断言就是回归线。

适用场景与注意

适合两类人:一是想给自己的 harness 加个休闲角落的使用方,装上即用,不用改代码;二是准备按 GAMES 注册表扩展小游戏的插件开发者,可以直接拿它的卡片机制、双语文案和自检当参照。

几点提醒:

  • 插件以当前 DSH 进程的权限运行,它发起的任何调用都会继承这个权限。安装前先打开仓库检查 client.js,确认没有自己不需要的行为,再确认许可证(本项目为 MIT)可接受。
  • 它面向的是带 -rc 标记的 0.2.1-rc.5。如果你的 harness 版本差得较远,peer 依赖检查可能直接拦下安装。
  • 卡片示意图的校验只保证「图是游戏画出来的,不是装饰品」,不保证好看;发布前最好亲自看一眼 104px 图区里的效果。

结语

它的看点不在俄罗斯方块本身的难度,而在于把「集中放置、窗口内游玩」落成一个结构清楚的插件,并留下干净的扩展口子:加一款游戏,等于写一个 render 加一条注册表记录。社区目录页在 https://www.skillhub.cn/plugins/stallenlu/dsh-game-center,源代码在 https://github.com/stallenlu/dsh-game-center。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜