首页/新闻资讯/正文详情

Python五子棋源码解析:人机对战与人人对战实现

发布时间:2026/11/14 0:36:22 来源:云帆数科 栏目:资讯中心
Python五子棋源码解析:人机对战与人人对战实现
简介这份Python五子棋源码包面向Python初学者与想入门游戏开发的编程爱好者提供人机对战与人人对战两种完整可运行模式帮助读者在真实项目中理解GUI编程、事件驱动与AI搜索算法的落地方式。压缩包共4个文件以3个py源码文件为主另含1个pyc编译缓存文件整体约9KB体量轻巧便于快速阅读与二次修改。源码围绕棋盘绘制、落子判定、胜负检测与双人对弈逻辑展开人机模式中涉及Minimax与Alpha-Beta剪枝等决策思路代码按功能拆分结构清晰适合作为算法与界面结合的练手案例。目前已有1890人学习下载读者可从中掌握Python标准库调用、Tkinter界面交互、递归搜索优化及模块化组织等实用技能对课程设计或小型项目实践均有参考价值。1. 拆开这份 Python 五子棋源码人机对战和人人对战到底怎么落地的很多人第一次看到「Python 五子棋源码」这几个字脑子里冒出来的画面是一个黑框窗口输入坐标回车电脑回一步。但这份压缩包拆开之后实际结构比想象中干净——checkerboard.py负责棋盘与规则人人对战.py和人机对战.py各自是独立入口外加一个__pycache__目录里躺着checkerboard.cpython-39.pyc。也就是说作者把「棋盘逻辑」和「对局模式」做了物理隔离两个入口文件都 import 同一个棋盘模块。这种拆法对想学 Python 源码软件结构的人很友好你不需要先啃一个几千行的单文件而是能按模块逐个击破。它适合两类人——刚学完 Python 基础、想找一个能跑起来的小项目练手的以及想看看 GUI 事件驱动和简单搜索算法怎么在真实代码里配合的。下面我按「先跑通、再拆逻辑、最后避坑」的顺序把这份源码从头到尾过一遍。2. 跑通两个入口环境、依赖与启动顺序2.1 先确认 Python 版本和 GUI 库这份源码的__pycache__里是cpython-39说明作者当时用的是 Python 3.9。但五子棋本身不依赖 3.9 的独有语法3.8 到 3.12 基本都能跑。真正需要确认的是 GUI 库——从源码结构和常见做法判断棋盘绘制和鼠标点击响应大概率走的是 Tkinter因为它是 Python 标准库自带不需要额外pip install符合「源码软件」轻量分发的习惯。先做一次环境自检python --version python -c import tkinter; print(tkinter.TkVersion)第一行看版本号第二行看 Tkinter 能不能正常导入并打印 Tk 版本。如果第二行报ModuleNotFoundError说明你的 Python 安装时没勾选 Tcl/Tk 组件Windows 下重新跑安装程序勾上即可Linux 下一般是sudo apt install python3-tk。这一步别跳过我见过太多人直接双击.py文件结果窗口一闪而过其实就是 Tkinter 缺失导致初始化失败。2.2 两个入口文件的启动方式把压缩包解压到一个纯英文路径下比如D:\code\gomoku不要放在桌面或带中文的目录里。然后分别启动cd D:\code\gomoku python 人人对战.py人人对战入口启动后正常表现是弹出一个固定尺寸的窗口棋盘线绘制完整鼠标点击交叉点会交替落下黑白子。关掉窗口再启动人机对战python 人机对战.py人机对战入口的差异在于你落子之后程序会有一段短暂的计算时间然后自动在某个位置落下白子。如果点击后没有任何反应或者窗口直接卡死先看终端有没有报错输出——Tkinter 的异常有时不会弹窗只打在控制台。提示两个入口文件都依赖同目录下的checkerboard.py所以必须保证三个文件在同一级目录不能把入口文件单独拖出来跑。2.3 参数怎么改棋盘尺寸和先手方源码里棋盘大小通常以常量形式定义在checkerboard.py顶部常见写法是BOARD_SIZE 15或CELL_SIZE 40。前者是 15×15 的交叉点数量后者是每个格子占多少像素。如果你想改成 19×19不能只改BOARD_SIZE还要同步检查窗口初始化的宽高计算否则棋盘会画到窗口外面去。先手方一般在人机对战入口里控制。常见做法是定义一个HUMAN_FIRST True之类的开关或者直接看落子顺序如果程序启动后先等你点击说明人类先手如果程序立刻落子说明 AI 先手。想换先手找到初始化对局状态的那几行把当前玩家变量从黑方改成白方即可。改完记得同步检查胜负判断里的颜色映射否则会出现「明明连了五子却不判赢」的玄学问题。3. 拆棋盘模块数据结构、落子校验与胜负判断3.1 棋盘用什么存二维列表还是字典checkerboard.py的核心是一个棋盘状态容器。最常见的实现是二维列表# 常见做法15x15 的二维列表0 表示空1 表示黑2 表示白 BOARD_SIZE 15 board [[0] * BOARD_SIZE for _ in range(BOARD_SIZE)] def is_empty(row, col): return board[row][col] 0 def place(row, col, player): if not is_empty(row, col): return False board[row][col] player return True这里board[row][col]的索引顺序要和 GUI 绘制时的坐标换算保持一致。Tkinter 画布上像素坐标(x, y)换算成棋盘索引通常是col x // CELL_SIZE、row y // CELL_SIZE如果反过来写棋子就会落在关于对角线对称的错误位置。place函数返回布尔值是为了让调用方知道这次落子是否合法而不是直接抛异常——GUI 事件回调里抛异常很容易把整个事件循环搞崩。3.2 胜负判断的四个方向扫描五子棋判赢的本质是落子之后以该点为中心检查横、竖、左斜、右斜四个方向是否存在连续五个同色棋子。常见实现def check_win(row, col, player): directions [(0, 1), (1, 0), (1, 1), (1, -1)] for dr, dc in directions: count 1 # 正向扫描 r, c row dr, col dc while 0 r BOARD_SIZE and 0 c BOARD_SIZE and board[r][c] player: count 1 r dc if False else dr # 注意这里行列增量别写反 c dc # 反向扫描 r, c row - dr, col - dc while 0 r BOARD_SIZE and 0 c BOARD_SIZE and board[r][c] player: count 1 r - dr c - dc if count 5: return True return False上面这段里我故意留了一个容易翻车的点行列增量。dr是行方向增量dc是列方向增量正向扫描时行加dr、列加dc反向扫描时行减dr、列减dc。如果两个变量在循环里写混斜向判断就会漏掉。四个方向覆盖了所有五连可能不需要额外判断「长连」——五子棋里超过五个也算赢所以count 5是安全的。3.3 人人对战的回合切换人人对战入口的逻辑最直白维护一个current_player变量每次合法落子后翻转。关键点是「合法落子才翻转」——如果玩家点了一个已经有棋子的位置不能切换回合否则会出现同一个人连下两步的情况。常见写法def on_click(event): global current_player col event.x // CELL_SIZE row event.y // CELL_SIZE if not (0 row BOARD_SIZE and 0 col BOARD_SIZE): return if not place(row, col, current_player): return draw_piece(row, col, current_player) if check_win(row, col, current_player): show_result(current_player) return current_player 3 - current_player # 1 变 22 变 13 - current_player是一个小技巧比写 if-else 简洁。draw_piece负责在画布上画圆show_result弹提示或改标题。注意event.x和event.y是相对于画布左上角的像素坐标如果画布有边框或偏移换算时要减掉偏移量否则棋子会整体偏一格。4. 人机对战里的 AI搜索、评估与性能边界4.1 从随机落子到 Minimax 的选型理由人机对战入口里AI 的决策质量直接决定这份源码是「玩具」还是「能下几手」。最简单的实现是随机选一个空位但那样体验很差。稍微像样的做法是给每个空位打分选最高分。再往上就是 Minimax 加 Alpha-Beta 剪枝。这份源码的摘要里提到了 Minimax 和 Alpha-Beta说明作者至少考虑过搜索算法路线。Minimax 的思路是AI 假设自己走一步、对手走一步递归推演到一定深度然后回溯选择对自己最有利的分支。Alpha-Beta 剪枝则是在搜索过程中如果发现某个分支已经不可能比当前最优解更好就提前砍掉减少计算量。对于 15×15 的棋盘如果不剪枝搜索深度到 4 层时节点数已经爆炸所以剪枝几乎是必须的。4.2 评估函数怎么写才不「瞎下」搜索算法需要一个评估函数来给局面打分。常见做法是扫描所有可能的五连窗口统计 AI 和玩家的棋型# 简化版评估统计每个空位周围八个方向的连子情况 def evaluate_point(row, col, player): score 0 directions [(0, 1), (1, 0), (1, 1), (1, -1)] for dr, dc in directions: count 1 block 0 for sign in (1, -1): r, c row sign * dr, col sign * dc while 0 r BOARD_SIZE and 0 c BOARD_SIZE: if board[r][c] player: count 1 elif board[r][c] 0: break else: block 1 break r sign * dr c sign * dc if count 5: score 100000 elif count 4 and block 0: score 10000 elif count 4 and block 1: score 1000 elif count 3 and block 0: score 1000 elif count 3 and block 1: score 100 elif count 2 and block 0: score 100 return score这段代码的逻辑是连子越多、被堵得越少分数越高。count 5给极大值保证 AI 看到必胜点会直接下。block记录两端被对方棋子堵住的次数活四两端都空比冲四一端被堵值钱得多。实际源码里可能还会加入「对手威胁」的负分让 AI 在进攻和防守之间做权衡。4.3 搜索深度和响应速度的平衡人机对战最影响体验的参数是搜索深度。深度太浅AI 只看一步容易被套路深度太深每走一步要算好几秒玩家等得难受。常见做法是限制在 2 到 4 层并且只考虑已有棋子周围两格内的空位而不是全盘扫描。这个「候选点裁剪」能把每层分支从 200 多个降到 20 个以内是性能优化的关键。如果你发现 AI 落子后窗口卡住超过 3 秒先检查候选点有没有做范围限制。另一个排查方向是评估函数里有没有重复计算——比如每次递归都重新扫描全盘而不是增量更新。增量更新写起来麻烦但对搜索类 AI 是值得的。注意搜索深度和棋盘尺寸是耦合的。15×15 下深度 4 勉强能接受19×19 下同样深度会明显变慢需要进一步裁剪候选点或降低深度。5. 避坑与排查从「跑不起来」到「跑得对」5.1 现象双击 .py 文件窗口一闪而过原因入口文件在初始化 GUI 之前就抛了异常或者 Tkinter 组件缺失导致Tk()创建失败。Windows 下双击运行时控制台窗口关闭太快看不到报错。解决不要双击用命令行python 人机对战.py启动让报错留在终端里。如果是 Tkinter 缺失重新安装 Python 时勾选 Tcl/Tk。如果是路径里有中文或空格把整个目录移到纯英文路径下再试。5.2 现象棋子画在错误的位置整体偏移原因像素坐标换算成棋盘索引时没有减去画布偏移量或者row和col写反了。Tkinter 画布的(0, 0)在左上角如果棋盘绘制时留了边距点击坐标要先减边距再除以格子大小。解决在on_click里打印event.x、event.y和换算后的row、col点几个已知位置对照。常见修正是col (event.x - MARGIN) // CELL_SIZErow (event.y - MARGIN) // CELL_SIZE其中MARGIN是棋盘左上角到画布边缘的距离。5.3 现象AI 落子后不判胜负或者判了不弹提示原因AI 落子走的是另一条代码路径可能没有调用check_win或者调用了但传入的player参数不对。另一个可能是胜负判断在 AI 落子后执行了但弹窗被主循环阻塞看起来像没反应。解决在 AI 落子后手动加一行print(check_win(ai_row, ai_col, AI_PLAYER))看返回值。如果返回True但没弹窗检查show_result是不是用了messagebox但没导入或者用了print而控制台被隐藏了。5.4 现象人人对战下同一个人连下两步原因落子失败点到已有棋子或棋盘外时回合切换没有提前返回导致current_player被翻转了。解决确保place返回False时直接return不执行后面的翻转逻辑。这个坑在事件回调里很常见因为回调函数不会因为返回False就自动停止必须显式return。5.5 现象AI 第一步下在天元以外的奇怪位置原因如果 AI 先手而评估函数对所有空位打分相同就会按遍历顺序选第一个通常是左上角。这不是 bug但体验不好。解决在 AI 决策入口加一个特判如果棋盘为空直接下天元中心点。如果人类先手且只下了一子AI 可以优先考虑紧邻的位置而不是全盘随机。6. 进阶玩法把 AI 换成 Rapfi 思路与源码改造验证这份源码的 AI 部分如果只做到「评估函数 一层贪心」棋力大概相当于入门水平。想再往上走可以借鉴 Rapfi 这类五子棋引擎的思路用置换表缓存已搜索过的局面用迭代加深逐步增加深度用历史启发排序候选点。但完整移植工作量不小更现实的做法是在现有checkerboard.py基础上做增量改造。第一步把评估函数里的棋型识别抽成独立函数方便替换。第二步在 AI 决策入口加一个SEARCH_DEPTH常量默认 2想测试更深搜索时改大同时观察响应时间。第三步加一个简单的置换表# 用字典做简易置换表key 是棋盘状态的字符串表示 transposition {} def board_key(): return .join(str(board[r][c]) for r in range(BOARD_SIZE) for c in range(BOARD_SIZE)) def minimax(depth, player, alpha, beta): key board_key() if key in transposition: return transposition[key] # ... 递归逻辑 ... transposition[key] best_score return best_score这个置换表在深度 3 以上才有明显收益深度 2 时反而增加字符串拼接开销。所以改完要实测同一局面下加表和没加表的耗时差多少。如果耗时没降说明搜索深度还不够触发重复局面。验证改造是否有效我一般用三个指标一是 AI 在空棋盘先手时是否下天元二是人为摆一个「活三」局面看 AI 是否堵在正确位置三是连续对局十次看 AI 有没有出现「明明能赢却下别处」的情况。第三个指标最能暴露评估函数的权重问题——往往是进攻分给太高防守分给太低导致 AI 只顾自己连子。从那以后我每次改这类搜索 AI都强制走一遍「空盘先手、活三防守、必胜点检测」这三步验证不靠感觉判断棋力涨没涨。希望帮到你。本文还有配套的精品资源点击获取

