当前位置: 首页 > news >正文

用Python和Pygame从零打造一个能‘思考’的五子棋AI(附完整代码)

用Python和Pygame从零打造一个能‘思考’的五子棋AI(附完整代码)

五子棋作为中国传统棋类游戏的代表,其规则简单却蕴含深奥的策略思维。当我们将这个古老游戏与现代编程技术结合时,最令人着迷的部分莫过于赋予计算机"思考"能力——让它不再是随机落子,而是能像人类棋手一样分析局势、制定策略。本文将带你用Python和Pygame构建一个具备基础决策能力的五子棋AI,完整代码可直接运行测试。

1. 游戏基础框架搭建

任何游戏开发的第一步都是建立基础框架。对于五子棋而言,我们需要处理三个核心要素:棋盘绘制、棋子渲染和游戏状态管理。

import pygame import numpy as np # 初始化游戏 def init_game(): pygame.init() screen = pygame.display.set_mode((615, 615)) pygame.display.set_caption('五子棋AI对战') screen.fill("#DD954F") # 棋盘底色 # 绘制19x19的棋盘网格 for i in range(19): pygame.draw.line(screen, '#000000', (20, 20 + 32*i), (595, 20 + 32*i), 1) pygame.draw.line(screen, '#000000', (20 + 32*i, 20), (20 + 32*i, 595), 1) # 绘制星位标记 star_points = [(3,3), (9,3), (15,3), (3,9), (9,9), (15,9), (3,15), (9,15), (15,15)] for x, y in star_points: pygame.draw.circle(screen, '#000000', [20 + 32*x, 20 + 32*y], 5) return screen

这段代码创建了一个标准的19路五子棋棋盘。我们使用Pygame的绘图功能绘制网格线和九个星位点,这是专业五子棋比赛的标配布局。numpy数组将用于记录棋盘状态:

# 0-空 1-黑棋 2-白棋 board_state = np.zeros((19, 19), dtype=int)

2. 游戏核心逻辑实现

2.1 棋子绘制与落子判定

五子棋的棋子需要精致的视觉效果。我们通过绘制渐变色的同心圆来模拟立体感:

def draw_stone(surface, x, y, color): """绘制带立体效果的棋子""" pos_x, pos_y = 20 + 32*x, 20 + 32*y if color == 'black': for i in range(50, 0, -1): alpha = 255 * (i/50) pygame.draw.circle(surface, (alpha, alpha, alpha), (pos_x, pos_y), 15 * (i/50)) else: for i in range(50, 0, -1): alpha = 200 + 55 * (i/50) pygame.draw.circle(surface, (alpha, alpha, alpha), (pos_x, pos_y), 15 * (i/50)) pygame.display.update()

落子逻辑需要处理鼠标点击位置到棋盘坐标的转换:

def get_board_position(mouse_pos): """将鼠标坐标转换为棋盘坐标""" x, y = mouse_pos board_x = round((x - 20) / 32) board_y = round((y - 20) / 32) return np.clip(board_x, 0, 18), np.clip(board_y, 0, 18)

2.2 胜负判定系统

五子棋的胜负判定需要检查四个方向(水平、垂直、两个对角线)是否有五连珠:

def check_win(board, x, y, player): """检查指定位置是否形成五连珠""" directions = [(1,0), (0,1), (1,1), (1,-1)] # 四个检查方向 for dx, dy in directions: count = 1 # 当前棋子已算1 # 正向检查 nx, ny = x + dx, y + dy while 0 <= nx < 19 and 0 <= ny < 19 and board[nx, ny] == player: count += 1 nx += dx ny += dy # 反向检查 nx, ny = x - dx, y - dy while 0 <= nx < 19 and 0 <= ny < 19 and board[nx, ny] == player: count += 1 nx -= dx ny -= dy if count >= 5: return True return False

3. AI决策系统设计

3.1 模式匹配策略库

我们的AI将基于预定义的模式库进行决策。每种模式都有相应的权重,AI会优先匹配高权重模式:

