# 第一课 · 强化学习入门 + 环境搭建

> 目标：用**王者荣耀**这个大家都熟悉的游戏，一次讲清「强化学习到底在学什么」，
> 建立**概念 ↔ 游戏实际变量**的对应关系，并**亲手把开悟离线仿真环境跑起来**。
>
> 本课程的所有数学概念，后面都会**回到王者荣耀的具体场景**来讲——不做悬空的公式。

---

## 0.1 一句话讲清强化学习

> **你不教 AI "该怎么打"，只告诉它"这一局打得好不好"，它自己在一局又一局里摸索出打法。**

想想你自己怎么变强的：没人给你每一帧的标准答案，你是打了很多局、赢赢输输、
慢慢知道"这个局势该进还是该退"。强化学习就是让 AI 用同样的方式学习——
**从与环境的交互和奖励中试错**，而不是背标准答案。

这正是它和别的机器学习不同的地方：

| 范式 | 它拿到的"教材" | 例子 |
| --- | --- | --- |
| 监督学习 | 每道题都有标准答案 | 给英雄头像分类 |
| 强化学习 | 只有"这局得了多少分" | **学会打王者 1v1** |

---

## 0.2 核心：强化学习概念 ↔ 王者荣耀里的实际变量

这张表是整门课的"词典"。后面每学一个概念，都可以回来对照它在游戏里到底指什么：

| 强化学习概念 | 数学符号 | 在王者荣耀 1v1 里到底是什么 |
| --- | --- | --- |
| **智能体 (Agent)** | π | 你操控的那个英雄的"大脑"（决定下一步动作） |
| **环境 (Environment)** | — | 游戏本身（地图、小兵、防御塔、对手、伤害结算） |
| **状态 (State)** `s` | 向量 | 当前这一帧的战场快照：我方/敌方英雄的**血量、蓝量、坐标(x,y)、等级、经济、每个技能的冷却**，小兵和塔的血量……（开悟 1v1 里正好是 **491 个数**拼成的向量） |
| **动作 (Action)** `a` | 向量 | 这一帧做什么：**移动方向 / 普攻 / 1、2、3技能 / 回城 / 指定目标**（是个"复合动作"，开悟里是"按钮+方向+目标"的三元组） |
| **奖励 (Reward)** `r` | 标量/多维 | 这一步的好坏：**补刀+、推塔+、击杀+、被击杀−、掉血−、经济/经验+** |
| **策略 (Policy)** `π(a\|s)` | 函数 | "看到这个局势该出什么招"的行为准则 |
| **回报 (Return)** `G` | 标量 | 从现在到这局结束，**累计**能拿多少奖励（不是只看眼前一步） |
| **价值 (Value)** `V(s)` / `Q(s,a)` | 函数 | "现在这个局势有多好" / "现在放大招这个选择有多好" |
| **状态转移** `P(s'\|s,a)` | 矩阵 | 我做了这个动作后，战场会变成什么样（含随机性：暴击、对手反应） |
| **折扣** `γ` | 标量 | 有多看重"以后的好处"——现在忍着不贪，是为了后面推塔赢下这局 |

> 记住这张表。以后看到公式里的 `s`、`a`、`r`、`Q`，脑子里要立刻浮现出对应的**游戏画面**。

---

## 0.3 那"线性代数"在游戏 AI 里到底算什么？

很多同学怕线性代数，觉得抽象。其实在游戏 AI 里，它就是**处理"局势"的语言**：

- **一个向量 = 一份局势**。把"我方血量、蓝量、坐标、技能CD……"这些数排成一列，
  就是状态向量 `s`。英雄此刻的处境，就是高维空间里的**一个点**。

- **矩阵乘法 = 把局势"翻译"成动作打分**。神经网络的一层就是 `y = W·s + b`：
  拿局势向量 `s`，乘上一个权重矩阵 `W`，输出"每个动作有多值得做"的打分向量。
  **AI 决策的本质，就是一连串矩阵乘法**，把几百维的局势，压成"往哪走、放什么技能"的选择。

- **点积 = 加权求和/算威胁**。比如把"敌方英雄到我的距离、他的血量、他技能是否在CD"
  各自乘一个权重再相加，得到一个"当前危险程度"的分数——这就是一次点积。

- **矩阵 = 一张对照表**。`Q 表` 就是"每个局势 × 每个动作"的价值表格；
  `转移矩阵 P` 就是"局势之间怎么变"的概率表。

> 一句话：**局势是向量，决策是矩阵乘法，好坏是数（奖励/价值）。**
> 学线性代数，就是学会用数学操作这些"局势"。

---

## 0.4 动手：把开悟王者荣耀环境跑起来