相关推荐

极限学习机五大变体MATLAB实战:ELM、OSELM、KELM、SSELM、USELM避坑指南
极限学习机五大变体MATLAB实战:ELM、OSELM、KELM、SSELM、USELM避坑指南

简介:本资源面向机器学习初学者与研究者,系统整理了极限学习机(ELM)及其多种变体的MATLAB实现,覆盖从有监督到半监督、无监督的完整学习范式。包内共31个文件,以23个m脚本为核心,辅以sinc_train… · 2026/11/13 5:45:16

LTTB下采样算法:用三角形面积保特征的可视化降维方案
LTTB下采样算法:用三角形面积保特征的可视化降维方案

简介:本资源是一份面向Python数据处理开发者与算法学习者的LTTB(最大三角形三桶)下采样算法完整实现包,聚焦于高效保留时序或曲线数据局部特征的降采样需求,适用于大数据可视化预处理、传感器数据压缩、前端图表性能优… · 2026/11/6 17:22:23

AI Agent Skills机制详解:从Prompt工程到可复用技能封装
AI Agent Skills机制详解:从Prompt工程到可复用技能封装

“skills”这个标题看起来像是一个文件夹名,但我第一反应是:这不就是当前 AI Agent 工程化里最核心的那层抽象吗?如果你最近在折腾 Claude、Cursor 或者各类 Agent 框架,大概率已经接触过 “Skills” 这个概念。简单说&#xff0c… · 2026/11/8 16:04:22

