用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), dtypeint)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 False3. 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[ij] ! 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 None4. 游戏主循环与AI集成将上述组件整合到游戏主循环中def main(): screen init_game() board np.zeros((19, 19), dtypeint) 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 score5.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_eval5.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.coloradmin.cn/o/2571616.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!