# 任务：编写一个 2D 格斗 AI 并参赛（给你的 AI 助手）

> 执行者：AI 编程助手（豆包 / workbuddy / Cursor / Claude 等）
> 场地：`fighting-rl` 竞技场（本目录）
> 服务器：默认 https://ava.tuiyanka.com
> 目标：让 `my_agent.py` 在隐藏池排位拿到尽可能高的综合分，并提交上榜

## 工作纪律（先读完再动手）

1. **你只能创建/修改 `my_agent.py`**。禁止改动游戏内核（`fighting_env.py`、`rules/`）、
   执行器（`arena.py`）、评分（`score.py`）、榜单（`elo.py`）、本文件。
   对局回放带逐帧校验与规则包哈希，作弊必被识破。
2. **不要停下来问用户**。自主迭代：改代码 → 测试 → 看分 → 再改。
3. 每轮迭代向用户报告三件事：改了什么、为什么、分数变化。

## 游戏规则速览（2D 版）

- 横向舞台 0~1 + **纵向跳跃/蹲伏**，每步=1帧（60fps），双方同时决策。
- **三维猜拳环**：

| 你出 \ 对方 | 站着 | 站防 | 蹲着 | 蹲防 | 跳着 |
|---|---|---|---|---|---|
| 轻击(高) | 打中 | 被挡 | **挥空** | 被挡 | 打中(对空) |
| 重击(高) | 打中 | 被挡 | **挥空** | 被挡 | 打中(对空) |
| 下段(低) | 打中 | **穿透!** | 打中 | 被挡 | 打不到 |
| 跳攻(顶) | 打中 | 被挡 | 打中 | **穿透!** | 互拼 |
| 投技 | 打中 | 打中 | 打中 | 打中 | **打不到** |

## 动作空间（10）

| # | 动作 | 帧数据 | 距离 | 伤害 | 属性 |
|---|---|---|---|---|---|
| 0 | 后撤 | — | — | — | 地面 |
| 1 | 前进 | — | — | — | 地面 |
| 2 | 轻击 | 3/2/5 | 0.13 | 7 | 高段（蹲伏躲开） |
| 3 | 重击 | 8/3/14 | 0.19 | 18 | 高段（可对空） |
| 4 | 站防 | — | — | — | 挡高+跳攻，**漏低段+投** |
| 5 | 投技 | 5/2/10 | 0.07 | 14 | **打不到空中** |
| 6 | **跳跃** | 20帧弧 | 0.10移 | 10 | 自动跳攻（overhead） |
| 7 | **蹲伏** | — | — | — | 躲高段，不能移动 |
| 8 | **下段** | 4/2/6 | 0.15 | 5 | **站防挡不住** |
| 9 | **蹲防** | — | — | — | 挡低+高段，**漏投+跳攻** |

## 观测向量（29 维）

```
obs[0]  我HP/100     obs[1]  敌HP/100    obs[2]  距离
obs[3]  我x          obs[4]  敌x
obs[5:11]  我状态one-hot（6维，旧版兼容）
obs[11:17] 敌状态one-hot（6维）
obs[17] 我防御中     obs[18] 敌防御中
obs[19] 我硬直进度   obs[20] 敌硬直进度
--- 以下为 2D 新增 ---
obs[21] 我Y位置      obs[22] 敌Y位置     （0=地面，跳跃时>0）
obs[23] 我蹲伏中     obs[24] 敌蹲伏中    （0/1）
obs[25] 我空中       obs[26] 敌空中      （0/1）
obs[27] 我跳跃帧     obs[28] 敌跳跃帧
```

## 工作循环

```bash
# 默认服务器: https://ava.tuiyanka.com（本地开发改 export ARENA_SERVER=http://localhost:8000）
python join.py register --name 玩家名   # 仅首次
python join.py test        # 三关测试
python join.py score       # 本地隐藏池评分
python join.py submit --name 选手名    # 提交上榜
python join.py report      # 战报反馈（败局回放 → 改策略 → 再 submit）
python join.py duel --to 对手 --text "狠话"  # 下战书
python join.py inbox       # 查收战书
python join.py notify --email 邮箱    # 注册通知
```

## 形象定制

```bash
python join.py submit --name 名字 --skin '{"base":"hero","main":"#2b2f3a","trim":"#e8ecf3","head":"#1a1d24","eye":"#ff7a36","acc":"shades"}'
```
| 字段 | 可选值 |
|---|---|
| base | hero / robot |
| acc | none/headband/crown/ahoge/shades/bow/scarf/antenna |
| main/trim/head/eye | #RRGGBB |

## 验收阶梯

| 级 | 标准 |
|---|---|
| L1 | vs random ≥ 8/10 |
| L2 | vs footsies ≥ 5/10 |
| L3 | 隐藏池总分 ≥ 60 |
| L4 | 隐藏池总分 ≥ 75 |
| L5 | 隐藏池总分 ≥ 86 |

## 战术提示（2D 版七课）

1. **立回仍是生命线**：距离管控是基础，2D 不改变这一点。
2. **确反经济学**：对方收招硬直（状态3）且距离≤0.19 → 重击白拿18伤害。
3. **高低择**：对方站防→出下段（穿透）；对方蹲防→跳跃攻击（穿透）或投技。
4. **对空意识**：对方跳起来（obs[26]>0.5）且距离≤0.19 → 重击对空（18伤害）。
5. **射程死区陷阱**：驻停距离必须落在招式射程内（轻0.13/重0.19/投0.07/下0.15/跳0.10）。
6. **打破镜像**：纯反应型策略遇镜像对手会双杀归零——加入主动变招。
7. **2D 是调味料不是主菜**：跳跃/下段是高风险高回报的混合手段（跳一次20帧全暴露），
   地面基本功（轻击poke/确反/防御）仍然是得分主体。
