YaKyoLife 棒球人生模擬器
純文字的台灣棒球生涯模擬:高中三大賽、選秀、中職→日職→大聯盟、Tommy John 手術、自由球員與名人堂票選——全部由種子化 PRNG 驅動,相同種子+相同選擇=重播同一段人生。
七大面向
memory技術深度 7.5/10
沒有炫技的渲染器——深度在領域模型。career.js 把守位難度換算成失分再依各聯盟真實球季場次(120/143/162)縮放,而不是寫死 162,再套 ERA/WHIP 與 AVG/OPS 品質係數,讓「堆數據」壓不過「壓制力」。season.js 由「能力減聯盟基準」加常態噪音推導率值,並強制物理約束(救援+中繼+勝+敗 ≤ 出賽數、盜壘以上壘次數封頂)。injury.js 把韌帶負荷模型化為球威 × 投法 × 角色標準化工作量,術後再乘疤痕係數。周邊還有:種子化 mulberry 式 PRNG(rng.js)、以 SEED|season|year|team 決定性雜湊出球隊強弱(整個聯盟不必存檔就能重建)、結算圖的「先量測再繪製」兩趟 Canvas 渲染、以 WCAG 相對亮度替 48 種隊色挑可讀文字色(dom.js:29)、手刻的 iOS 雙擊縮放抑制且放行拖曳(main.js:20-37),以及以 Blob URL 在執行期組出 PWA manifest(main.js:148-165)。
stadia_controller遊戲設計 8.5/10
本次體檢最強的設計面向,因為它是唯一量測過的。CHANGELOG 記錄了完整流程的蒙地卡羅模擬(11 條生涯路線 × 1,400 段人生;另一輪跑 12,600 段生涯),把整條評價階梯重新錨定到明確目標——名人堂=全部玩家的 15%、歷史級=名人堂的 25%。那些模擬揪出真的壞掉的東西:名人堂門檻是用「能力 68~80」校準的,但潛力生成器的投手球威潛力中位只有 61.0,於是日職與大聯盟的投手線高過任何玩家可能達到的上限;終結者拿 10 次救援王,獎項只折算成生涯總分的 5%;大聯盟被罰兩次而成為名人堂死路(4.1%);入選年份用 ri(2,6) 亂數決定,讓票選與實力無關。每一項修正都附前後數據。玩法本身——三階段年度循環、92 張三段風險模式事件卡、34 個隱藏特質、擲骰配點的成本曲線、合約/FA/入札規則——有真實取捨,不是純數值堆疊。
security後端與安全 5.5/10
刻意沒有後端:無帳號、無伺服器、資料不離開瀏覽器,也就沒有密鑰可洩漏。開場的輸入驗證做得細——姓名與背號用 setCustomValidity 檢查,只填一欄會被擋下而不是偷偷混入預設值。缺口在種子:rng.js:2 直接讀 ?seed= 且不做消毒與長度限制,引退畫面再把它丟進 choose(),而 choose() 用的是 innerHTML(dom.js:127)。於是精心構造的連結可以注入標記——正好落在遊戲主打的「分享種子連結」功能上,只是需要對方把一段生涯玩到引退才會觸發。球員姓名走同一條未跳脫的路徑進 card(),但那是玩家自己輸入且限 10 字。
code程式品質 7.5/10
本次體檢註解寫得最好的一份程式碼。45 個檔案切成乾淨的 core / data / engine / flow / ui,而註解說明的是為什麼且附上數字:為什麼隊色改當底色(48 色裡有 29 色對比度低於 3:1)、為什麼不再從 DOM 裁掉舊年度區塊(會讓時間軸捲動失效,而且根本沒省到)、為什麼移除「二次重建後第三年必拉警報」的硬性期限(那讓玩家的決策失去意義)。也有真實的 PR 流程:25 次 merge、第二位貢獻者的 feature 分支、DEV → main 的發版儀式。債務是:newState() 回傳一個約 100 個欄位的 god object,內含 40 個布林的 traits(state.js:8);season.js 仍在 import 它自己註解裡承認的「temporary scaffold」;少數檔案退化成單行長牆(dom.js:86);每次發版都要手動把 173 個 ?v=1.5.8 import token 全數改掉。
experiment測試 2.5/10
沒有測試檔、沒有 CI、沒有 linter、沒有 package.json——什麼都不會自動跑。但這個專案驗證的程度超過本站其他任何一個:CHANGELOG 對每一項平衡調整都附模擬母體(每組配置 N=250,單次校準最多 12,600 段生涯)與前後入選率。那是實證驗證,只是別人無法重現——模擬工具沒有進 repo,任何審閱者都無法重跑任何一個數字,也沒有任何回歸能被自動攔下。最值得測的純函式(careerScore、honorScore、tjAccrue、數據一致性 clamp)正好就是模擬非正式驗證過、而 repo 完全沒測的那些。
verified完成度 8.5/10
是產品的出貨方式,不是原型:上線於自有網域、可安裝為 PWA、四種佈景主題、電腦與手機各一套版型、大字級模式、誤觸重整保護、Canvas 結算圖+系統分享、重播連結。遊戲周邊有 506 行 wiki、18 天內 32 個發布版本的更新日誌、Discord 社群與贊助頁。內容量也紮實——92 張事件卡(每張三種風險模式、成敗各有文本)、34 個特質、三個聯盟共 48 支虛構球隊。從第一個到最後一個 commit 的 18 天,天天都有 commit。
emoji_objects原創性 7.5/10
棒球生涯模擬不是新東西(實況野球的成功模式、OOTP),年度循環+事件卡也是熟面孔。真正稀缺的是這個題材:一款繁體中文、完全依台灣路徑打造的模擬——高中三大賽、中職選秀、旅日旅美、國際賽徵召、入札金、回台。48 個隊名是恰到好處的戲仿:近到一眼看懂,遠到避開商標。「種子化人生」(可分享的種子=可重播的一生)與「得票率由超標比例決定」的名人堂票選,都不只是類型裝飾。
trending_up亮點
- 用模擬校準平衡——完整流程蒙地卡羅把評價階梯重新錨定到明確目標(名人堂=全部玩家 15%),因為證明了舊門檻根本走不到(
CHANGELOG.mdv1.5.8) - 守位價值隨球季長度縮放——守位難度換算成失分後依各聯盟場次(120/143/162)縮放,而非寫死 162,場次較少的聯盟不會被默默吃掉守位分(
career.js) - 韌帶負荷模型,不是擲骰——TJ 風險由球威 × 投法 × 角色標準化工作量累積,每次手術後加疤痕係數,並對照現實動刀頻率調校(
injury.js:9-33) - 一串種子長出決定性的世界——球隊強弱由
SEED|season|year|team雜湊而來,整個聯盟的歷史不必儲存就能重現(contract.js:104) - 48 種隊色的對比度計算——量到 48 色中有 29 色當文字時低於 3:1,於是改用隊色當底、依亮度挑文字色(
dom.js:26-33)
trending_down弱點
- 未消毒的種子進入
innerHTML——?seed=原樣讀入(rng.js:2),引退時經choose()渲染(dom.js:127),構造過的分享連結可注入標記 - 模擬工具沒進 repo——CHANGELOG 裡每一項平衡論述,別人都無法驗證、無法重跑
- 約 100 個欄位的 god state——
newState()把所有計數器、旗標與 40 個布林特質塞進單一物件(state.js:8) - 173 個手動維護的 cache-bust token——每次發版都要把所有
?v=1.5.8import 同步改掉,漏一個就會出貨混版本的模組圖 - 零測試、零 CI、零 linter——連
package.json都沒有;發版前沒有任何東西會跑
會跑數字的更新日誌
多數業餘遊戲靠手感調平衡,這一款把它重新推導了一遍。v1.5.8 記載:先前所有版本的名人堂門檻,都是拿「固定能力值 68~80」校準的,而那個區間沒有玩家到得了——潛力生成器把投手三項球威的潛力中位釘在 61.0、理論最高 69.3。於是日職(69.8)與大聯盟(72.2)的投手名人堂線高過任何可達成的球員,實測整個玩家母體的名人堂率是 1.2%。
修法同樣有代表性:不是把看得見的門檻調低,而是把聯盟係數同乘 1.8834——數學上等同於除門檻,卻讓玩家已經熟悉的那個數字(7,500)留在畫面上。同一則還重評了終結者(拿 10 次救援王的生涯,獎項只折算出 354 分)、讓大聯盟不再是名人堂死路(4.1% → 20.9%),並把 ri(2,6) 的隨機入選年份改為由「超標多少」決定。
這是本次體檢中,業餘專案做了連職業工作室也常略過的事的最清楚案例——同時也是本站反覆看到的那個缺口最清楚的例子,因為那些模擬程式一行都不在 repo 裡。
smart_toyAI 輔助開發跡象
公開與 AI 共同開發,但不是 AI 主導:267 個 commit 中 Claude 是作者的有 39 個、另有 30 個共同署名,旁邊還有四個人類身分——擁有者(片頭也署名為最先生 Mr.TheMost)、以 pull request 貢獻的第二位開發者,以及 DEV 分支的 merge commit。有意思的是人類的指紋:events.js 開頭寫明 92 張卡是由哪一份試算表產生、缺哪五個 ID,並註明沒有來源文本就不得自行補寫——正好是針對 AI 內容生成最容易出的那種錯所設的護欄。
summarize統計
| 技術棧 | Vanilla JS (ES modules) · No build step · Canvas 2D · CSS custom properties · PWA · GitHub Pages |
|---|---|
| 類型 | 純文字生涯養成模擬 |
| 開發期間 | 2026-08-07 → 2026-08-24 |
| 實際開發天數 | 18 天 |
| Commit 數 | 267 |
| 程式碼行數 | ~8,736 |
| 作者 | Leo Chang・最先生(LeoGGcat) |
總評
本次體檢中最深的模擬與最嚴謹的平衡工程,18 天內以真正的產品規格出貨,還附上一份會替自己數字辯護的更新日誌。它的天花板來自流程而非手藝:沒有測試、沒有 CI、校準工具在 repo 之外,還有一個未消毒的 URL 參數進到 innerHTML——就落在專為分享而做的那個功能上。