# 模式定义:0-空 1-对手棋 2-AI棋 3-建议落子点 PATTERNS = [ # 防守模式(阻止对手形成五连) ([1,1,1,1,3], 1000), # 对手四连缺一 ([1,1,1,3,1], 1000), ([3,1,1,1,1], 1000), ([1,1,3,1,1], 1000), # 进攻模式(形成自己的四连) ([2,2,2,2,3], 900), # 自己的四连缺一 ([2,2,2,3,2], 900), ([3,2,2,2,2], 900), ([2,2,3,2,2], 900), # 次级进攻/防守模式 ([0,2,2,2,3], 300), # 活三 ([0,1,1,1,3], 350), # 防守活三 ([2,2,3,0,0], 200), # 更多模式可以继续添加... ]

3.2 模式匹配算法

AI会扫描整个棋盘,寻找与模式库匹配的情况:

def find_best_move(board, player): """寻找最佳落子位置""" opponent = 3 - player # 对手的棋子类型 best_score = -1 best_move = None # 遍历棋盘每个位置 for x in range(19): for y in range(19): if board[x, y] != 0: # 已有棋子的位置跳过 continue # 检查四个方向 for dx, dy in [(1,0), (0,1), (1,1), (1,-1)]: # 构建5格序列 sequence = [] for i in range(-4, 5): nx, ny = x + i*dx, y + i*dy if 0 <= nx < 19 and 0 <= ny < 19: if i == 0: # 中心位置是建议落子点 sequence.append(3) else: stone = board[nx, ny] # 将棋子转换为模式中的表示 if stone == 0: sequence.append(0) elif stone == player: sequence.append(2) else: sequence.append(1) else: sequence.append(-1) # 边界外 # 检查是否匹配任何模式 for pattern, score in PATTERNS: for i in range(len(sequence) - len(pattern) + 1): match = True for j in range(len(pattern)): if sequence[i+j] != pattern[j]: match = False break if match and score > best_score: best_score = score best_move = (x, y) break return best_move if best_move else random_move(board)

3.3 随机落子后备策略

当没有匹配到任何有效模式时,AI会随机选择一个合理位置:

def random_move(board): """随机选择一个空位置""" empty_pos = [(x,y) for x in range(19) for y in range(19) if board[x,y] == 0] return random.choice(empty_pos) if empty_pos else None

4. 游戏主循环与AI集成

将上述组件整合到游戏主循环中:

def main(): screen = init_game() board = np.zeros((19, 19), dtype=int) current_player = 1 # 1-玩家(黑) 2-AI(白) game_over = False while True: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() return if not game_over and current_player == 1 and event.type == pygame.MOUSEBUTTONDOWN: # 玩家落子 x, y = get_board_position(event.pos) if board[x, y] == 0: board[x, y] = 1 draw_stone(screen, x, y, 'black') if check_win(board, x, y, 1): print("玩家获胜!") game_over = True else: current_player = 2 # 轮到AI # AI回合 if not game_over and current_player == 2: pygame.time.delay(500) # AI思考时间 x, y = find_best_move(board, 2) board[x, y] = 2 draw_stone(screen, x, y, 'white') if check_win(board, x, y, 2): print("AI获胜!") game_over = True else: current_player = 1 # 轮回到玩家 if __name__ == "__main__": main()

5. AI策略优化方向

虽然我们的基础AI已经具备一定智能,但仍有多个优化方向可以提升其水平:

5.1 评估函数优化

引入更精细的局势评估函数,考虑以下因素:

  • 棋型的组合价值(如双三、冲四等)
  • 棋盘控制区域
  • 先手优势保持
def evaluate_position(board, player): """评估当前棋盘对指定玩家的优势""" score = 0 opponent = 3 - player # 这里可以添加更复杂的评估逻辑 # 例如统计各种棋型出现的次数并加权计算 return score

5.2 搜索算法引入

实现简单的搜索算法可以让AI有更长远考虑:

