Skip to content

Latest commit

 

History

2 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

🌌 Dark Forest Simulation

黑暗森林法则 · 宇宙文明模拟器

基于《三体》黑暗森林理论的 Web 端实时模拟系统

Python FastAPI License Tests


📖 背景:什么是黑暗森林法则?

"宇宙就是一座黑暗森林,每个文明都是带枪的猎人。" — 罗辑,《三体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:8765

自定义参数

python main.py --host 0.0.0.0 --port 8765

🏗️ 项目架构

darkside/
├── 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

6 种文明性格

性格 探测意愿 攻击意愿 广播意愿 策略描述
🟥 侵略者 90% 95% 5% 主动扫描,发现即摧毁
🟩 隐藏者 5% 15% 1% 最大隐蔽,慢速发展,永不广播
🟦 技术狂 50% 40% 70% 追求技术爆炸,不惧暴露
🟨 外交家 70% 10% 60% 试图建立合作(极危险策略)
🟪 偏执狂 50% 90% 2% 因恐惧而先发制人
🟧 投机者 50% 50% 30% 根据局势灵活调整

9 级科技树

等级 名称 能力
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: 文明清理    →  移除被摧毁的文明

📡 API 文档

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 实时推送

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 ========================

📊 观察指南

启动模拟后,观察以下现象:

  1. 前期 (0-200回合) — 广播文明快速被消灭,侵略者主宰
  2. 中期 (200-500回合) — 隐藏者逐渐暴露,技术爆炸打破平衡
  3. 后期 (500+回合) — 仅剩数个高度发达的文明,进入威慑对峙或最终决战
  4. 终局 — 通常只剩下 1-3 个文明,或所有文明在连锁打击中全灭

Canvas 图例

颜色 状态
🟢 绿色 隐蔽
🔵 蓝色 发展中
🟡 黄色 广播中
🔴 红色 已被探测
🟣 紫色 威慑纪元
🟠 橙色 攻击中
⚫ 灰色 已灭亡

🤝 贡献

欢迎提交 Issue 和 Pull Request!

  • 新增文明性格类型
  • 新增武器/防御机制
  • 优化 AI 决策算法
  • 改进前端可视化效果

📜 许可

MIT License — 自由使用、修改和分发。


📚 参考资料


"失去人性,失去很多;失去兽性,失去一切。"
— 托马斯·维德,《三体III:死神永生》

About

Dark Forest Simulation - A web-based simulation of cosmic civilizations under the Dark Forest Theory from Liu Cixin's The Three-Body Problem

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages