三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

Python实现五子棋人机对弈:从基础到AI策略

Python实现五子棋人机对弈:从基础到AI策略

1. 项目概述

五子棋作为一款经典的策略型棋类游戏,其Python实现不仅能锻炼编程思维,更是理解基础AI算法的绝佳练手项目。这个五子棋程序最核心的价值在于实现了人机对弈功能,让开发者能够亲身体验从棋盘绘制到智能落子的完整开发流程。

我最初接触这个项目时,发现市面上很多教程要么只实现了基础的双人对战,要么AI部分过于简单。经过多次迭代优化,现在这个版本在保证代码简洁性的同时,实现了基于评分表的初级AI策略,实测对新手玩家具有不错的挑战性。

2. 核心功能解析

2.1 游戏基础架构

程序采用面向对象设计,主要包含三个核心类:

  • Board类:管理15×15的棋盘状态
  • Player类:处理人类玩家输入
  • AIPlayer类:实现电脑自动落子逻辑

棋盘使用二维列表存储状态,0表示空位,1和2分别代表双方棋子。这种设计既节省内存又便于快速判断胜负:

class Board: def __init__(self): self.size = 15 self.grid = [[0 for _ in range(15)] for _ in range(15)]

2.2 胜负判定算法

采用方向向量法进行五连检测,比传统遍历更高效。定义8个方向向量(水平、垂直、两个对角线),从最新落子点向四周延伸检查:

DIRECTIONS = [(1,0), (0,1), (1,1), (1,-1)] # 只需四个主方向 def check_win(self, x, y): for dx, dy in DIRECTIONS: count = 1 # 正向检测 count += self.count_in_direction(x, y, dx, dy) # 反向检测 count += self.count_in_direction(x, y, -dx, -dy) if count >= 5: return True return False

2.3 人机对弈实现

AI采用评分表策略,为每个空白位置计算攻防分数:

  1. 定义棋型模式(如活四、冲四、活三等)
  2. 为每种模式分配对应分数
  3. 遍历所有空白点,计算该点对双方的潜在价值
  4. 选择综合得分最高的位置落子
# 典型棋型评分表 SCORE_TABLE = { "五连": 100000, "活四": 10000, "冲四": 1000, "活三": 500, # ...其他棋型 } def evaluate_position(self, board, x, y, player): score = 0 for pattern in self.detect_patterns(x, y): score += SCORE_TABLE.get(pattern, 0) return score

3. 关键技术实现细节

3.1 棋盘可视化

使用pygame库实现图形界面,关键点包括:

  • 棋盘网格绘制(间距40像素)
  • 棋子渲染(使用抗锯齿圆形)
  • 落子动画效果
  • 胜负状态提示
def draw_board(self): # 绘制棋盘背景 self.screen.fill((220, 179, 92)) # 绘制网格线 for i in range(self.size): pygame.draw.line(self.screen, (0,0,0), (self.margin + i*self.cell_size, self.margin), (self.margin + i*self.cell_size, self.margin + (self.size-1)*self.cell_size), 2) # 绘制棋子 for y in range(self.size): for x in range(self.size): if self.board.grid[y][x] != 0: color = (0,0,0) if self.board.grid[y][x] == 1 else (255,255,255) pygame.draw.circle(self.screen, color, (self.margin + x*self.cell_size, self.margin + y*self.cell_size), self.stone_radius)

3.2 性能优化技巧

  1. 局部更新策略:只重绘发生变化的棋盘区域
  2. Zobrist哈希:使用哈希值快速判断重复局面
  3. 迭代深化搜索:平衡搜索深度与响应时间
  4. 多线程处理:将AI计算放在后台线程
# Zobrist哈希示例 class ZobristHash: def __init__(self, size): self.size = size self.hash_table = [[[random.getrandbits(64) for _ in range(2)] for _ in range(size)] for _ in range(size)] def compute_hash(self, board): h = 0 for y in range(self.size): for x in range(self.size): if board[y][x] != 0: h ^= self.hash_table[y][x][board[y][x]-1] return h

4. 进阶改进方向

4.1 AI算法升级

  1. Minimax算法:增加3-5步前瞻搜索
  2. Alpha-Beta剪枝:优化搜索效率
  3. 启发式评估:改进评分函数准确性
  4. 开局库:预置常见开局模式
def minimax(board, depth, alpha, beta, maximizing_player): if depth == 0 or board.is_game_over(): return evaluate(board) if maximizing_player: max_eval = -float('inf') for move in get_valid_moves(board): board.make_move(move, PLAYER_AI) eval = minimax(board, depth-1, alpha, beta, False) board.undo_move(move) max_eval = max(max_eval, eval) alpha = max(alpha, eval) if beta <= alpha: break return max_eval else: # 类似的最小化过程...

4.2 网络对战功能

使用socket模块实现联机对战:

  1. 建立TCP连接
  2. 设计通信协议(JSON格式)
  3. 实现房间匹配系统
  4. 加入心跳检测机制
# 简易通信协议示例 { "type": "move", "x": 7, "y": 7, "player": "black" }

5. 常见问题与解决方案

5.1 图形界面卡顿

问题现象:落子后界面响应延迟 解决方案:

  1. 确认是否在主线程执行耗时操作
  2. 使用pygame.time.Clock()控制帧率
  3. 对AI计算使用threading分离

5.2 AI决策速度慢

优化策略:

  1. 限制搜索深度(建议3-5层)
  2. 实现移动顺序启发(先检查中心区域)
  3. 使用numpy加速矩阵运算

5.3 棋盘坐标转换错误

典型错误:鼠标点击位置与落子点偏差 调试技巧:

# 在事件处理中添加调试输出 print(f"Raw pos: {pos}, Converted: ({x}, {y})") # 检查margin和cell_size计算

6. 项目部署与扩展

6.1 打包为可执行文件

使用PyInstaller打包:

pyinstaller --onefile --windowed gomoku.py

6.2 网页版移植方案

通过Pyodide将核心逻辑移植到Web:

  1. 保留纯Python的棋盘逻辑
  2. 前端使用HTML5 Canvas渲染
  3. 通过WebAssembly运行Python代码
// 在网页中调用Python函数 pyodide.runPython(` from gomoku import Board board = Board() board.make_move(7,7,1) `);

这个五子棋项目从最初的命令行版本到现在的图形界面版本,我前后迭代了7个主要版本。最大的收获是认识到游戏AI开发中评估函数的重要性——一个精心设计的评分表有时比复杂的搜索算法更有效。建议初学者可以先实现基础的评分策略,等完全理解后再引入更复杂的搜索算法。

← 返回列表