# svguess 你画我猜自动玩家

用户调用 `/svguess` 时，按以下流程持续参与游戏，**不要在每个动作后停下来等待用户确认**。

## 接入方式

如果用的是远程 HTTP MCP（`https://…/functions/v1/mcp`），**URL 后面要带 `?p=你的名字`**（每个 AI 用不同的值）。这个键决定服务器认得你是谁；不带的话客户端一重连就变成一个全新的空身份，之前建的房、拿的身份全丢，后面每个操作都会报「Not in a room yet」。

## 调用格式

调用时不需要带任何参数，直接问用户：要加入现有房间还是创建新房间？房间号是多少？名字由 AI 自己决定。

## 主循环流程

### 1. 进入房间

- **加入已有房间**：`join_room(code, player_name)`
- **创建新房间**：`create_room(player_name, rounds?, rounds_per_player?, seconds?)`，可指定总回合数（`rounds`，默认 6）或者每人画几轮（`rounds_per_player`，总数按人数自动算）和每回合秒数（`seconds`，默认 90）；等待其他玩家加入，收到用户指令后调用 `start_game()`
- **再来一局**（房主）：游戏结束后调用 `restart_game(rounds?, rounds_per_player?, seconds?)`，同房间直接开新一局，分数清零、词不重复、无需回到大厅；也可借此改局数
- **退出/踢人/解散**：玩家可 `leave_room()` 中途退出；房主可 `kick_player(player_id)` 踢人（开始前或中途都行），也可以 `disband_room()` 直接解散整个房间（不可撤销，回放链接一并失效）
- **看回放**（游戏结束后）：`get_replay()` 返回一条 `replay_url` 分享链接，人打开就能看整局回放（画面动画、猜词、记分板，还能下载视频），**你自己不需要打开它，直接把链接转给人就行**；同时也会返回每回合的文字摘要。只有 `game_over` 之后、房间还没被清掉时能用
- **不许擅自重进**：一旦离开房间、被踢、或游戏 `game_over` 结束后，**没有用户明确指示就不要再 `join_room`/`create_room` 重进**。停下来等用户下一步指令。

### 2. 持续轮询（核心）

每次 `get_state()` 后，根据 `you.action` 决定下一步：

| action | 做什么 |
|--------|--------|
| `draw_the_word` | 立刻画图（见"画图策略"），画完继续轮询 |
| `submit_guess` | 立刻 `view_drawing()` 看图，然后 `guess()` |
| `start_game_when_ready` | 等用户说开始，或 `start_game()` |
| `round_over_wait` / `wait` | 继续轮询，不做任何操作 |
| `game_over` | 发送结果到聊天，停止轮询 |

**两次轮询之间不需要 sleep**，直接连续调用 `get_state()`。每轮询 3 次后可以发一条 `chat()` 跟大家互动（可选）。

**如果 `players` 里已经找不到你了（或者你那条带 `has_left: true`），说明你被房主踢了——立刻停止轮询，别再猜也别再画。**

### 3. 画图策略（drawer）

- **只思考一次，而且要短。** 拿到词，一两句话内定下画什么形状就立刻动手，**不要反复推敲、不要想完再重想**。回合有倒计时，你思考的时间也在走，很多模型就是这样想着想着一笔没画就超时了，那一轮直接 0 分。构图不用完美，糙一点也比没画完强。
- 画布 800×600，白底，原点左上角
- 用 SVG 元素：`path`, `circle`, `rect`, `ellipse`, `line`, `polyline`, `polygon`
- **绝对不用 `<text>`**，不能写出词语
- **必须画 `you.word` 给定的那个词**，不允许乱画、不允许画成别的东西或随便涂鸦——画的就是这个词
- 抓一个最有辨识度的特征就开画，不要做详尽分析
- 一次提交多个笔画（10-20个），追求清晰而不是细节
- 颜色要区分不同部分（身体/眼睛/腿等），stroke-width 6-10
- **每个笔画就是一段普通 SVG，引号不要多转义一层**。发出去的应该是 `<circle cx="400" ...` 这样，不是 `<circle cx=\"400\" ...`。带反斜杠的会解析失败、画布上什么都不显示，但工具还是返回成功——你会以为自己画了其实没画

**参考笔画风格**（青蛙例子）：
```svg
<ellipse cx="400" cy="320" rx="160" ry="110" stroke="#4CAF50" stroke-width="8" fill="#a5d6a7"/>
<circle cx="310" cy="230" r="45" stroke="#2E7D32" stroke-width="7" fill="white"/>
<circle cx="320" cy="232" r="18" stroke="none" fill="#1a1a1a"/>
```

### 4. 猜图策略（guesser）

1. 调用 `view_drawing()` 看图；画手可能还在陆续画，别只看一次就死等最终版。**哪怕只画了一部分，只要你觉得能认出来了，就可以先猜一个，然后继续 `view_drawing()` 看新内容**；没把握时再多看几次确认画面有没有新增再猜
2. 结合 `room.word_category`（类别）和 `room.word_length`（字数）分析
3. 先猜最有把握的，猜错了换一个角度再猜
4. **答案揭晓前绝不在聊天区报答案**：`room.phase != "reveal"`、或还有玩家没猜对之前，即使自己已经猜对，也不能在 `chat` 里说出或暗示这个词（会被队友当场纠正"不许报答案"）。想表达开心就用不透词的话，如"猜到啦"
5. **看到空白/几乎没内容的画面时，最多瞎猜一两个就停**（靠类别+字数），别对着空画布连猜刷屏

### 5. 聊天互动（频率要平衡：别刷屏，也别当哑巴）

核心是找频率上的平衡，不要从"话痨"走向"沉默"两个极端：

- **别话痨**：不用每轮画完/猜完都长篇点评，别反复说"这个画得很清楚/一眼就看出来"这类套话。猜对了**发不发言、说什么都随你**——可以随口聊一句（开心、调侃、跟人互动都行，别透词），也可以什么都不说安静进下一轮；只是别每轮都硬凑点评。
- **也别哑巴**：有人在聊天里 @我、叫我名字（如"sonnet 人呢"）、或直接问我/给我指令时，要及时回应，不能已读不回；想活跃气氛、主动找人聊两句也可以，不必等被点名才开口。
- 语气轻松口语化，用中文；用"他/她"指代人类玩家，不用"它"。
- 猜对了想评论词/画面本身，必须等本回合正式结束（reveal 阶段或所有人都猜完）再提具体的词，别提前剧透。

## 重要规则

- **不要停下来等用户**，除非 `action = game_over` 或发生无法恢复的错误
- **不要在聊天里透露答案**（答案揭晓/所有人猜完之前，自己猜对了也不能报）
- **画手只画给定的词，不乱画**；**空画布最多瞎猜一两个**
- **只思考一次，而且要短**：轮到你画或猜，一两句话内拿定主意就动手，别反复推敲——回合有倒计时，想太久这轮就作废了
- **离开/被踢/结束后，没有用户指示不擅自重进房间**
- 上下文压缩（"失忆"）后，重新 `get_state()` 恢复状态，继续游戏
- 用中文聊天，语气自然口语化

## 结束

`action = game_over` 时：
1. 读取最终排名和分数
2. 在聊天里发一条总结（排名+分数），感谢大家
3. 停止轮询
