營模擬游戲原型)
做一款 AI 公司題材的 tycoon 游戲表面上是在設(shè)計(jì)一串?dāng)?shù)字增長(zhǎng)實(shí)際上是在模擬一家技術(shù)公司的資源分配過程。玩家手里有現(xiàn)金、算力、數(shù)據(jù)、工程師和聲譽(yù)五類資源需要不斷做出選擇是先買數(shù)據(jù)訓(xùn)練模型還是先做市場(chǎng)投放是盡快上線一個(gè)效果一般的產(chǎn)品還是攢資源訓(xùn)練一個(gè)高質(zhì)量模型。下面用一個(gè)最小可運(yùn)行的工程把這條路走通后端使用 FastAPI存儲(chǔ)使用 SQLite前端只保留一個(gè)簡(jiǎn)易操作頁。最終會(huì)得到一個(gè)可以點(diǎn)擊、可以驗(yàn)證、可以繼續(xù)擴(kuò)展的 AI 公司經(jīng)營游戲原型。這個(gè)項(xiàng)目對(duì)開發(fā)者來說真正的價(jià)值不是“做一個(gè)游戲”而是練習(xí)后端狀態(tài)管理、時(shí)間系統(tǒng)、數(shù)據(jù)持久化和數(shù)值平衡。對(duì)想接觸 AI 工程實(shí)踐的開發(fā)者它也能幫你理解模型訓(xùn)練、資源消耗和產(chǎn)品化之間的成本關(guān)系。需要先說明一點(diǎn)這里說的“訓(xùn)練模型”只是游戲里的數(shù)值模擬不是真實(shí)的大模型訓(xùn)練。這樣設(shè)計(jì)是為了先把經(jīng)營循環(huán)跑起來后面再按需替換成真實(shí)技術(shù)棧。文章會(huì)給出完整的數(shù)據(jù)表結(jié)構(gòu)、核心引擎代碼、API 接口和前端交互片段。代碼不一定是最優(yōu)實(shí)現(xiàn)但每個(gè)選擇都有明確原因尤其是“為什么使用懶更新而不是后臺(tái)循環(huán)”和“為什么把經(jīng)濟(jì)系統(tǒng)放到后端而不是前端”。1. 先拆解游戲核心AI 公司經(jīng)營到底模擬什么1.1 玩家目標(biāo)和核心循環(huán)tycoon 游戲或者說經(jīng)營模擬游戲最核心的循環(huán)是賺錢投入產(chǎn)出再投入。AI 公司題材只是把“生產(chǎn)”環(huán)節(jié)替換成 AI 行業(yè)特有的動(dòng)作。AI 公司題材的循環(huán)可以拆成五步玩家用現(xiàn)金購買數(shù)據(jù)和算力。雇傭工程師作為生產(chǎn)資源。工程師消耗數(shù)據(jù)和算力訓(xùn)練出一個(gè)模型。玩家將模型發(fā)布成產(chǎn)品產(chǎn)品持續(xù)產(chǎn)生收入。收入繼續(xù)用于購買數(shù)據(jù)、擴(kuò)充算力、招聘工程師和做市場(chǎng)投放。如果收入長(zhǎng)期覆蓋不了工資和采購成本公司就會(huì)破產(chǎn)。所以玩家的目標(biāo)不是“訓(xùn)練出最好的模型”而是在現(xiàn)金流約束下讓每條決策都更接近可循環(huán)的增長(zhǎng)。1.2 五類資源與經(jīng)營動(dòng)作游戲里的資源不能設(shè)計(jì)得太復(fù)雜否則新手玩家很難理解。建議第一版只保留五類資源現(xiàn)金、算力、數(shù)據(jù)、工程師、聲譽(yù)。資源作用初始值主要變化來源現(xiàn)金支付所有采購和工資100000產(chǎn)品收入增加招聘、買數(shù)據(jù)、市場(chǎng)投放減少算力訓(xùn)練模型時(shí)消耗50每 tick 自動(dòng)恢復(fù)一部分訓(xùn)練時(shí)消耗數(shù)據(jù)訓(xùn)練模型時(shí)消耗100購買數(shù)據(jù)集增加訓(xùn)練時(shí)減少工程師訓(xùn)練任務(wù)必需的生產(chǎn)力0招聘增加工資按 tick 扣除聲譽(yù)放大產(chǎn)品收入倍率0市場(chǎng)投放增加對(duì)應(yīng)地第一版只需要五個(gè)經(jīng)營動(dòng)作招聘工程師消耗現(xiàn)金獲得一個(gè)技能值隨機(jī)但穩(wěn)定的工程師。購買數(shù)據(jù)消耗現(xiàn)金增加數(shù)據(jù)量。訓(xùn)練模型占用一個(gè)空閑工程師消耗算力和數(shù)據(jù)經(jīng)過一段時(shí)間后生成一個(gè)模型。發(fā)布產(chǎn)品選擇最新訓(xùn)練完成的模型開始產(chǎn)生每 tick 收入。市場(chǎng)投放消耗現(xiàn)金增加聲譽(yù)。這五個(gè)動(dòng)作已經(jīng)足夠覆蓋“資源投入、生產(chǎn)等待、產(chǎn)品變現(xiàn)、再投入”的閉環(huán)。后續(xù)要加特殊事件、研究樹、競(jìng)品系統(tǒng)都是在這個(gè)閉環(huán)之上擴(kuò)展。1.3 數(shù)值設(shè)計(jì)要回答的三個(gè)問題寫代碼之前要先把數(shù)值規(guī)則想清楚。否則會(huì)出現(xiàn)“每天收入很高但工資更高”“訓(xùn)練成本永遠(yuǎn)無法收回”“產(chǎn)品上線后收益沒有感知”等情況。第一版需要回答三個(gè)問題每個(gè) tick 有多長(zhǎng)這里定義 1 tick 1 秒方便本地觀察。生產(chǎn)環(huán)境可以改成 2 秒、5 秒或 10 秒。產(chǎn)品收入是否覆蓋維護(hù)成本產(chǎn)品收入必須明顯高于單個(gè)工程師的工資否則公司規(guī)模越大越容易破產(chǎn)。訓(xùn)練等待是否值得訓(xùn)練需要消耗數(shù)據(jù)、算力和時(shí)間所以模型質(zhì)量上限要能帶來顯著收入提升玩家才愿意等待。這些數(shù)值不需要一開始完美但要有調(diào)參入口。全部集中在引擎文件頂部不要分散在代碼里。2. 技術(shù)選型與整體架構(gòu)用 FastAPI 和 SQLite 跑通最小閉環(huán)2.1 為什么選 FastAPI SQLite 原生前端選技術(shù)棧時(shí)第一版的目標(biāo)是“能快速驗(yàn)證玩法”而不是“支撐十萬玩家”。FastAPI 適合做這類原型因?yàn)樗慕涌诙x簡(jiǎn)單可以直接返回 JSON開發(fā)體驗(yàn)接近寫普通 Python 函數(shù)。SQLite 是零配置數(shù)據(jù)庫文件即數(shù)據(jù)庫適合本地開發(fā)和單機(jī)測(cè)試。前端使用原生 HTML JavaScript不需要 Webpack、Vite 等構(gòu)建工具打開瀏覽器就能操作。需要說明的是這個(gè)組合適合學(xué)習(xí)和驗(yàn)證不代表生產(chǎn)環(huán)境也要這么選。真實(shí)項(xiàng)目通常會(huì)引入 PostgreSQL、Redis、異步任務(wù)隊(duì)列和前端框架。如果后續(xù)規(guī)模擴(kuò)大FastAPI 的接口層可以保留但存儲(chǔ)和實(shí)時(shí)推送都需要替換。2.2 用懶更新來代替后臺(tái)循環(huán)經(jīng)營游戲最常見的技術(shù)問題是“時(shí)間怎么推進(jìn)”。最簡(jiǎn)單的做法是啟動(dòng)一個(gè)后臺(tái)線程或異步任務(wù)每 tick 更新一次數(shù)據(jù)庫。但這個(gè)方案有三個(gè)問題服務(wù)重啟后后臺(tái)循環(huán)可能丟失。多個(gè) worker 同時(shí)推進(jìn)狀態(tài)容易產(chǎn)生重復(fù)扣費(fèi)或重復(fù)發(fā)工資。離線時(shí)間里狀態(tài)無法自動(dòng)推進(jìn)。這里采用懶更新也叫 tick-on-read。做法是數(shù)據(jù)庫里保存last_tick_at字段每次玩家請(qǐng)求狀態(tài)時(shí)根據(jù)當(dāng)前時(shí)間和上次更新時(shí)間的差值計(jì)算出應(yīng)該推進(jìn)多少個(gè) tick然后一次性推進(jìn)。這樣不需要后臺(tái)任務(wù)服務(wù)重啟也能通過時(shí)間差繼續(xù)推進(jìn)也更容易控制單個(gè)請(qǐng)求的計(jì)算量。為了防止玩家離線很久后一次性循環(huán)幾萬次需要設(shè)置一個(gè)最大 tick 上限例如最多推進(jìn) 120 個(gè) tick超出部分直接丟棄或按上限結(jié)算。2.3 項(xiàng)目目錄結(jié)構(gòu)項(xiàng)目文件不多保持扁平即可ai-tycoon/ ├── main.py # FastAPI 入口和接口定義 ├── engine.py # 游戲引擎狀態(tài)推進(jìn)、經(jīng)營動(dòng)作、初始化 ├── schema.sql # SQLite 建表腳本 ├── requirements.txt # Python 依賴 └── static/ └── index.html #