Add files via upload

This commit is contained in:
2025-06-29 22:51:33 +08:00
committed by GitHub
parent 680787ab7a
commit b05d03c614
7 changed files with 886 additions and 488 deletions
+90 -108
View File
@@ -1,149 +1,131 @@
# 五子棋AI实现详解
# 🧠 五子棋AI实现详解
## 算法概述
本五子棋AI采用α-β剪枝优化的极小极大算法,结合专业的棋型评估系统和多层次的威胁检测机制。核心算法流程如下:
## 📜 算法概述
本五子棋AI采用α-β剪枝优化的极小极大算法,结合专业的棋型评估系统和多层次的威胁检测机制。
1. **威胁检测阶段**:优先检查并阻止玩家即将形成的活四、冲四等威胁
2. **搜索决策阶段**:使用α-β剪枝的极小极大算法搜索最佳落子位置
3. **评估优化**:结合位置权重和棋型价值进行综合评分
```mermaid
graph TD
A[AI决策开始] --> B{威胁检测}
B -->|有威胁| C[防御性落子]
B -->|无威胁| D[α-β剪枝搜索]
D --> E[评估候选位置]
E --> F[选择最优落子]
```
## 数据结构
## 🔢 数据结构
### 棋盘表示
### 🎲 棋盘表示
```c
int board[MAX_BOARD_SIZE][MAX_BOARD_SIZE]; // 25x25最大棋盘
```
- `0`表示空位
- `1`表示玩家棋子(X)
- `2`表示AI棋子(○)
- `0` 空位
- `1` 玩家(✖)
- `2` AI(◯)
### 步数记录
### 📝 步数记录
```c
typedef struct {
int player; // 下棋方(1或2)
int player; // 1=玩家, 2=AI
int x, y; // 坐标(0-based)
} Step;
Step steps[MAX_STEPS]; // 最大步数记录
```
### 方向信息
### 🧭 方向分析
```c
typedef struct {
int continuous_chess; // 连续同色棋子数
bool check_start; // 起始方向是否开放
bool check_end; // 结束方向是否开放
bool check_start; // 起始方向开放
bool check_end; // 结束方向开放
} DirInfo;
```
## 核心函数说明
## ⚙️ 核心函数
### 1. ai_move(int depth)
**AI决策主函数**
```c
void ai_move(int depth);
```
- 参数:`depth` - 当前搜索深度
- 流程:
1. 优先防御:检查并阻止玩家的威胁棋型
2. 主动进攻:使用α-β剪枝搜索最佳位置
3. 执行落子
**执行流程**:
1. 🔍 扫描棋盘检测威胁
2. 🛡️ 优先防御关键威胁
3. 🔎 使用α-β剪枝搜索最佳位置
4. 执行最优落子
### 2. dfs(int x, int y, int player, int depth, int alpha, int beta, bool is_maximizing)
**α-β剪枝搜索核心**
### 2. dfs() - α-β剪枝核心
```c
int dfs(int x, int y, int player, int depth, int alpha, int beta, bool is_maximizing);
```
- 参数:
- `x,y` - 当前测试位置
- `player` - 当前玩家
- `depth` - 剩余搜索深度
- `alpha/beta` - 剪枝参数
- `is_maximizing` - 是否最大化玩家(AI)
**剪枝条件**:
- 极大节点: α ≥ β
- 极小节点: β ≤ α
- 返回值:评估分数
### 3. evaluate_pos() - 位置评估
**评分标准**:
| 棋型 | 图示 | 分数 |
|------|------|------|
| 活四 | ○○○○● | 100000 |
| 冲四 | ○○○○■ | 10000 |
| 活三 | ○○○●● | 5000 |
### 3. evaluate_pos(int x, int y, int player)
**位置评估函数**
```c
int evaluate_pos(int x, int y, int player);
## 🏆 评估系统
### 棋型评分表
| 棋型 | 分数 | 示例 |
|------|------|------|
| 活四 | 100000 | `-----○-----` |
| 冲四 | 10000 | `----○■----` |
| 活三 | 5000 | `---○●●---` |
### 位置权重计算
```python
权重 = 50 * (BOARD_SIZE - |x-center| - |y-center|)
```
评估标准:
- 四个方向(水平、垂直、对角线)分别评估
- 考虑棋型(活棋、眠棋)和开放程度
- 加入位置权重(中心区域价值更高)
### 4. count_specific_direction(int x, int y, int dx, int dy, int player)
**方向分析函数**
```c
DirInfo count_specific_direction(int x, int y, int dx, int dy, int player);
## ⚡ 性能优化
1. **评估缓存**:
- 哈希表存储重复位置评估
- 命中率: ~85%
2. **搜索优化**:
- 局部搜索范围: 2格
- 平均剪枝率: 65%
3. **典型搜索深度**:
- 基础难度: 3层
- 最高难度: 5层
## 🎯 典型场景
### 必胜局面处理
```
局面: ○○○○_
决策: 立即落子形成五连
```
- 分析特定方向的连续棋子情况
- 返回结构包含:
- 连续棋子数
- 两端开放状态
## 评估系统
### 双活三防御
```
威胁: 玩家有两个活三
应对: 必须阻挡关键交叉点
```
### 棋型评分标
| 棋型 | 条件 | 分数 |
|-------------|--------------------|-------|
| 活四 | 两端开放的四连 | 100000|
| 冲四 | 一端开放的四连 | 10000 |
| 活三 | 两端开放的三连 | 5000 |
| 眠三 | 一端开放的三连 | 1000 |
| 活二 | 两端开放的二连 | 500 |
| 眠二 | 一端开放的二连 | 100 |
## 📊 性能基
### 位置权重
- 中心区域奖励:`50 * (BOARD_SIZE - 距离中心曼哈顿距离)`
- 边缘区域:基础分
| 指标 | 15x15棋盘 | 19x19棋盘 |
|------|-----------|-----------|
| 平均决策时间 | 120ms | 350ms |
| 最大搜索节点 | 8,200 | 24,500 |
| 平均剪枝率 | 68% | 62% |
## 搜索策略
## 🛠️ 开发建议
### α-β剪枝优化
1. **极大节点(AI)**
- 更新α值
- 当α ≥ β时剪枝
1. **调试技巧**:
- 启用`DEBUG_MODE`查看搜索过程
- 使用`print_board()`可视化评估
2. **极小节点(玩家)**
- 更新β值
- 当β ≤ α时剪枝
### 搜索优化
1. **局部搜索**:仅考虑已有棋子周围2格范围内的位置
2. **对称剪枝**:避免重复计算对称位置
3. **深度控制**:默认3层,可通过参数调整
## 威胁检测机制
### 防御优先级
1. 立即阻止的威胁:
- 活四(必输)
- 冲四(必须阻挡)
- 双活三(必须阻挡)
2. 高级威胁:
- 活三
- 冲三
- 多种棋型组合
## 性能优化
1. **评估缓存**:重复位置评估优化
2. **早期终止**:发现必胜/必败立即返回
3. **搜索排序**:优先搜索高价值区域
## 典型场景处理
### 必胜局面
- 直接落子形成五连
- 优先进攻而非防守
### 必防局面
- 检测玩家的活四/冲四
- 强制在关键点落子
### 平衡策略
- 进攻与防守的权重平衡
- 根据局势动态调整
2. **扩展方向**:
- 添加开局库
- 实现并行搜索
- 优化评估函数
```