黑暗森林法则 · 宇宙文明模拟器
基于《三体》黑暗森林理论的 Web 端实时模拟系统
"宇宙就是一座黑暗森林,每个文明都是带枪的猎人。" — 罗辑,《三体II:黑暗森林》
刘慈欣在《三体》系列中提出了黑暗森林法则,其核心基于两条公理:
| 公理 | 推论 |
|---|---|
| 生存是文明的第一需要 | 文明的首要目标是活下去 |
| 文明不断增长和扩张,但宇宙物质总量保持不变 | 资源竞争不可调和 |
从这两条公理出发,推导出两个关键概念:
- 猜疑链 — 你无法确定对方是否善意,对方也无法确定你是否善意。这个猜疑无限循环
- 技术爆炸 — 一个看似弱小的文明可能在短时间内实现技术飞跃,超越你并构成威胁
结论:一旦发现另一个文明,最安全的做法是立即将其摧毁。
本项目模拟了这个残酷的宇宙社会模型——100 个文明散布在 1000×1000 光年的空间中,它们探测、隐藏、广播、攻击,最终只有最狡猾(或最强大)的文明能够幸存。
- 🤖 6 种文明性格 — 侵略者、隐藏者、技术狂、外交家、偏执狂、投机者
- 🧬 9 级科技树 — 从原始文明(L0) 到神级文明(L8)
- 💥 技术爆炸 — 低等级文明概率触发连续等级跃迁
- 🔭 探测系统 — 动态探测半径、广播暴露、自适应扫描
- ⚔️ 三种打击方式 — 光粒、二向箔、广播咒语
- ⚖️ 威慑纪元 — 技术相近的文明可进入相互确保毁灭(MAD)状态
- 🔗 猜疑链博弈 — 每个文明的攻击决策由多重因素计算
- 📊 实时可视化 — Canvas 星图 + WebSocket 实时推送
- 🌐 Web 界面 — 暗色太空主题,零依赖纯原生前端
- Python 3.12+
- pip
# 1. 克隆仓库
git clone https://github.com/Theater-ahyeon/darkside-simulation.git
cd darkside-simulation
# 2. 安装依赖
pip install -r requirements.txt
# 3. 启动服务器
python main.py
# 4. 打开浏览器
# http://127.0.0.1:8765python main.py --host 0.0.0.0 --port 8765darkside/
├── main.py # 入口:FastAPI 服务器启动
├── config.py # 全局可调参数配置
│
├── engine/ # ═══ 模拟引擎核心 ═══
│ ├── civilization.py # 文明类:性格 + 状态机 + AI 决策
│ ├── technology.py # 科技系统:9级科技树 + 技术爆炸
│ ├── detection.py # 探测系统:信号传播 + 自适应扫描
│ ├── attack.py # 攻击系统:光粒/二向箔/咒语
│ ├── diplomacy.py # 博弈系统:猜疑链 + 攻击阈值计算
│ ├── universe.py # 宇宙容器:回合循环 + 6阶段管道
│ └── event.py # 事件记录
│
├── server/ # ═══ Web 服务层 ═══
│ ├── app.py # FastAPI 路由 + WebSocket
│ ├── ws_manager.py # WebSocket 连接管理
│ └── schemas.py # Pydantic 数据模型
│
├── static/ # ═══ 前端 ═══
│ ├── index.html # 单页应用
│ ├── css/style.css # 暗色太空主题
│ └── js/
│ ├── app.js # WebSocket 主协调器
│ ├── renderer.js # Canvas 2D 星图渲染
│ ├── stats.js # 实时统计面板
│ ├── eventlog.js # 事件日志流
│ └── controls.js # 参数控制面板
│
└── tests/ # ═══ 单元测试 ═══
├── test_civilization.py # 文明状态机 & AI 决策测试
├── test_detection.py # 探测系统测试
└── test_universe.py # 宇宙回合循环测试
HIDING ──→ DEVELOPING ──→ BROADCASTING ──→ DETECTED ──→ DESTROYED
│ │ │ │
└────────────┴───────→ ATTACKING ←───────────┘
│
DETERRENCE ──→ DESTROYED
| 性格 | 探测意愿 | 攻击意愿 | 广播意愿 | 策略描述 |
|---|---|---|---|---|
| 🟥 侵略者 | 90% | 95% | 5% | 主动扫描,发现即摧毁 |
| 🟩 隐藏者 | 5% | 15% | 1% | 最大隐蔽,慢速发展,永不广播 |
| 🟦 技术狂 | 50% | 40% | 70% | 追求技术爆炸,不惧暴露 |
| 🟨 外交家 | 70% | 10% | 60% | 试图建立合作(极危险策略) |
| 🟪 偏执狂 | 50% | 90% | 2% | 因恐惧而先发制人 |
| 🟧 投机者 | 50% | 50% | 30% | 根据局势灵活调整 |
| 等级 | 名称 | 能力 |
|---|---|---|
| L0 | 原始文明 | 无法探测外太空 |
| L1 | 行星文明 | 可探测同一恒星系 |
| L2 | 恒星际文明 | 可实现星际航行 |
| L3 | 广播文明 | 可向宇宙广播信号 / 咒语 |
| L4 | 光粒文明 | 可使用光粒摧毁恒星 |
| L5 | 二向箔文明 | 可使用维度武器(AoE 杀伤) |
| L6 | 曲率文明 | 光速飞船 |
| L7 | 黑域文明 | 可制造低光速黑洞自我保护 |
| L8 | 神级文明 | 数学规律武器(终极) |
| 打击 | 需求 | 效果 | 代价 |
|---|---|---|---|
| ☀️ 光粒 | Lv4 | 单目标100%摧毁 | 暴露大致方位(5回合) |
| 📐 二向箔 | Lv5 | 范围40光年降维打击 | 暴露精确位置 |
| 🔮 咒语广播 | Lv3 | 广播目标坐标号召其他文明打击 | 自身广播暴露 |
Phase 1: 科技发展 → 技术爆炸检测
Phase 2: 探测阶段 → 自适应扫描 + 广播检测
Phase 3: AI 决策 → 先发制人 + 攻击判断 + 行为选择
Phase 4: 打击执行 → 光粒 / 二向箔 / 咒语
Phase 5: 事件记录 → 推送到 WebSocket
Phase 6: 文明清理 → 移除被摧毁的文明
| Method | Path | Description |
|---|---|---|
GET |
/ |
主页面 |
GET |
/api/sim/state |
获取完整模拟状态 |
GET |
/api/sim/status |
轻量状态查询 |
POST |
/api/sim/start |
启动模拟 |
POST |
/api/sim/pause |
暂停模拟 |
POST |
/api/sim/reset |
重置模拟 |
POST |
/api/sim/config |
更新配置参数 |
WS |
/ws |
WebSocket 实时推送 |
{
"type": "tick",
"data": {
"tick": 42,
"alive_count": 67,
"total_civs": 100,
"civilizations": [...],
"tech_distribution": { "L0": 5, "L1": 12, ... }
},
"new_events": [
{ "tick": 42, "type": "strike_photoid", "detail": "..." }
]
}所有参数集中在 config.py 中,通过底部控制面板可实时调整:
| 参数 | 默认值 | 说明 |
|---|---|---|
universe_width/height |
1000 | 宇宙空间大小(光年) |
num_civilizations |
100 | 文明数量 |
tick_interval |
0.5s | 每回合间隔 |
years_per_tick |
100 | 每回合模拟年数 |
tech_explosion_base_chance |
5% | 技术爆炸基础概率 |
detection_base_radius |
80 | 基础探测半径(光年) |
photoid_kill_prob |
100% | 光粒致命率 |
# 运行所有测试
python -m pytest tests/ -v
# 输出示例
# tests/test_civilization.py::test_generate_name PASSED
# tests/test_civilization.py::test_ai_decision_hider PASSED
# tests/test_detection.py::test_broadcast_exposes PASSED
# ...
# ======================== 20 passed in 0.06s ========================启动模拟后,观察以下现象:
- 前期 (0-200回合) — 广播文明快速被消灭,侵略者主宰
- 中期 (200-500回合) — 隐藏者逐渐暴露,技术爆炸打破平衡
- 后期 (500+回合) — 仅剩数个高度发达的文明,进入威慑对峙或最终决战
- 终局 — 通常只剩下 1-3 个文明,或所有文明在连锁打击中全灭
| 颜色 | 状态 |
|---|---|
| 🟢 绿色 | 隐蔽 |
| 🔵 蓝色 | 发展中 |
| 🟡 黄色 | 广播中 |
| 🔴 红色 | 已被探测 |
| 🟣 紫色 | 威慑纪元 |
| 🟠 橙色 | 攻击中 |
| ⚫ 灰色 | 已灭亡 |
欢迎提交 Issue 和 Pull Request!
- 新增文明性格类型
- 新增武器/防御机制
- 优化 AI 决策算法
- 改进前端可视化效果
MIT License — 自由使用、修改和分发。
- 刘慈欣《三体II:黑暗森林》
- 刘慈欣《三体III:死神永生》
- Dark Forest Theory — Wikipedia
- Fermi Paradox
"失去人性,失去很多;失去兽性,失去一切。"
— 托马斯·维德,《三体III:死神永生》