办理天津电工证怎么报名 外省证能不能转过来
办理天津电工证怎么报名 外省证能不能转过来

办理天津电工证怎么报名 外省证能不能转过来 之前考的证在外省能不能转过来?这几乎是每个想在天津从事电工工作的人都会问的问题。其实,天津对异地电工证的 办理天津电工证怎么报名 并不复杂,但流程和要求必须搞清楚,否则可能会耽误你的工作安排。… · 2026/11/14 0:36:18

山东电工证考试好考吗 怎么报名别踩坑
山东电工证考试好考吗 怎么报名别踩坑

山东电工证考试好考吗 怎么报名别踩坑 怕考不过白交培训费?山东电工证考试难度到底如何?不少三门峡公路工程从业者在选择电工证培训时,最关心的就是考试通过率和报名流程。其实,只要方法得当,山东电工证考试并不难,关键在于你有没有掌握好报名和备考的… · 2026/11/14 0:36:18

兴义哪里换电工证怎么报名?电工证不办就别想上岗
兴义哪里换电工证怎么报名?电工证不办就别想上岗

兴义哪里换电工证怎么报名?电工证不办就别想上岗 你是不是在兴义找电工相关工作,结果被问一句“有电工证吗”就卡住了?别急,这不是你一个人的问题,这是整个特种作业行业的通病。电工证不办,你就别想进工地、进厂、进工地现场,哪怕你技术再牛,也得先拿… · 2026/11/14 0:36:18

建设厅特种作业操作证app怎么用?上岗必备的这些坑别踩
建设厅特种作业操作证app怎么用?上岗必备的这些坑别踩

建设厅特种作业操作证app怎么用?上岗必备的这些坑别踩 怕考不过白交培训费,你不是一个人。很多刚毕业的工程类学生,尤其是南阳卧龙区的应届生,刚进工地就被告知必须有【建设厅特种作业操作证app】上的证书才能上岗,否则连门都进不去。可问题是,证… · 2026/11/14 0:36:18

电工证报名周期怎么考?千万别踩坑,外省证书转过来有讲究
电工证报名周期怎么考?千万别踩坑,外省证书转过来有讲究

电工证报名周期怎么考?千万别踩坑,外省证书转过来有讲究 之前考的证在外省能不能转过来?这个问题几乎成了很多电工从业者的心头病。尤其是那些在外地打拼、换过工作地的人,证书转不了,等于白忙活。别急,今天咱们就来聊聊 电工证报名周期… · 2026/11/14 0:36:18

有电工证能当什么兵 官方回应特种作业证的重要性与报考指南
有电工证能当什么兵 官方回应特种作业证的重要性与报考指南

有电工证能当什么兵 官方回应特种作业证的重要性与报考指南 你是不是也遇到过这种情况:拿着电工证,却找不到合适的工作?明明有证在手,却还是被用人单位拒之门外?其实, 电工证 不是万能的,但 没有电工证是万万不能的… · 2026/11/14 0:35:18

