附件就是整个作品:中秋博饼-全家同屏版.html (171.9 KB),单文件、无后端、不用注册、
不用联网。下载后双击用浏览器打开就能玩。
打开后往下拉,页面里自带两个区块:「自动验收报告」(40 条用例 + 46656 种组合穷举)和 「交付自检」(外链零依赖 9 项)。这两块是页面加载时真跑出来的,不是我贴的图。

一、我做了什么
一个「中秋家庭博饼」网页工具。博饼是闽南中秋的传统骰子游戏,2008 年 6 月 7 日经国务院批准列入第二批国家级非物质文化遗产名录,项目名称「中秋节(中秋博饼)」,项目序号 453、编号 Ⅹ-5,类别民俗,申报地区福建省厦门市,保护单位厦门市中秋民俗文化研究会。
六颗骰子投进大瓷碗,按点数组合博取状元、榜眼、探花、进士、举人、秀才六个等第,一套会饼共 63 份奖品。我把这套规则做成了打开即用的网页:摇一摇或点按钮掷骰,碗内骰子翻滚、瓷碗叮当作响,判定结果自动揭晓,全家轮流传递手机就能博一整局。
二、灵感来自哪条评论
来自 【中秋国庆VibeCoding】你出题,我来做,用 TraeCode 做个节日小应用 - 福利活动 - TRAE 官方中文社区(这条是我自己提的,提完之后发现没人认领,就自己接了):
我想要一个【中秋家庭博饼小工具】,用来解决【中秋全家聚餐想玩博饼,但人在外地凑不齐骰子和瓷碗,规则每年都要现场吵一遍,散场后状元到底被谁抱走了全靠回忆】的问题。最好能有【手机摇一摇掷出六个骰子,带碗底晃动动画和骰子碰撞声,自动判定一秀/二举/四进/三红/对堂/状元,全家人拉进同一局实时积分排行,奖品自定义录入,一局结束自动结算谁抱走状元】。
「规则每年都要现场吵一遍」这句是整个项目真正的起点——后面第四节会讲到,博饼的地方规则分歧比我预想的大得多。
三、它解决了什么假期问题
- 凑不齐骰子和瓷碗:外地过节、视频连线,手机上就能博,音效和动画把气氛补上。
- 规则每年吵一遍:内置 7 个可配置开关,覆盖状元谁最大、六勃黑算不算状元、遍地锦是否单列、五子怎么比大小等全部争议点,开博前先在设置里定好,还能一键导出「本局规则卡」发到家庭群,白纸黑字不再吵。
- 散场后状元归谁全靠回忆:完整投掷历史 + 终局结算 + 战报长图,一键发微信群。剪贴板不可用时(比如微信内置浏览器)会自动展开一个可长按选择的文本层,不会点了没反应。
- 奖品不一定是月饼:每个等第的奖品名可自定义,现代博饼早就是米面粮油、家用电器甚至果冻薯片了。
四、规则考据:这部分我花的时间比写代码还多
动手前我把规则核实了一遍,查了 7 个来源:中国非物质文化遗产网(官方登记信息)、百度百科「博饼规则」(其 1 号参考文献为厦门市文化馆)、360 百科「中秋博饼」、厦门市文化馆、《福建风物志》(福建人民出版社 1985 年版)、厦门本地宝中秋博饼专题,以及两份民间整理的完整规则说明。
发现六处地方规则分歧,其中第一处直接决定谁是最大状元:
| # | 分歧点 | 两种说法 |
|---|---|---|
| 1 | 状元插金花 vs 六勃红谁最大 | 1984 年前没有「状元插金花」的说法,老厦门人以六勃红最大,取「天下一切皆属天子」之意;1984 年后因插金花寓意「金榜题名 + 洞房花烛」逐渐成为通行规则 |
| 2 | 六勃黑算不算状元 | 同一份资料的两个章节自相矛盾 |
| 3 | 遍地锦(六个一)是否独立成级 | 独立 / 并入六勃黑,合并后六勃黑从 4 种变 5 种 |
| 4 | 五子之间要不要比那 5 枚相同的点数 | 两种说法结论完全相反:6 6 6 6 6 5 与 5 5 5 5 5 6 谁大取决于此 |
| 5 | 四红状元比两颗之和还是最大单颗 | 多数来源为「之和」 |
| 6 | 状元追奖细节 | 同一人两次状元取大还是取最后一次;两人同大是先博者胜还是平分 |
所以我没有选边站,而是把全部争议做成了 7 个可配置开关,每个开关配一句白话解释,默认取多数来源的说法,另外提供「导出本局规则卡」——闽南各地规则不同,开博前先约定好本来就是真实需求,这个功能正是从分歧里长出来的。
判定逻辑我用穷举验证过: 六颗骰子共 6^6 = 46656 种组合,全部枚举后按判定优先级互斥分类,各等级组合数与公开概率表逐项吻合,总和恰为 46656:
| 等级 | 组合数 | 单次命中率 |
|---|---|---|
| 状元插金花 | 15 | 0.032% |
| 满堂红(六勃红) | 1 | 0.002% |
| 遍地锦 | 1 | 0.002% |
| 六勃黑 | 4 | 0.009% |
| 五王(五红) | 30 | 0.064% |
| 五子(五子登科) | 150 | 0.322% |
| 状元(四红) | 360 | 0.772% |
| 对堂 | 720 | 1.543% |
| 三红 | 2500 | 5.358% |
| 四进 | 1875 | 4.019% |
| 二举 | 9300 | 19.933% |
| 一秀 | 17400 | 37.294% |
| 空(无奖) | 14300 | 30.650% |
| 合计 | 46656 | 100% |
顺带读出两个有意思的事实:一秀单次命中率 37.3%,32 份大约 86 次投掷内就发完,所以「奖品拿完后的追讨规则」不是边角料而是每局必然触发的场景;而状元整体命中率 1.2%,反而低于对堂的 1.5%。
这张表不是我抄的,是页面自己跑出来的——你打开附件往下拉就能看到「自动验收报告」区块里逐项打勾的同样数字。
五、功能清单(对照原评论逐条核对)
| 原评论要求 | 实现情况 |
|---|---|
| 手机摇一摇掷出六个骰子 | |
| 碗底晃动动画 | |
| 骰子碰撞声 | |
| 自动判定一秀/二举/四进/三红/对堂/状元 | |
| 全家同一局积分排行 | |
| 奖品自定义录入 | |
| 一局结束自动结算谁抱走状元 | |
| 外地视频连线也能隔空博一把 |
额外做的(原来没想到,但考据后发现必须有):
- 7 个规则开关 + 白话解释 + 导出本局规则卡(文本 + 长图两种)
- 三红/对堂拿完后的追讨机制
- 状元插金花可得状元加两个对堂共三份大奖
- 六勃黑「关灯抢饼」彩蛋、满堂红金光彩蛋
- 完整投掷历史 + localStorage 存档,刷新不丢
- 战报长图导出(运行时 Canvas 生成 720×884 PNG,不占文件体积)
- 博饼小知识折叠区(非遗来历、63 之数寓意、郑成功与洪旭传说、探花典故)
- 双节倒计时,默认指向国庆,可改任意日期,过期只显示「已到,开博!」不显示负数
六、用 TraeCode 创作的过程
分五个阶段推进,每阶段跑通验收再进下一阶段。规则考据那部分是我自己查的,不算 TraeCode 的活。
阶段一 · 判定引擎(先把它做对,不写界面)
阶段二 · 游戏流程
玩家管理、63 份奖品库存、先到先得与追讨、状元追奖与覆盖、终局条件、localStorage 存档。
阶段三 · 视觉与音效
瓷碗釉面高光、骰子四点必须是红色(这是博饼最核心的视觉特征)、三段式动画、Web Audio 合成音效、状元印章金光、六勃黑关灯彩蛋。
关键取舍:判定先算、动画后播,定格的那一面就是判定输入,所以动画再花哨也不会和结果对不上。
阶段四 · 规则设置与分享
7 个开关的 UI、奖品名自定义、规则卡导出、战报长图、双节倒计时、小知识折叠区。
验收:逐个开关切换并用演示模式投出受影响的特定点数,确认结果随之改变;另外拿奖品名输入框做了一次 XSS 注入测试,payload 以纯文本渲染。全页动态文本只用 textContent,innerHTML 写入为 0 处。
阶段五 · 交付前自检与打包
外链零依赖扫描(断言不存在任何外部 http 引用、无 fetch/XHR/WebSocket、音频全部 Web Audio 实时合成、零 base64 内嵌资源)、隔离目录断网实测走完一整局、console 零 error/warning、三种手机分辨率布局检查、触控目标检查、文件体积控制,最后收敛成单个 index.html。
验收:把这一个文件单独复制到空目录打开,完整玩一局,音效与导出正常,刷新后存档还在。
这一轮我让它修了一个真问题:复制战报时如果剪贴板 API 被拒(微信内置浏览器很常见),原来只弹一句「请手动复制」,可屏幕上已经没有可选的文本了,是条死路。现在失败会自动展开一个可长按全选的文本层。
七、设计取舍与已知限制
多人为什么用同屏传递而不是联网对战?
- 全家围着一张桌博饼本来就是博饼的原生场景,一台手机传着博比各自盯着屏幕更接近真实玩法;
- 无后端意味着单文件、离线可用、发给谁都能直接打开,对长辈零门槛。
外地视频连线的场景怎么办:各自打开同一份文件,各自博各自的,用「导出战报」把结果发到群里对比——这是妥协,我如实说明。需要真联网版本的话我可以后续加。
为什么倒计时默认指向国庆而不是中秋?
- 2026 年中秋是 9 月 25 日(周五,放假 9 月 25–27 日不调休),交作品时中秋刚过、国庆将至,默认「今年中秋」会显示一个已过期的日期。所以默认目标改为 10 月 1 日国庆,可手动改成任意日期,另外内置了「下一个中秋(2027-09-15)」「下一个国庆(2027-10-01)」两个预设按钮。目标日过了也不会显示负数,只会显示「已到,开博!」。(这里补一句:博饼本来就不止中秋当天——传统上郑成功批准的是农历八月十三至十八前后六夜,军中按单双日轮流赏月博饼;厦门现代的博饼赛事和企业活动也常办到十月。整个双节假期都用得上。)
已知限制
- 骰子物理是表现层动画,不是真实物理模拟,最终定格面由判定结果决定(这是刻意的,保证结果一定正确)。
- 音效需首次交互后才能播放,这是浏览器自动播放策略,不是 bug。页面右下角有音效开关。
- 「交付自检」区块里的第 7a 项(本地存储检查)在首次打开时会显示「未验证」而不是「通过」——因为那时浏览器里还没有任何存档键,空数组做检查等于没检查,我不想让它假装通过。开始一局之后再回看,这一项就是「通过」,区块标题也会变回「全部通过」。
- 手机端摇一摇在 iOS 上需要用户手势授权,页面已做兼容,但个别低版本可能仍要走按钮。
八、最后
闽南有句话,「博有博无,欢喜就好」。
一秀的概率是 37%,状元只有 1.2%,大多数时候博到的是空——但没人真的在意,重要的是六颗骰子落进瓷碗那一声叮当,和一桌人一起等结果的那两秒。
祝中秋国庆团圆。要是你博到了状元插金花,回来告诉我一声。
—— 用 TraeCode 做的,规则考据我自己查的,有错请指出,我改。






