简介面向计算机博弈竞赛学习者与参赛选手的这套辅导PPT源自东北大学机器博弈研究室的系统讲解内容涵盖棋类介绍与分类、计算机博弈基本原理、软件构成、棋局评估、博弈树展开与分析等核心主题并针对中国象棋、国际象棋、围棋、五子棋、六子棋及一字棋、三通棋、点格棋等棋类梳理了规则与博弈特点适合备赛入门、理论巩固或教学参考。资源为1个PPT文件压缩包约2.57MB内容集中、体积精简便于直接浏览学习。目前已有329人学习下载。通过这份课件读者可以快速建立计算机博弈的整体框架深入理解博弈树、alpha-beta剪枝、启发式搜索等关键方法并联系具体棋类案例理解软件构成与棋局评估逻辑。PPT中对机器博弈的方法学特点与学科关系也有专门讲解有助于从宏观视角把握该领域的研究思路为后续算法实践和竞赛选题打下扎实基础。1. 先搞懂一件事计算机博弈到底是什么如果你第一次听到“计算机博弈”脑子里冒出来的可能是“电脑下棋”。没错它确实是让计算机下棋但又不只是“下棋”这么简单。我见过不少新手一上来就到处找代码结果下载了一堆棋类引擎看了半天也不知道从哪里入手。其实计算机博弈是一门让程序“自己思考下一步”的学问它研究的是机器怎么在规则明确、信息透明的棋类游戏里通过搜索和评估做出好决策。这份辅导资料就是某高校机器博弈研究室的教学讲稿讲的是最基础的原理和方法学包括棋类介绍、博弈树、棋局评估、搜索算法等。它非常适合想参加计算机博弈竞赛、或者对AI兴趣浓厚但完全没经验的新手。你不需要会很高深的数学也不需要先精通编程只要你能看懂“一盘棋的走法可以画成一棵树”就已经抓住了这门课的核心。2. 为什么值得学从一枚棋子到一套决策系统2.1 计算机博弈不只是下棋而是AI的试验田很多人把“下棋程序”当成小玩具觉得围棋AI能赢人类才叫厉害。但实际上计算机博弈是人工智能领域最经典的“练兵场”。因为棋类规则明确、胜负标准清晰、信息完全透明特别适合用来研究“如何在有限时间内做出最优决策”这个核心问题。你写的任何一个棋类程序本质上都是一个微型决策系统它要感知局面、评估优劣、搜索可能的变化、最后选一步棋。这套流程和无人驾驶、游戏AI甚至聊天机器人里“决策模块”的逻辑是相通的。我第一次学的时候以为计算机博弈就是“把棋谱背下来”。后来才明白真正的博弈程序不会记录所有棋谱而是自己“算”出好棋。因为棋类变化太多比如中国象棋的合法局面数远超想象根本存不下。所以程序必须靠一套高效的搜索算法在有限时间里尽可能看到更远的未来。这种“在约束条件下找最优解”的思路才是最有迁移价值的。2.2 竞赛考的是什么从原理到实践计算机博弈竞赛通常不是比谁的程序写得花哨而是让两个程序实际对弈谁赢谁输很直接。竞赛会限定棋种比如五子棋、六子棋、点格棋、亚马逊等。参赛者要做的就是写一个能自动下棋的程序。这意味着你不仅要懂规则还要会设计棋盘数据结构、实现走法生成、写评估函数、调搜索深度最后还要处理时间控制。很多新手误以为竞赛比的是“谁搜索得深”但其实在时间限制下搜索深度大家都能做到差不多。真正拉开差距的是对局面的理解——也就是评估函数。同样的搜索深度如果走完一步之后不知道哪边占优那程序就会像个无头苍蝇乱撞。所以竞赛考的不只是算法还有你把棋理转化成数值打分的能力。这份资料里专门讲了棋局评估和博弈树展开就是在帮你补上这个最关键的认知。2.3 入门的第一步先看懂棋盘和棋子不管你最后想写哪个棋种第一步都是把规则吃透。规则不是背几句“马走日、象走田”就完了而是要能用程序语言描述出来。所谓“能用程序描述”指的是你能回答这几个问题棋盘长什么样坐标怎么表示双方有哪些棋子各在什么位置一个棋子从一个位置走到另一个位置需要满足什么条件什么情况下算赢什么情况下算和棋或禁手你可以随便选一个棋种比如五子棋然后用纸笔画一个15×15的网格试着把每一步走法都写出来。别小看这个动作很多老手翻车都是因为在规则理解上模棱两可。我第一次做六子棋程序时就漏掉了“先手下一子之后每手下两子”的细节导致程序在开局就出错。所以我的建议是不要急着写代码先花一天时间把规则转成流程图或伪代码这比你调试三天bug更划算。3. 先把核心概念吃透博弈树、评估函数、搜索算法3.1 博弈树把一盘棋变成一棵树下棋的过程本质上是一个不断“分支”的过程。你走一步对手有若干种回应你针对每一种回应又有若干种应对……把所有可能走法展开就形成了一棵倒着长的树这就是博弈树。树根是当前局面第一层是你的可选走法第二层是对手对每个走法的回应第三层又是你的回应以此类推。理解博弈树的关键是程序并不知道未来会发生什么它只能通过层层展开去“看”。比如你想让自己的程序能看三步那你就要把树往下展开三层。展开到叶子节点时你没法再往下走了就得用评估函数给这个终局打分。然后程序再把分数层层回传选出对自己最有利的那条分支。你可能会担心树不是会爆炸吗没错每层分支数就是“平均招法数”像国际象棋每步大约30种合法走法如果看10步就是30的10次方根本算不完。解决办法就是剪枝去掉明显不好的分支这叫“alpha-beta剪枝”。这份资料里反复强调“基于搜索”的方法学就是围绕这个树展开的。3.2 评估函数给棋局打个分评估函数是博弈程序的“眼睛”。它的输入是当前棋盘局面输出是一个数值。分数越高代表对程序一方越有利分数越低代表越不利。比如在中国象棋里你可以把每个棋子按价值打分兵1分、马3分、炮3分、车5分、后如果类比的话9分然后累加双方棋子价值再相减得到一个粗浅的分数。但真实评估函数远没有这么简单。你得考虑棋子位置、机动性、威胁等因素。比如一个被逼到角落的车可能还不如一个活跃的兵有用。评估函数的质量直接决定程序的棋力。很多新手一开始只会做“子力总和”结果程序总是莽撞送子就是因为只看值不看位置。我建议你从最简单的评估开始然后一点点加特征。比如先让程序数棋子总价值然后再加“中心控制”的加分项。你会看到棋力有明显的提升。记住评估函数不是一步到位的它需要你不断对局、调整权重。这就像调一碗汤的咸淡得边尝边加盐。3.3 搜索算法让程序“多想几步”有了博弈树和评估函数还需要一个算法来遍历这棵树。最基础的是“极小极大搜索”如果你是当前方你会从所有走法里选分数最高的那步假设对手也足够聪明他会从所有回应里选让你分数最低的那步。所以程序在搜索时会这样推演自己走一步后预测对手会怎么走然后再想自己怎么应对……交替进行。最后把最坏情况下的最好结果当作当前走法的得分。有了这个机制程序就不是只看眼前一步而是能预判好几步了。为了加速搜索人们发明了alpha-beta剪枝它可以在不改变结果的前提下砍掉大量不需要看的分支。想象你在一堆苹果里挑最大的当你已经找到一个足够大的后遇到比它小的就不用细看了。剪枝就是这个逻辑。这个原理不难但第一次写时容易搞错参数我后面会讲怎么排查。3.4 第一个能跑的例子用Python给井字棋局面打分为了让概念落地我们用一个最简单的棋——井字棋来示范。虽然竞赛不会考井字棋但它只有9个格子非常适合理解“评估函数”怎么写。假设我们用0表示空1代表你方棋子-1代表对手棋子。下面这个函数计算一个局面中“你的棋子构成的威胁数”与“对手的威胁数”之差def evaluate(board): # board是一个3x3的二维列表元素是0、1或-1 # 返回正数表示对我方有利负数表示对对方有利 lines [] # 收集所有行、列、两条对角线 for i in range(3): lines.append([board[i][0], board[i][1], board[i][2]]) # 第i行 lines.append([board[0][i], board[1][i], board[2][i]]) # 第i列 lines.append([board[0][0], board[1][1], board[2][2]]) # 主对角线 lines.append([board[0][2], board[1][1], board[2][0]]) # 副对角线 my_score 0 opp_score 0 for line in lines: # 如果一条线上有2个我方棋子且没有对手棋子算一个“活二”给一点分 if line.count(1) 2 and line.count(-1) 0: my_score 10 # 如果一条线上有2个对手棋子且没有我方棋子对手有威胁 if line.count(-1) 2 and line.count(1) 0: opp_score 10 # 如果一条线上有1个我方棋子其余为空算一个潜力分支 if line.count(1) 1 and line.count(-1) 0: my_score 1 if line.count(-1) 1 and line.count(1) 0: opp_score 1 return my_score - opp_score这个函数的思想很简单统计所有行、列、对角线上的棋子分布如果某条线上已经有两个同色棋子且没有对手棋子说明再放一个就能赢所以给10分。如果只有一个棋子说明有发展潜力给1分。最后我方总威胁分减去对手总威胁分就是当前局面的评估值。你可以自己造两个局面试试比如我方已经有两枚棋子连着一条线另一个位置空着这个函数会给出正分。等你能看懂这个打分的逻辑再去看资料里的棋局评估部分就会秒懂。接下来你可以把这个函数嵌到极小极大搜索里让程序学会走一步看一步。这就是你的第一个“能跑”的博弈程序。4. 不同棋类各有脾气像认识朋友一样认识它们4.1 完全信息与不完全信息棋和牌的本质区别资料在一开始就提到一个重要的分类棋类是不包含机会或偶然性的完全信息动态博弈而牌类是不完全信息动态博弈。什么意思呢就是下棋时双方所有棋子都摆在明面上没有任何隐藏信息也不靠掷骰子决定走向。而打牌时你并不知道对手手里有什么牌。所以棋类更“讲理”每一步都可以凭智力推导这就非常适合计算机搜索。理解这一点很重要因为它决定了你写的程序是“看眼下”还是“猜未来”。棋类程序可以直接枚举所有合法走法而牌类程序还得加入概率推算。所以我们学习的计算机博弈主要集中在棋类、滑块类等完全信息游戏。资料里提到的华容道是单人滑块游戏也算一种“博弈”只不过对手是游戏本身的布局。4.2 典型棋类一览中国象棋、国际象棋、围棋、五子棋、六子棋资料介绍了大量棋类入门阶段你不需要全懂但应该对几个典型棋类有个整体印象棋类棋盘棋子/特点适合入门的理由井字棋练习用3×33个棋子连成一线即胜规则最简单适合练搜索和评估五子棋15×15连成五子为胜有禁手评估函数直观适合练局面打分六子棋19×19先手下一子之后每手两子复杂度适中竞赛热门中国象棋9×107种兵种16子规则丰富子力价值明确适合练评估国际象棋8×86种棋子有王车易位和升变资料里给了子力值容易入手围棋19×19空棋盘轮流落子占地多者胜规则最简单但局面最复杂前期不建议我第一次学的时候直接挑战中国象棋结果被“蹩马腿”“象眼”“长将判负”这些细节折磨得头大。后来换成五子棋一下就顺畅了。所以对完全零基础的新手我的建议是先用井字棋或五子棋练手不要一上来就啃复杂的棋种。围棋虽然规则简单但分支因子巨大传统的alpha-beta搜索很难应付现在多用蒙特卡罗树搜索。资料里也提到围棋是“计算机博弈难度最大”的你不必把它作为第一个目标但可以了解一下它的难点在哪里。等你把搜索和评估都玩熟了再回头看围棋会更有感觉。4.3 小众棋类与华容道为什么它们也有用资料里还介绍了一字棋、二虎棋、三通棋、点格棋、苏拉卡尔塔、亚马逊等。这些棋有些看起来很怪但恰恰是竞赛里常见的“冷门项目”。因为越冷门的棋越没有现成代码可抄大家比的就是谁更能把棋理转化为算法。比如点格棋核心是“死格”“双环”“长链”这些结构玩起来很有策略深度。亚马逊棋则是“移动皇后设障”有点像国际象棋和博弈论结合的产物。华容道是单人游戏你需要把最大的方块移到出口。它虽然不是双方对战但很适合练习“状态空间搜索”和“哈希表去重”。你完全可以把它当成一个搜索练习题用宽度优先搜索求解最少步数。所以我建议你多翻翻资料里的棋类介绍哪怕不玩也要知道世界上还有这么多有趣的棋类。说不定哪年竞赛就出了一个你没见过的棋到时候心态就不会慌。5. 新手最容易踩的坑和排查方法血泪经验帮你避开5.1 现象一评估函数感觉没问题棋力却很差很多新手写完评估函数后明明觉得“这个局面好”程序却总是走出蠢棋。原因往往是评估函数太短视只看了当前子力没有看位置和机动性。比如在中国象棋里一个原地不动的车比分值高的马更有用但程序只看分值就会盲目兑子。解决方法是把评估函数拆成多个维度每个维度一个可调权重。比如“子力价值 位置价值 机动性分”。调权重时让程序自己跟自己下看哪边胜率高就保留哪个版本。我见过一位同学用二分搜索法调权重效果很好。别指望一次就能写对这需要反复试。5.2 现象二搜索太慢一步棋要等半天搜索慢是新手遇到的经典问题。有时候你明明只设置了看4步程序却计算好几分钟。这通常是因为没有写剪枝或者剪枝写错了。alpha-beta剪枝的关键是要在一个局部变量里保存当前已经知道的最好值再和对手的最坏值比较。很多新手把参数传反导致剪枝完全没生效。另外一个常见原因是没有做走法排序。搜索时如果先试最差的走法剪枝效率就会很低。如果先把最好的走法比如吃子、将军排在前面就能快速提升效果。我的习惯是在搜索外部先用评估函数给所有走法排个序再把排序后的走法列表传入搜索函数。5.3 现象三代码一多就乱根本不知道改哪里博弈程序通常包含棋盘表示、走法生成、评估、搜索、界面等多个模块。新手喜欢全写在main函数里最后改一个功能就要动一堆代码。我建议你从一开始就按功能分文件比如board.py棋盘的数据结构和显示moves.py生成所有合法走法evaluate.py评估函数search.py极小极大搜索和alpha-beta剪枝main.py主循环和交互你每改一个模块就用一个小测试脚本验证它。比如改完走法生成就打印所有走法和电脑上的棋谱对照确认没漏掉。不要等到整个程序写完再一起调试那样根本找不到bug在哪。5.4 现象四以为越复杂越厉害结果反被简单策略碾压有些新手喜欢堆复杂的算法比如蒙特卡罗树搜索、神经网络结果被一个只有深度搜索加简单评估的老程序打得满地找牙。原因是复杂算法需要调参和大量模拟如果训练不足还不如朴素的搜索稳定。我认识一位同学他先把六子棋程序做到了能稳定下完一局加了alpha-beta剪枝后棋力大增然后再慢慢调评估。每一步都是小步快跑从不一口气上大工程。我的建议是先做一个“笨但正确”的版本能走棋、能赢最弱的对手再一点一点加新功能。这样出了问题你至少知道是哪个新加的部分引起的。6. 下一步学什么从跑通第一个Demo到完整竞赛程序6.1 制定一个循序渐进的路径你现在已经知道了计算机博弈的基本概念和几个核心模块接下来最重要的是动手。我给你一个建议的路径每一步都有明确产物阶段任务产物1用任意编程语言实现一个井字棋程序能两人对战可运行的对战Demo2给井字棋程序加一个简单的极小极大搜索深度不超过3能自动下棋的程序3把井字棋换成五子棋实现15×15棋盘和连五判断五子棋基础程序4给五子棋设计评估函数活三、活四、冲四等有棋力的五子棋AI5学习alpha-beta剪枝并应用到一个竞赛棋种如六子棋或点格棋能参加校内赛的程序你不用按部就班地学完所有棋种先挑一个你最感兴趣的。资料里提到的“基于搜索的方法”是所有棋种通用的底子只要把一个棋种做透其他棋种只是改规则和评估的事。6.2 给自己定一个最小目标一周内跑通一个自动下棋程序我说的“跑通”不是让它下得多好而是让它能按规则合法地走棋。哪怕是随机选走法也算跑通了。很多新手卡在“想做一个完美AI”的压力下迟迟不写第一行代码。你完全可以把目标降低先用随机策略让你的程序能完完整整下一局棋。一旦看到棋盘上的棋子能动了你就会瞬间获得信心。我记得自己第一次写博弈程序时兴奋地让随机程序自己跟自己下虽然它下得乱七八糟但那种“程序学会了规则”的感觉真的很棒。从那以后我每次接触一个新棋种都强制自己先做一个“合法走子的傻瓜版”再考虑智能。这个习惯让我少踩了很多坑希望也能帮到你。本文还有配套的精品资源点击获取