电工证丢失还能补吗?千万别踩坑,丢了证等于失业
电工证丢失还能补吗?千万别踩坑,丢了证等于失业

电工证丢失还能补吗?千万别踩坑,丢了证等于失业 你正在找工作,但手里的电工证突然丢了,这下怎么办?别急,先别慌, 电工证丢失还能补吗 ?答案是肯定的,但 千万别踩坑 ,补办流程如果不了解,可能会耽误你上岗、甚至影响到你的收入。… · 2026/11/13 22:30:50

电力电缆作业证直播报名入口与办理流程良心建议
电力电缆作业证直播报名入口与办理流程良心建议

电力电缆作业证直播报名入口与办理流程良心建议 你是不是也担心学历不高报不了名?别急,今天就给你讲讲 电力电缆作业证直播 的报名流程和那些你必须知道的干货, 良心建议 在这里,别错过。 电力电缆作业证直播报名需要什么条件?… · 2026/11/13 5:40:45

英德电工证报考费多少钱,怕考不过白交培训费?看完这篇别再踩坑
英德电工证报考费多少钱,怕考不过白交培训费?看完这篇别再踩坑

英德电工证报考费多少钱,怕考不过白交培训费?看完这篇别再踩坑 怕考不过白交培训费?英德电工证报考费多少钱,你真的了解吗?现在市面上培训机构五花八门,价格参差不齐,很多人一不小心就花了冤枉钱,结果还考不过。别急,今天就来给你说清楚英德电工证的… · 2026/11/12 23:27:43

有初级电工证怎么工作 2026河南最新政策怎么应对
有初级电工证怎么工作 2026河南最新政策怎么应对

有初级电工证怎么工作 2026河南最新政策怎么应对 之前考的证在外省能不能转过来?这个问题我每天被问上百次。2026年河南最新政策对证书跨省转移有了明确说明,特别是南阳市的从业者,需要特别关注。… · 2026/11/14 0:00:31

电工证过期了不知道怎么复审?考电工证自学书+官方报名入口全攻略
电工证过期了不知道怎么复审?考电工证自学书+官方报名入口全攻略

电工证过期了不知道怎么复审?考电工证自学书+官方报名入口全攻略 证书过期了不知道怎么复审延期?很多人遇到这种情况,要么是工作太忙没时间处理,要么是不知道具体流程,导致证书失效,影响工作和项目进展。其实复审并不难,关键是要找准官方报名入口,掌… · 2026/11/14 0:00:31

为什么要低压电工证实操考试考什么
为什么要低压电工证实操考试考什么

为什么低压电工证值不值得考?别再被中介骗了 你是不是也经常看到网上有人在问“低压电工证到底值不值得考”?或者在找报名点时,担心被中间人骗钱?这些问题,我懂,我也经历过。作为一名在应急管理行业摸爬滚打多年的从业者,我深知低压电工证不仅是一个从… · 2026/11/14 0:00:31

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/13 6:12:21

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/13 6:11:51

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/13 22:31:30

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码