基于科学地震学计算的交互式地震逃生模拟游戏,参加 Trae AI 创造力大赛。
- Node.js >= 14
- Python >= 3.8(编辑器可选)
node server/server.js浏览器打开 http://localhost:3000
pip install flask
python editor/editor.py浏览器打开 http://localhost:5000
eqgame/
├── server/ # 游戏服务器(原生 Node.js HTTP)
│ ├── server.js # 主服务器:API、存档、AI 生成
│ └── db.js # SQLite 用户数据库
├── start/ # 科学管道与开局数据
│ ├── Start_process_function/ # 7 步地震学计算模块
│ ├── landform.json # 地貌数据(6 种)
│ ├── career.json # 职业数据(6 种)
│ ├── hobby.json # 爱好数据(4 种)
│ ├── building_structure.json # 建筑结构(7 种,含倒塌/伤亡率)
│ ├── venues.json # 场所数据(8 种)
│ └── start.js # 客户端状态初始化
├── event/ # 事件系统
│ ├── event.json # 事件库(含开局事件)
│ ├── event.js # 事件引擎(过滤/选择/效果/疾病/建筑判定)
│ ├── eew.js # 地震预警引擎(P/S 波倒计时)
│ ├── ai_generated.json # AI 生成事件缓存
│ └── disease/ # 疾病系统(6 种疾病 + tick 结算)
├── achievement/ # 成就系统
│ ├── achievement.json # 41 个成就
│ └── achievement.js # 成就运行时检查引擎
├── history/ # 历史模拟模式
│ └── 20080512/ # 汶川地震数据
├── editor/ # 事件编辑器(Flask + 可视化连线)
│ ├── editor.py # Flask 后端
│ ├── ai_agent.py # AI 代理调试模式
│ └── templates/editor.html # 可视化连线编辑器
├── plot/ # 剧情设计文档
│ ├── phases/ # 分阶段剧情(预警→震中→逃生→灾后→结局)
│ ├── chains/ # 事件链设计
│ └── drafts/ # 草稿与灵感
├── save/ # 存档目录(按用户名分目录)
├── game.html / game.js # 游戏主界面
├── index.html / script.js # 登录注册页
└── style.css # 全局样式
- 震级生成 → 2. 震源深度 → 3. 震中距 → 4. Vs30 → 5. 断层/地貌/天气 → 6. 持时/烈度 → 7. 断层距
- P 波 5.5km/s、S 波 3.5km/s 倒计时
- 盲区判断(震中距 < 16.5km 无预警时间)
- 15 条实时决策,颜色闪烁按烈度分级
- 多维过滤:前置事件/互斥/地形/地点/职业/爱好/天气/地貌/建筑
- 开局事件分"接到预警/没接到预警"两类
- 链式跳转、效果应用、疾病 tick 结算、建筑倒塌判定
- 接入智谱 GLM-4.7-flash API
- 根据当前游戏状态和历史事件生成上下文相关事件
- 支持撤回/重试,生成事件缓存到 ai_generated.json
- 41 个成就,运行时自动检查(烈度/回合/速度/预警/极限等)
- 剧情成就通过事件选项手动授予
| 方法 | 路径 | 功能 |
|---|---|---|
| POST | /api/register | 注册 |
| POST | /api/login | 登录 |
| GET/POST | /api/check | Token 验证 |
| POST | /api/game/start | 开始新游戏 |
| GET/POST | /api/game/state | 获取状态 |
| POST | /api/game/update | 更新状态 |
| POST | /api/game/save | 保存存档 |
| POST | /api/game/load | 加载存档 |
| GET/POST | /api/game/saves | 存档列表 |
| GET/POST | /api/game/has-save | 检查存档 |
| GET/POST | /api/game/save-info | 存档信息 |
| POST | /api/game/complete | 结档 |
| POST | /api/game/delete-save | 删除存档 |
| POST | /api/game/clear-session | 清空会话 |
| POST | /api/game/ai-generate | AI 生成事件 |
| GET/POST | /api/game/ai-cache | 读取 AI 缓存 |
# 安装依赖
apt-get install -y nodejs git python3 python3-pip
pip3 install flask
# 创建裸仓库(作为推送目标)
mkdir -p /eqgame
git init --bare /eqgame.git
# 配置 post-receive 自动部署钩子
cat > /eqgame.git/hooks/post-receive << 'EOF'
#!/bin/bash
GIT_DIR=/eqgame.git
WORK_TREE=/eqgame
cd $WORK_TREE || { git clone /eqgame.git $WORK_TREE && cd $WORK_TREE; }
git --git-dir=$GIT_DIR --work-tree=$WORK_TREE fetch --all
git --git-dir=$GIT_DIR --work-tree=$WORK_TREE reset --hard origin/master
echo "[Git] 部署完成! $(date)"
EOF
chmod +x /eqgame.git/hooks/post-receive# 首次推送(设置上游分支)
git remote add origin root@你的服务器IP:/eqgame.git
git push -u origin master
# 日常推送只需一行
git pushcd /eqgame
# 游戏服务器(需后台运行,推荐用 PM2 或 screen)
nohup node server/server.js > server.log 2>&1 &
# 编辑器(可选)
nohup python3 editor/editor.py > editor.log 2>&1 &注意:上传脚本
_upload.py中包含服务器密码,已在.gitignore中排除,不会推送到 Git 仓库。
本项目(代码、成就图标、事件文本、剧情设计)采用 CC BY-NC 4.0 许可协议。
- BY(署名):使用或分享本项目时需标明原作者
- NC(非商业性使用):禁止将本项目用于商业目的
文档/目录下的参考学术资料仅作开发参考,不进入生产环境