Side Projects
我要財富自由
跨平台理財模擬遊戲,玩家需在退休前達成 F5 財富自由。包含 225 個事件、83 個成就、15 種結局、7 個 FI 等級。使用 React 19 + Capacitor 開發,支援 iOS/Android/Web 三平台。
要解決的問題
理財觀念大多停留在文章與試算表裡,很難體會「收入、支出、投資、意外與生活品質」在幾十年間怎麼互相影響。「我要財富自由」把一整個人生壓縮成回合制遊戲:每個月做一次決定,月底結算,看看自己能不能在退休前達到 F5 財務獨立。玩家可以在不冒真實風險的情況下,試試看保險、槓桿、創業或只是穩穩存錢會走向什麼結局。
畫面截圖
主要功能
每月一回合的人生模擬
每個月處理工作、支出、投資與生活,按下結算後引擎會一次處理收支、市場、事件、成就與結局等步驟。健康、幸福感、名望、洞察力與人脈和現金一樣重要,只顧賺錢也可能走向壞結局。
F0 到 F6 的財富自由等級
從負債的 F0 到富裕自由的 F6 共 7 個等級。F5 財務獨立的條件是被動收入不低於月支出,或淨資產達到年支出的 25 倍,這也是遊戲的主要目標。
職涯、創業與投資
有多種職業與創業類型可以選擇,市場上有股票、ETF、加密貨幣等投資標的,也能開槓桿部位,另外還有保險、貸款、房產與商品交易。
隨玩家狀況出現的事件
疾病、裁員、市場波動、人際機會等事件依玩家目前的處境出現,部分事件需要玩家做選擇,選擇會影響後續的財務與屬性。
成就與多重結局
成就依條件自動判定,未解鎖的成就會顯示目前進度,快完成的排在前面。每局結束時依條件觸發不同評級的結局,結局記錄會跨局累積。
離線遊玩與三種語言
遊戲資料存在裝置本機的 SQLite,不需連線即可遊玩。介面提供繁體中文、簡體中文與英文。
技術架構
遊戲以 React 19、TypeScript 與 Vite 開發,再用 Capacitor 包成 iOS 與 Android App,同一份程式碼也能直接以網頁執行。狀態管理使用 Zustand 搭配 Immer,樣式為 Tailwind CSS 4,圖表用 Recharts,多語系使用 i18next。資料層採 Repository pattern,原生平台使用 Capacitor Community SQLite,網頁版則透過 jeep-sqlite 在瀏覽器中執行同一套 SQLite schema。遊戲邏輯放在與 UI 分離的領域層:一個 GameEngine 搭配多個負責單一步驟的 Processor(收入、支出、事件、成就、結局等),事件、成就、結局與職業都以 JSON 設定檔描述,新增內容通常只需要改設定。測試以 Vitest 涵蓋領域邏輯,Playwright 涵蓋端對端流程。
技術挑戰與取捨
事件數量變多後,多數事件幾乎抽不到
所有事件原本放在同一個池子裡按權重抽選,事件超過兩百個後,低權重的事件每月被抽中的機率只剩千分之一點五左右,有些事件可能整局都不會出現,也不一定和玩家當下的處境有關。後來改成分層過濾:先依玩家狀態決定哪些事件池是活躍的(例如有工作才加入職涯池、有房才加入住房池),再檢查觸發條件與冷卻時間,最後對從未觸發過的事件給兩倍權重。候選事件因此從全部縮小到與玩家相關的幾十個,相關事件出現的頻率明顯提高。
遊戲平衡要能重現
人生模擬的數值牽一髮動全身,只靠手動試玩很難知道某個調整的實際影響。引擎所有隨機性都來自可指定種子的 Mulberry32 隨機數產生器,因此可以用固定的種子清單驅動真正的 GameEngine 與真實設定檔,批次模擬整段人生。其中一次模擬讓 30 位完全不操作的玩家自動跑月結算,結果全部在兩年內因幸福感或健康歸零而觸發壞結局,確認了「放著不管會失敗」是設計使然,也找出了沒有被動回復管道的幸福感衰減問題,作為後續調整數值的依據。
把月結算拆成可測試的步驟
月結算要處理家庭、收入、支出、職涯、創業、保險、事件、槓桿、成就、結局等十幾件事,而且順序會影響結果,例如事件要在收支結算之後才觸發,結局判定一定放在最後。如果全部寫在一個函式裡,每加一個系統都可能影響其他系統。最後採用 Processor 模式:每個 Processor 只負責一個步驟,由 GameEngine 依固定順序呼叫,各自可以單獨測試。新增系統時只要加入一個 Processor 並決定它在流程中的位置。
現況
以同一份程式碼支援 iOS、Android 與網頁三個平台;repo 中目前的 App 版本為 1.1.0。
使用技術
- React 19
- Capacitor
- TypeScript
- Zustand
- SQLite
- i18next



