在 64 色钉板上完成摆豆或复原。经典关卡按章解锁;导入的图片放在自定义游戏里,不占用选关编号。进度只保存在本机。
- 摆豆:空板开局,只有目标色能放上。支持画笔、拖绘、同色填充、镜像和撤销。全部对齐后可熨烫。熨烫锁定该局,并记下通关。
- 复原:按种子把答案拆成色块,开局抽出若干颗放进缓冲格。放对的格子立即锁定。复原不解锁下一关。
- 选关:一章一条路。点节点后,摆豆和复原出现在道路下方,不挡章名。点空白处收起。未解锁的节点只提示先完成上一关。
- 通关:章中某一关熨烫后进入下一关。一章最后一关熨烫后进入下一章。最后一章没有下一关。
- 自定义游戏:导入 PNG 或 JPG。可改名、删除。边长与颜色上限分开选。边长可选 16、24、32、48、64、96、128、192、256。颜色上限可选 4、8、12、20、32、48、64。可去掉单色背景,照片还可合并相近色块,默认关闭。
- 色号:色盘始终显示色号。长边达到 64 且放大到单格大约 22 像素后,豆子上才印出色号。色号和底稿分开开关。大图需要放得更开才能看清。
- 视图:滚轮缩放,空格或右键拖拽平移。钉板为带孔圆柱珠。熨烫后珠子大小、光泽和孔洞不变。
自定义导入 · 满幅 199×256
一章十关同一档。下一章升一档。第七章起停在满幅。摆豆界面按这一关的长边显示档名,竖图不按短边降档。长边达到 128 的自定义图也显示满幅。
| 章 | 等级 | 长边 | 颜色上限 | 复原缓冲格 |
|---|---|---|---|---|
| 第一章 | 教学 | 16 | 4 | 8 |
| 第二章 | 普通 | 24 | 8 | 5 |
| 第三章 | 挑战 | 32 | 12 | 3 |
| 第四章 | 精细 | 48 | 20 | 3 |
| 第五章 | 工坊 | 64 | 48 | 2 |
| 第六章 | 大幅 | 96 | 48 | 2 |
| 第七章 | 满幅 | 128 | 48 | 2 |
变难是棋盘变大、颜色变多、复原空位变少。从挑战档起可以关掉豆子上的色号。没有星级、限时或失误次数。
教学 · 第一章 · 16×16
普通 · 第二章 · 14×24
挑战 · 第三章 · 32 边
精细 · 第四章 · 48 边
工坊 · 第五章 · 64 边
大幅 · 第六章 · 96 边
满幅 · 第七章 · 128 边
- Node.js 20 或 22
- 桌面窗口和安装包:Rust 稳定版,Windows 目标为
x86_64-pc-windows-msvc;Visual Studio 2022 的 C++ 生成工具,含 MSVC 和 Windows SDK - 运行桌面程序需要 WebView2。Windows 11 自带;Windows 10 未安装时先装 Evergreen 运行库
npm install
npm run dev打开 http://127.0.0.1:5173 。首页进入选关,在道路下方选择摆豆或复原。
npm test
npm run typecheck
npm run lint
npm run build
npm run preview先关掉已经占用 5173 端口的开发服务,再启动窗口:
npm run desktop这是开发窗口,不生成安装包。安装包见下方「打包」。
netstat -ano | findstr :5173
Stop-Process -Id <PID> -Force通关记录是已熨烫关卡的 id 列表,存在本机。改掉关卡 id 后,旧的通关记录对不上。自定义关卡在网页里存在浏览器;桌面版另写在应用数据目录的 custom-levels.json。两边按修订号合并,空的一侧不会清掉已有关卡。
测关时把 src/debug/config.ts 里的 debugEnabled 改成 true,刷新页面或重新打包后,选关页右下角出现「调试」。正式包保持 false,按钮不会出现。这个开关只控制入口,不改变摆豆和复原的规则。
点「调试」打开面板,点「收起调试」关掉。
| 操作 | 用法 | 效果 |
|---|---|---|
| 进入摆豆 | 输入 2-10、关卡 id(如 plant-3)或关卡标题,回车或点「进入摆豆」 |
直接打开该关的摆豆。不检查是否已解锁,也不写入通关记录。没有匹配时提示「没有这一关」 |
| 一键全部通关 | 点按钮 | 把全部经典关记成已熨烫,选关页会全部解锁。不改自定义游戏 |
| 清除通关记录 | 点按钮 | 立刻删掉经典关的通关记录,没有二次确认。自定义游戏还在 |
跳关只进入摆豆。要测复原,先用跳关或正常选关打开该关,再从道路下方进入复原。
选关页左上角的「重置关卡进度」是给玩家的。只有已经有通关记录时才出现,并且会先确认。它和调试里的「清除通关记录」清的是同一份经典关记录。
正式包先把 debugEnabled 改为 false。网页包和桌面安装包都会编译前端。pic/ 只用于生成关卡,不会打进包里。src-tauri/target 是编译缓存,不需要提交。
npm install
npm run build静态文件在 dist/。本机打开:
npm run preview这条命令不占用 5173 端口。它先执行 npm run build,再编译 Rust 发行版并打安装包。
npm install
npm run desktop:buildsrc-tauri/.cargo/config.toml 把并行链接限制为 1,避免多个 link.exe 同时写 PDB 时出现 LNK1201。不要设置 CARGO_TARGET_DIR,产物固定写在 src-tauri/target。
| 产物 | 位置 |
|---|---|
| 可执行文件 | src-tauri/target/release/super-perler-beads.exe |
| 安装包 | src-tauri/target/release/bundle/ |
窗口标题和安装名是「超级拼豆」。版本号在 src-tauri/tauri.conf.json 的 version。MSI 使用简体中文语言包,否则安装名里的中文会让 WiX 在代码页 1252 上报错并中断打包。
关卡正文在 src/levels/campaign.json,共 7 章,每章最多 10 关。命令经 npm run levels 传入 scripts/levels.ts,参数写在 -- 之后。玩家看到的是 title。id 在全书内唯一,建议用小写连写,例如 plant-3 这种带连字符的生成名也可以。
npm run levels -- check
npm run levels -- format
npm run levels -- make pic/plant/1-3.jpg plant-3 "植物 3"
npm run levels -- make pic/animation/1-6.jpg animation-6 "动画 6" outlines
npm run levels -- batch 图片目录
npm run levels -- batch 图片目录 keep-background| 命令 | 行为 |
|---|---|
check |
校验格式、id 不重复、每章不超过 10 关、同章同档、后一章更难 |
format |
把 campaign.json 按章、色板和格子行排开,不改关卡内容 |
make |
生成或替换一关。id 已存在则原位替换,并沿用该章的边长和颜色上限。新 id 追加到未满的章。满 70 关且 id 不存在时失败 |
batch |
把目录里尚未入册的图按文件名追加。已有同名 id 不会覆盖 |
pics |
用 pic/ 整章重写第 2–7 章。会丢掉后来改过的 id 和标题。第一章手绘关保留 |
make 在标题后面可以加标志:
outlines:保住深色细线,适合平涂卡通。keep-background:不去背景。默认会从边缘扣掉接近的单色背景。
pics 要求第一章已经有 10 关。每个目录 10 张图,按文件名数字排序。扩展名为 .png、.jpg、.jpeg。内容实际是 WebP 时,本机需要 ffmpeg 和 ffprobe,脚本按文件头解码,不改原图。竖图按长边分档。
| 目录 | 章节 | 长边 | 颜色上限 | 背景 |
|---|---|---|---|---|
pic/animation |
2 | 24 | 8 | 去除,并保留深色描边 |
pic/bird |
3 | 32 | 12 | 去除 |
pic/dog |
4 | 48 | 20 | 去除 |
pic/insect |
5 | 64 | 48 | 去除 |
pic/painting |
6 | 96 | 48 | 保留 |
pic/plant |
7 | 128 | 48 | 去除 |
经典关生成不会打开「合并相近色块」。这个开关只在自定义导入里,默认关闭。
src/
domain/ 关卡契约、64 色色板、难度档、摆豆与复原规则
image/ 取样、映色、去背景、限色、可选的相近色合并
game/ 对局与关卡顺序
render/ 钉板与珠子渲染
ui/ 首页、道路、对局、导入、自定义游戏
storage/ 本机通关记录与自定义关卡
debug/ 调试入口开关
levels/ campaign.json
scripts/ 关卡生成与校验
pic/ 第 2–7 章原图,不打进玩法包
demo-pic/ 说明文档用的截图
src-tauri/ 桌面窗口
resources/ 品牌图标
- 关卡表现细节待优化
本项目仅供学习交流使用。









