Repository navigation
v3.0.0
3.0.0 — 一来一往
照 docs/REVIEW-v2.1.md 做。重心是对弈:这个应用的核心是陪你下棋。
几项决定:
- 难度选方案 A:只修两头,普通、困难不动;
- 电脑最短 600ms 才落子;
- 下棋时不显示计时器;
- 落子声换录音这一项没找到能放心商用的录音,顺延。
不动的:规则、普通 / 困难的棋力、存储格式(旧存档、对局库、战绩、练习都照读)、复盘与练习的内容、v2.1 的界面与标题栏。
一句话:一来一往有节奏,落子干脆,赢有赢的样子,下完一键再来,下棋时眼里只有棋。
一来一往有节奏
- 电脑最短 0.6 秒才落子。
- 此前入门、普通 0.17–0.43 秒就落下:你的手还没抬起,它的子已经在了,像对面没有人。
- 这段时间座位里的三个点照常在动。
- 算法的时间预算一毫秒不动,棋力不变,只是算完了等一等。困难、极限本来就常常超过这个时间。
- 电脑那一子落得让你看见:它的子用 0.26 秒轻轻放下(你的子仍是 0.12 秒即点即现),你不会再错过它下在哪。
落子干脆
- 点下去的那一帧子就在。
- 此前落子动画的 0.14 秒里,每一帧都把整块棋盘重画一遍:底色、网格、全部棋子的渐变与阴影,只为让新子从 0.88 倍放大到 1 倍。
- 现在棋盘画好就缓存,动画只画那一颗子。
- 一次落子整盘只重画一次,在动画结束时把新子并进去。
- 实测(容器里,软件渲染):一次点击里同步做的事 16–64ms → 1–5ms,子在下一帧(约 16ms)出现。
赢有赢的样子
- 此前连成五 19ms 后终局卡就弹出来,同时一根朱砂线穿过五颗子、五颗子各套一圈、胜负音乐响起。三样挤在同一瞬间,最该看的五颗子反被线压着。
- 现在:
- 整块棋盘先蒙上一层自己的底色,其余的子退后;
- 五颗子一颗接一颗浮出来,各留一圈细环;
- 底色退去,停一拍(约 0.9 秒),终局卡从旁边滑进来。
- 不再画那根线。
- 输了也是这五颗,环的颜色收敛一半,不庆祝。
- 开了「减弱动效」时直接是最后的样子。
下完一键再来
- 终局卡的主按钮是「再来一局」:同样的设置一键开局,执子选「轮流」时自动换色。
- 「从第 N 手重下」「看复盘」退为卡片里的次要按钮,功能不变。
- 顶栏「新局」照旧打开设置面板,用来换难度、换规则;一局结束后不再和「再来一局」同时高亮。
- 下完到下一盘:2 次点击 → 1 次。
下棋时眼里只有棋
- 计时器下棋时不显示:这不是计时对局,它一直在跳只会分走眼睛。这一局用了多久写在终局卡上(「用时 03:12 · 41 手」),也照旧记进对局列表。
- 时间线下棋时收起:
- 位置保留,棋盘不跳;
- 鼠标移到棋盘下方那一行、按 ← 翻看、终局与复盘时才出现;
- ← → Home End 照旧。
- 下棋时看得见的就剩:两个座位、棋盘、悔棋 · 提示 · 新局 · ⋯。
对手:难度合理、说明照实
按发布时限(普 0.4s / 难 2s / 极 5s,不缩放)量了档与档的配对胜负,又写了两个模仿人的对手(新手、会下的新手)各下 60–100 盘,逐句核对每一档的说明。详见 docs/REVIEW-v2.1.md 第七节。
| 档 | 改了什么 | 为什么 |
|---|---|---|
| 入门 | 漏挡活三的概率 0.3 → 0.5 | 只会挡冲四的新手对它只赢 26%;说明里写「常常漏掉活三」,实测四次只漏一次。现在新手对它五五开(50 / 100),说明也成立了 |
| 普通 | 不动 | 必挡直接威胁:冲四 133 / 133、活三 66 / 66 |
| 困难 | 不动 | 对普通 +172,p = 0.0005 |
| 极限 | 时间用满(不再「想好就停」) | v1.68 起极限想好就停,平均每手只花 1.3 秒,按发布时限对困难只剩 +44(p = 0.23),说明里的「明显强于困难」不成立。用满后 +137(p = 0.006),平均每手 2.2 秒 |
说明文字照实测改:
- 普通:去掉「每手约 0.4 秒」(实测平均 0.22 秒,加上 0.6 秒的落子节奏后已无意义)。
- 困难:「每手约 2 秒」→「每手至多约 2 秒」(实测平均 0.59 秒)。
- 极限:「多给两倍半的时间」→「时间用满」;「难局最多算 5–8 秒」→「每手至多 5 秒」(8 秒那一档 v2.0 已退役)。
- 执子「白」:「执白:电脑先手。自由规则下先手优势很大,执白大约难一档」。实测四档之间的对局,执黑的赢约七成。
顺手修
| 现象 | 现在 |
|---|---|
| 1280 × 800 下终局卡离窗口右边 6px(1440 × 900 下 12px),左边却空着近 300px | 坞放在棋盘旁边、棋盘不用让位时,离窗口边至少 20px;小窗口仍把空间让给棋盘 |
| 空盘点「新局」,设置面板压在初见卡片上,卡片右边一截露在外面 | 面板打开时初见卡片让开 |
| 终局后输家座位整颗降透明度,「你」字对比度 3.17:1 | 只把棋子淡下去,字 7.86:1 |
闸门
test-surface S20(v3.0 一来一往)在 v2.1 上失败:
| 项 | v2.1 上实测 | v3.0 |
|---|---|---|
| 入门 / 普通电脑回应 | 171–429ms | 611–648ms |
| 一次落子整盘重画 | 10 次 | 1 次 |
| 连五后 0.3 秒时终局卡 | 已经弹出 | 还没有,928ms 进来 |
| 五颗子上的红线 | 有 | 无 |
| 终局卡主按钮 | 从第 N 手重下 | 再来一局(一键开局、设置不变) |
| 下棋时计时器 / 时间线 | 显示 / 显示 | 不显示 / 收起,翻看时出现 |
| 坞离窗口右边(1280 / 1440) | 6 / 12px | 20 / 20px |
| 新局面板与初见卡片 | 重叠 | 不重叠 |
| 输家座位对比度 | 3.17 | 7.86 |
| 极限说明 | 「难局最多算 5–8 秒」 | 「每手至多 5 秒」 |
随之改写的旧闸门(测的是旧设计本身):
| 闸门 | 处理 |
|---|---|
test-game 极档参数一致 |
「除了预算全部一样」→「除了预算与时间管理全部一样」 |
test-game 时间管理 |
「困难 / 极限用」→「只有困难用,极限时间用满」 |
test-surface S14 |
「新局终局后才是主按钮」→「终局后主按钮是『再来一局』」 |
test-loop 8 / 12、test-surface 收尾 |
读终局卡前多等一拍(终局卡约 0.9 秒后才进来) |
其余闸门照旧全部通过:test-game / test-surface S1–S20 / test-cross / test-loop / test-daily / test-strength。
顺延
- 落子声换真实录音:没找到能放心商用的蛤碁石落木盘录音。你有录音,或者愿意录一段(黑白各落几子,手机就行),给我就能换。
底层依赖
@native-sdk/core / @native-sdk/cli 最新是 0.11.0(2026-10-13 发布)。CI 一直用最新的 CLI 构建,所以这一版是用 0.11.0 打的包:
- 本地用 0.11.0 编过 null 平台与 macOS(macOS 只差系统框架链接,Zig 代码类型检查全过);
- 标题栏用到的两段宿主实现(窗口拖动、红绿灯位置)与 0.10.1 逐行相同;
- 最终以 CI 的 macOS / Windows 构建为准。