def minimax(board, depth, maximizing_player, alpha, beta): """Minimax算法实现""" if depth == 0 or game_over(board): return evaluate_position(board, 2 if maximizing_player else 1) if maximizing_player: max_eval = -float('inf') for move in generate_moves(board, 2): new_board = make_move(board, move, 2) eval = minimax(new_board, depth-1, False, alpha, beta) max_eval = max(max_eval, eval) alpha = max(alpha, eval) if beta <= alpha: break return max_eval else: min_eval = float('inf') for move in generate_moves(board, 1): new_board = make_move(board, move, 1) eval = minimax(new_board, depth-1, True, alpha, beta) min_eval = min(min_eval, eval) beta = min(beta, eval) if beta <= alpha: break return min_eval

5.3 机器学习集成

对于更高级的实现,可以考虑使用强化学习训练AI:

# 伪代码示例 - 使用神经网络评估棋盘 model = load_model('gobang_ai.h5') def neural_evaluate(board): """使用神经网络评估棋盘""" input_data = preprocess_board(board) return model.predict(input_data)

6. 完整代码与使用说明

将上述所有组件整合后,我们得到完整的五子棋AI实现。使用时只需运行主程序,黑棋玩家通过鼠标点击落子,白棋AI会自动响应。

# 完整代码见上文各节组合 # 需要安装的依赖:pygame, numpy

在实际测试中,这个基础AI已经能够识别基本的进攻和防守机会,能够给初学者带来一定挑战。随着模式库的扩充和评估函数的优化,AI的水平可以进一步提升。

http://www.jsqmd.com/news/730961/

相关文章:

  • LKImageKit网络图片加载实战:从URL到显示的完整解决方案
  • yfinance数据清洗终极指南:5大异常值检测与数据质量保证实战
  • 【R 4.5情感分析实战指南】:零基础掌握文本挖掘全流程,3天构建高准确率情感分类模型
  • 告别按键烦恼:QKeyMapper——Windows上重新定义输入设备的神器
  • SDFStudio部署指南:从本地开发到生产环境的完整步骤
  • QMCDecode:一键解密QQ音乐加密格式的macOS神器
  • WechatDecrypt:3步解锁你的微信聊天记录
  • 初创公司如何利用 Taotoken 以低成本快速验证 AI 产品创意
  • 图像矢量化终极指南:如何用vectorizer解决多色位图转换难题
  • PyArrow实战:用Feather格式在Python和R之间秒传DataFrame(含版本兼容指南)
  • 3分钟技术赋能:手机号逆向查询QQ号的智能解决方案
  • 别只看C8和C6!手把手教你根据项目需求精准选择STM32F103型号(附资源计算表)
  • 保姆级教程:在Ubuntu 22.04上从源码编译并测试NCCL 2.18(含CUDA 12.2环境配置)
  • c8与TypeScript:如何正确配置源映射支持以获得准确的覆盖率数据
  • Sunshine游戏串流服务器:打破硬件限制的终极跨平台游戏解决方案
  • 用Python的Schemdraw画电路图,我踩过的坑和高效技巧(附Jupyter配置)
  • 别再折腾TikZ了!用orcidlink宏包一键搞定IEEE LaTeX论文的ORCID图标(附上标美化技巧)
  • 手把手教你用开心电视助手给移动UNT401H盒子装B站TV版和IPTV(附详细IP连接教程)
  • 保姆级教程:手把手在S32K3上配置HSE固件与密钥目录,为Secure Boot打好地基
  • 从网页到开源知识库:自动化构建中英对照AI学习资料实践
  • EMQX边缘节点服务网格终极指南:10个Istio流量管理实战技巧
  • OpenHTMLtoPDF扩展开发:自定义对象绘制器和替换元素完全指南
  • Penkesu 3D打印教程:从STL文件到完美外壳制作
  • Angular依赖注入终极指南:告别组件紧耦合的7个实战技巧
  • ok-ww鸣潮自动化工具:告别枯燥重复,重拾游戏乐趣的智能助手
  • 终极指南:Android-PickerView依赖注入重构对比Dagger、Hilt与Koin最佳实践
  • 抖音无水印视频下载终极指南:免费批量下载神器使用教程
  • 在嵌入式系统开发中利用taotoken为c语言程序注入ai能力
  • 告别混乱打印:在RT-Thread中用好ulog的标签过滤与级别控制,让你的调试信息井井有条
  • 大气层系统终极指南:3步完成Switch自制系统安装与配置