光说不练没用。第一课的下半场，我们**把环境搭好并跑通第一局**——
用腾讯[开悟](https://aiarena.tencent.com/)的《王者荣耀》**离线本地仿真**（合规、不连线上、不需真机）。

完整步骤见 👉 [`kaiwu_env/README.md`](kaiwu_env/README.md)，这里给出主线：

```bash
# 1) 进入环境目录，构建镜像（内含 Wine + 开悟 gamecore SDK + PyTorch CPU）
cd courses/rl/kaiwu_env
docker compose build

# 2) 指定 gamecore 路径并启动（纯 CPU）
export KAIWU_GAMECORE=/path/to/hok_env_gamecore/gamecore   # 内含申请到的 license.dat
docker compose up -d

# 3) 跑通第一局：随机策略的智能体打一局 1v1
docker exec -it kaiwu-rl-cpu python3 /rl_framework/test_1v1_random.py
```

你会看到类似输出（这就是 0.2 表里的概念活起来了）：

```
开始对局： {'mode': '1v1', 'heroes': [[{'hero_id': 133}], [{'hero_id': 167}]]}
---- frame 0  step 0
---- frame 300  step 100
...
对局结束，共 2709 步。回放 .abs 文件已写入 gamecore/simulator_output/。
```

- 这里的 `test_1v1_random.py` 就是最小的**智能体—环境交互循环**：
  `reset() → 在合法动作里选一个 → step() → 直到这局结束`；
- 现在它是**随机**乱打（"零分选手"）。整门课要做的，就是把这个"随机选动作"
  一步步换成会**看局势、算价值、选好招**的策略网络。

> 🎬 对局会生成 `.abs` 回放，可用开悟自带的 replay 工具在 Windows 观看——
> 亲眼看到"你写的 AI"在打王者，是最好的学习动力。

> 📄 想深入了解这个环境的设计（观测/动作/奖励规范、baseline、泛化挑战），可读官方论文
> [*Honor of Kings Arena* (NeurIPS 2022)](https://arxiv.org/abs/2209.08483)。第七课会详细拆解它。

---

## 0.45 大任务打不动？那就拆成小任务！（本课程的关键思路）

"从零训出一个能打赢人类的王者 AI"确实很难、很贵。但**这不代表新手无从下手**——
**强化学习最实用的功夫，就是把一个大目标拆成一串能训、好训的小任务**。

举个例子（这也是本课程贯穿的第一个可训练任务）：

> 🎯 **「鲁班瞄准」子任务**：鲁班七号站桩不动，地图上有一个会移动/偶尔闪现的目标，
> 训练鲁班**朝正确方向打出炮弹、命中目标**。

这个小任务麻雀虽小五脏俱全，却**完全符合强化学习的五要素**，而且**几分钟就能在纯 CPU 上训出来**：

| 要素 | 在「鲁班瞄准」里是什么 |
| --- | --- |
| 状态 `s` | 目标相对鲁班的位置 `(dx, dz)`、目标速度 `(vx, vz)`、炮弹是否冷却好——**才 5 维** |
| 动作 `a` | 朝 16 个离散方向之一发射炮弹——**离散、简单** |
| 奖励 `r` | 命中 `+1`（并刷新下一个目标），未命中 `-0.1`，鼓励又快又准 |
| 结束 `done` | 一个回合的步数用完 |

**把王者 1v1 拆成一串这样的子任务，就是一条清晰的学习阶梯**：

```
鲁班瞄准命中  ──►  补刀拿最后一击  ──►  残血风筝走位  ──►  塔下生存  ──►  完整 1v1 对局
(打准)            (拿经济)           (会逃)            (懂威胁)         (综合)
 纯CPU几分钟        纯CPU              纯CPU              纯CPU           需大量算力
```

> 💡 这就是**课程设计**（curriculum）的思想：**先学会打准，再学会补刀，再学会走位……**
> 每一步都是一个独立、可训练的小 RL 任务。我们会**从第五课起，亲手在「鲁班瞄准」上训练算法**，
> 到第七课再去挑战完整的开悟 1v1。
>
> 📌 所以别被"训不出顶尖 AI"吓退——**新手要做的，正是把大问题拆小，一个个攻克。**

---

## 0.5 这门课怎么上（授课节奏）

| 课次 | 内容 | 对应讲义 | 王者荣耀里学到什么 |
| --- | --- | --- | --- |
| **第 1 课** | 入门 + 环境搭建（本篇） | 本页 + [环境](kaiwu_env/README.md) | 建立"概念↔游戏变量"对照，跑通第一局 |
| **第 2 课** | 线性代数 = 处理局势的语言 | [第一部分](part1-linear-algebra.md) | 局势=向量，决策=矩阵乘法 |
| **第 3 课** | 用 MDP 给"打游戏"建模 | [第二部分](part2-mdp.md) | 状态/动作/奖励/折扣/价值 |
| **第 4 课** | 强化学习核心思想 | [第三部分](part3-rl-basics.md) | 探索vs利用（要不要越塔）、TD学习 |
| **第 5 课** | 环境与接口 | [第四部分](part4-environments.md) | 亲手写「鲁班瞄准」子任务环境 |
| **第 6 课** | 算法家族 | [第五部分](part5-algorithms.md) | Q-Learning→DQN→PPO |
| **第 7 课** | 开悟 MOBA 实战 | [第六部分](part6-kaiwu-moba.md) | 用 PPO+自对弈打 1v1 |

> 原则：**后面每讲一个数学概念，都会回到王者荣耀的具体场景**——
> 让你始终知道"这个公式，在游戏里到底对应什么"。

---

## ✅ 小结

- 强化学习 = 只靠"这局打得好不好"的奖励，让 AI 试错学会打法；
- 把 0.2 那张**概念↔游戏变量**对照表记牢，它是全课的词典；
- 线性代数不抽象：**局势是向量，决策是矩阵乘法，好坏是数**；
- 已经**跑通了开悟离线仿真的第一局**（随机策略），后面就是把"随机"换成"聪明"。

## 📝 练习

1. 照着 0.4 把环境跑通，记录你这一局跑了多少 step、生成的 `.abs` 文件名。
2. 仿照 0.2 的表，自己写出王者荣耀里 5 个能放进"状态向量"的具体变量。
3. 想一想：如果只把"击杀"设为奖励、其它都不给，AI 可能学出什么"坏毛病"？（提示：见后面的奖励塑形）

---

➡️ 下一课：[第二课 · Python 与线性代数基础](part1-linear-algebra.md)
🏠 返回：[强化学习课程首页](README.md)
