手把手教你用easyAI开发井字棋AI:10步实现人机对战 手把手教你用easyAI开发井字棋AI10步实现人机对战【免费下载链接】easyAIPython artificial intelligence framework for games项目地址: https://gitcode.com/gh_mirrors/ea/easyAI想用 Python 写一个能和你对战的井字棋 AI 吗其实只需要 10 步。本文将手把手教你使用easyAI框架开发井字棋 AI实现完整的人机对战。easyAI 是一个专为双人博弈游戏设计的纯 Python 人工智能框架内置强大的Negamax 算法你只需描述游戏规则AI 就能自动学会下棋。即使你完全不懂算法原理也能在 10 分钟内写出第一个能赢你的人工智能程序。easyAI 是什么easyAI 是面向双人抽象棋类游戏井字棋、四子棋、黑白棋等的 Python AI 框架其最大特点是写规则不写算法你只需要定义游戏规则AI 自动负责思考 内置 Negamax 搜索算法自带 alpha-beta 剪枝和置换表优化纯 Python 实现无编译依赖新手友好框架的核心代码只有几个文件结构非常清晰文件作用easyAI/TwoPlayerGame.py双人游戏基类你写的游戏要继承它easyAI/Player.py人类玩家与 AI 玩家的定义easyAI/AI/Negamax.py核心 AI 算法Negamax 搜索easyAI/games/TicTacToe.py现成的井字棋示例我们直接改造它 好消息框架里已经自带了井字棋的完整实现我们的 10 步其实就是读懂并复用它的过程。第 1 步安装 easyAI 框架安装非常简单一条命令搞定pip install easyAI如果你的网络环境不便使用 pip也可以直接获取源码git clone https://gitcode.com/gh_mirrors/ea/easyAI然后进入目录执行python setup.py install。另外建议安装 NumPy部分示例游戏会用到。安装完成后在 Python 交互环境里验证一下from easyAI import TwoPlayerGame, Negamax print(easyAI 安装成功)第 2 步理解井字棋的核心规则在写代码前先明确游戏规则这是任何博弈 AI 开发的第一步棋盘是 3×3 共 9 个格子两名玩家轮流落子先连成一条线横、竖、斜者获胜9 格下满无人连线则为平局easyAI 里约定1 号玩家先手棋盘编号从 1 到 9依次对应三行格子1 2 3 4 5 6 7 8 9第 3 步创建游戏类并初始化棋盘打开文件easyAI/games/TicTacToe.py先看类的骨架。每个 easyAI 游戏都要继承TwoPlayerGame基类并完成两件必须做的事把players存入self.players用self.current_player 1指定先手玩家from easyAI import TwoPlayerGame class TicTacToe(TwoPlayerGame): def __init__(self, players): self.players players self.board [0 for i in range(9)] # 9 个空格子 self.current_player 1 # 玩家 1 先手棋盘用长度为 9 的列表表示0表示空格1和2分别代表两位玩家的棋子。第 4 步实现可走位置查询AI 和人类都需要知道现在能下在哪儿。possible_moves()返回所有空格子的编号def possible_moves(self): return [i 1 for i, e in enumerate(self.board) if e 0]如果棋盘是[1, 0, 2, ...]说明第 1、3 格已被占用可走位置里就不会有1和3。第 5 步实现落子与悔棋make_move()负责把棋子放到棋盘上def make_move(self, move): self.board[int(move) - 1] self.current_playerunmake_move()是可选的优化方法把刚才的落子撤销。别小看它——它能让 AI 不用复制整个棋盘状态搜索速度大幅提升def unmake_move(self, move): self.board[int(move) - 1] 0第 6 步实现胜负判定井字棋的胜负规则是三子连成一线。lose()方法检查对手是否已经连成线用 8 条线3 横 3 竖 2 斜逐一比对def lose(self): return any( all([(self.board[c - 1] self.opponent_index) for c in line]) for line in [ [1, 2, 3], [4, 5, 6], [7, 8, 9], # 横向 [1, 4, 7], [2, 5, 8], [3, 6, 9], # 纵向 [1, 5, 9], [3, 5, 7], # 斜向 ] )is_over()判断游戏是否结束要么有人获胜要么棋盘下满def is_over(self): return (self.possible_moves() []) or self.lose()第 7 步编写 AI 的评分函数这是 AI 的价值观来源。scoring()告诉 AI当前局面**对你当前玩家**是好是坏def scoring(self): return -100 if self.lose() else 0含义如果对手已经连成线说明你输了评分为-100否则为 0。Negamax 算法会基于这个评分向前推演所有可能的走法自动选择对自己最有利的一步。 注意评分是站在当前玩家角度的easyAI 的框架会自动处理视角切换你不需要自己翻转符号。第 8 步配置 Negamax AI 引擎AI 的核心是Negamax类位于easyAI/AI/Negamax.py。它的原理是向前推演 N 步棋评估每一步的后果选择评分最高的走法。配合 alpha-beta 剪枝可以跳过大量无意义的搜索分支。实例化 AI 只需指定思考深度向前看几步from easyAI import Negamax ai_algo Negamax(6) # AI 向前推演 6 步井字棋棋盘很小6已经足够让 AI 几乎不犯错。数值越大 AI 越强但思考耗时也越长。第 9 步组装人机对战现在把人类玩家和 AI 玩家组装起来。Human_Player()会在终端向你提问AI_Player(ai_algo)则让 AI 自动决策from easyAI import Human_Player, AI_Player, Negamax ai_algo Negamax(6) game TicTacToe([Human_Player(), AI_Player(ai_algo)]) game.play()这段代码位于 TicTacToe.py 的__main__入口中你也可以把它写成独立的play_tic_tac_toe.py文件。第 10 步运行你的第一个 AI 对战保存代码后运行你将看到棋盘并轮流输入落子位置. . . . . . . . . Player 1 what do you play ? 5 Move #1: player 1 plays 5 : . . . . O . . . . Move #2: player 2 plays 1 : X . . . O . . . .几个实用的小技巧输入show moves可以查看当前所有可走位置输入quit随时退出游戏想后手挑战 AI把列表顺序换成[AI_Player(ai_algo), Human_Player()]即可进阶玩法从井字棋到更多棋类 学会这 10 步你就掌握了 easyAI 的全部核心套路。同样的模式可以套用到任何双人博弈游戏框架自带的easyAI/games/目录下还有四子棋ConnectFour.py、黑白棋Reversi.py等现成案例。想让 AI 更强试试这几招加大思考深度Negamax(9)让 AI 更深谋远虑置换表加速用TranspositionTable()缓存已评估的棋局避免重复计算求解游戏用solve_with_iterative_deepening判断某个局面先手是否必胜位于easyAI/AI/solving.py总结通过 10 步我们用 easyAI 完成了一个可运行的井字棋人机对战程序。整个过程只写了不到 30 行业务代码AI 的博弈搜索全部由框架的 Negamax 算法easyAI/AI/Negamax.py代劳。回顾核心要点继承TwoPlayerGame实现 4 个必要方法用Negamax一行代码获得会思考的 AI用[Human_Player(), AI_Player(algo)]组合对战双方这就是 easyAI 的魅力——写规则赢下棋。现在就去试试吧祝你和你的 AI 玩得开心【免费下载链接】easyAIPython artificial intelligence framework for games项目地址: https://gitcode.com/gh_mirrors/ea/easyAI创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考