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。

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

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

小夜