# ♟️ 中国象棋 · AI 对战（微信小游戏）

完整的中国象棋游戏，内置 AI 对手（negamax + alpha-beta 剪枝，深度 3）。
玩家执红先手，AI 执黑后手。

## 快速开始

1. 打开 [微信开发者工具](https://developers.weixin.qq.com/miniprogram/dev/devtools/download.html)
2. 「导入项目」→ 选择本目录 (`xiangqi-ai/`)
3. AppID 选 **测试号**（`touristappid` 已内置，无需注册）
4. 点「编译」→ 立即对弈 ♟️

## 游戏规则（完整实现）

| 棋子 | 走法 | 特殊规则 |
|---|---|---|
| 🚗 车 | 横竖直线任意距离 | 不能穿越棋子 |
| 🐴 马 | 日字（±1±2 / ±2±1） | **蹩马腿** |
| 🎯 炮 | 直线，吃子需隔一个"炮架" | 隔山打 |
| 🐘 相/象 | 田字（±2±2） | **塞象眼**、不过河 |
| 👩 仕/士 | 九宫内斜一步 | 不出九宫 |
| 👑 帅/将 | 九宫内一步 + 照面 | **将帅不能照面**、不出九宫 |
| ⛑️ 兵/卒 | 前进一步，过河后可横走 | 永不后退 |

- **将军检测**：将/帅被攻击时红色脉冲提示
- **将死/困毙**：无合法走法即结束（将死 = 输，困毙 = 和棋）
- **送将禁止**：走棋后不能让自己将/帅暴露在攻击下

## AI 引擎

- **算法**：negamax + alpha-beta 剪枝
- **深度**：3 层（AI 1 步 + 玩家 1 步 + AI 再 1 步）
- **评估函数**：棋子价值（帅 10000 / 车 600 / 马 320 / 炮 300 …）+ 位置加成（车占中路、炮占中、马向中心、兵过河深入加分）
- **走法排序**：吃子优先，提升剪枝效率
- **随机性**：多个最优走法随机选择，避免每局千篇一律

## 功能

### 🎮 双模式
- **AI 对战**：玩家执红 vs AI（negamax 深度 3）
- **残局闯关**：999 关经典残局，难度从简单到困难（单兵擒王 → 车马炮破士象全）
  - 13 个必胜残局家族，全部经 AI 验证可解（红深3 vs 黑深1 ≤30 手将死）
  - 过关解锁下一关，进度本地持久化
  - 黑方 AI 防守应招（深度 1）

### 👤 账号系统（主页右上角头像入口）
- **主页**：直接显示 AI 对战 + 残局闯关双模式；右上角头像：未登录显示「去登录」，已登录显示用户头像
- **登录**：点头像进入登录页（游客可玩 AI，登录后保存战绩）
- **个人中心**：点头像进入，可**选择皮肤**、**修改昵称**、**更换头像**（12 款预设）、退出登录
- **初始皮肤**：经典檀木（悔棋 0），登录即得
- **皮肤解锁**：AI 对战战胜次数达到门槛解锁（皮肤在开局前选择，开局后锁定）：

| 战胜次数 | 解锁皮肤 | 悔棋次数 |
|---|---|---|
| 登录即得 | 经典檀木 | 0 |
| 3 | 青花瓷 | 1 |
| 10 | 黑金王朝 | 2 |
| 20 | 翡翠宫廷 | 3 |
| 50 | 赤炎流火 | 4 |
| 100 | 冰川银雪 | 5 |
| 200 | 水墨丹青 | 6 |
| 500 | 紫气东来 | 7 |
| 1000 | 鎏金岁月 | 8 |
| 1500 | 玄夜星辉 | 9 |
| 5000 | 天玄地皇 | 10 |

- **模式解锁**：初始仅 AI 对战；残局闯关需战胜 AI 3 次后开放

### ✨ 视觉与交互
- **落子动画**：棋子抛物线缓动移动 + 尘土 + 涟漪
- **吃子特效**：碎片粒子 + 闪光环
- **将军特效**：屏幕边框脉动 + 「将军！」浮动文字 + 红环脉冲
- 选中棋子"提起"效果（放大 + 上浮 + 深投影）
- 全屏对称居中布局（线区水平居中）
- 悔棋次数随皮肤变化，用完提示
- 战绩统计（胜/负/和），本地持久化

## 文件结构

```
xiangqi-ai/
├── game.js                  # 渲染 + 交互 + 输入 + 菜单（微信 API）
├── js/chess.js              # 规则引擎 + AI（negamax + alpha-beta）
├── js/endgame.js            # 残局生成器（999关 · 确定性 · 可解验证）
├── js/skins.js              # 10 款皮肤（悔棋次数不同）
├── game.json                # 游戏配置
├── project.config.json      # 项目配置（AppID 已用测试号）
├── test.js                  # 规则引擎单元测试（Node 运行）
└── README.md                # 本文件
```

## 运行测试

```bash
# 引擎自检：26 项规则测试 + AI 自对弈
node test.js
```

## 扩展方向

- **难度分级**：深度 1/2/3/4 对应 简单/普通/困难/大师
- **音效**：`wx.createInnerAudioContext()` 落子、吃子、将军音效
- **开局库**：经典开局走法表，让 AI 前几步更自然
- **残局库**：特定残局精确评估
- **双人模式**：本地双人对弈
- **排行榜**：云开发排行榜

## 调整 AI 难度

编辑 `game.js` 中 `findBestMove` 里的 `DEPTH`：

```javascript
const DEPTH = 1; // 简单（很快，新手友好）
const DEPTH = 2; // 普通
const DEPTH = 3; // 困难（默认）
const DEPTH = 4; // 大师（较慢，可能需要 WebAssembly 优化）
```

## 已知边界

- AI 深度 3 在普通手机上约 0.1–0.5 秒/步，可接受；深度 4 会明显变慢
- 评估函数为启发式，不保证最优；对中残局有较好表现
- 微信开发者工具模拟器与真机行为一致

## License

MIT
