简介:《计算机博弈竞赛辅导资料》是一份面向计算机博弈竞赛参赛者及人工智能博弈方向学习者的PPT讲义,侧重帮助读者建立从棋类对象、软件架构到搜索与评估的知识框架。压缩包内含1个PPT文件,大小约2.57MB,内容以课堂讲义形式组织,适合赛前梳理概念、对照复习与专题查漏补缺,已有330人学习。讲义围绕棋类介绍与分类展开,涉及中国象棋、国际象棋、围棋、五子棋、六子棋及部分民间棋类,并讲解计算机博弈基本原理、博弈软件构成、棋局评估、博弈树展开与分析,以及基于搜索的方法学特点和学科关系。读者可借助这份材料快速理解竞赛题目背后的博弈模型、搜索思路与评估要点,形成较完整的备赛知识地图。
1. 开场题:五子棋已被证明先手必胜,为什么还要考禁手
计算机博弈竞赛辅导资料翻到棋类那一页,很多人会愣一下:五子棋那一行写着「已被证明先手胜」,紧跟着又是「禁手、换手」。既然先手必胜,禁手考什么?这道反直觉的小题,恰好点出这场竞赛的考法:它不考你会不会下棋,考的是你能不能把一盘棋拆成可计算的东西——棋盘多大、着法怎么生成、博弈树怎么展开、评估函数怎么给分。
分值也集中在这三块:棋类参数与分类是送分区,博弈树与搜索是主考区,棋局评估和软件构成是拉开差距的压轴区。适合已经写过搜索、但没系统梳理过棋类规则的人。先把参数表背成条件反射,再拿一棵树手推剪枝,最后练评估函数的口述,这条路比闷头刷十盘棋有用得多。
2. 棋类参数与分类:送分题最密集的一块
卷子发下来,第一道大题十有八九落在棋类参数上:棋盘几乘几、几个兵种、多少子、怎么判胜负。这块钱最好拿,也最容易漏——漏一个特殊规则,整道简答就从满分掉到及格线。这一章把主流棋种的硬参数摊开,再讲两套分类轴怎么用,最后拿三道真题走一遍答题路径。
2.1 主流棋种的棋盘、兵力与胜负判定
参数题的特点是「记错一个数字就全错」,所以别贪多,先记结构:棋盘尺寸、兵种与子数、胜负判定、特殊规则,四栏填满就算过关。
| 棋种 | 棋盘 | 兵力配置 | 胜负判定 | 特殊规则 |
|---|---|---|---|---|
| 中国象棋 | 9×10 | 红黑各 7 个兵种、16 子 | 将死对方或将帅被吃 | 长将长捉、时间约束、60 步不吃子判和 |
| 国际象棋 | 8×8 | 王 1、后 1、车 2、象 2、马 2、兵 8,共 16 子 | 王被杀即输 | 王车易位(长、短)、兵升变、吃过路兵 |
| 围棋 | 19×19 | 黑白轮流入子 | 占地盘多者胜 | 先手贴目 5–7,难度最大,常缩到 9×9 |
| 五子棋 | 15×15 | 轮流入子 | 五子连珠 | 禁手、换手、金球制一类的改进球制 |
| 六子棋 | 19×19 | 轮流入子 | 六子连珠 | 先手下一子,之后每手两子 |
| 点格棋 | 点阵连边 | 轮流入子(连边) | 占格多者胜 | 占格者继续连边;死格、双环、长链、短链、环 |
| 苏拉卡尔塔 | 盘面走子 | 双方等量棋子 | 吃光对方棋子 | 除吃子外每步一格,沿完整弧线吃子 |
| 亚马逊 | 盘面走子 | 每方 4 个「后」 | 无子可动者负 | 每着含移动与设障,比活动范围 |
这张表里藏着几道高频小题。中国象棋的「7 个兵种 16 子」是固定说法,别写成 6 个兵种;「60 步不吃子判和」常和「长将长捉」一起考,问的是规则完备性——为什么一个博弈程序必须处理这些和棋与循环条款,因为搜索树在循环局面上会无限展开。国际象棋的重点在不对称规则:兵首步可走两格、吃过路兵、走到底线升变、王车易位分长易位和短易位,这四条任何一条漏掉,着法生成器就会漏着。
围棋那栏要记住两个数字:19×19 和贴目 5–7。规则最简单、计算难度最大,这句话术在简答题里非常好用。它的工程含义是分支因子大、单步评估难,所以常见做法是先缩到 9×9,也就是常说的四分之一棋盘,把问题规模压下来再谈搜索。答题时把「贴目」和「先手优势」挂上钩,说明贴目是给后手方的补偿,逻辑就闭合了。
国际象棋的相对子力值是必背的一组数字:以兵为 1,马约 3、象约 3、车约 5、后约 9。注意「相对」两个字——它只在同一盘棋内部用来比较交换是否划算,不是绝对得分。这一条在评估函数题里会反复出现,第 4 章还会展开。
五子棋和六子棋几乎是同一道题的两面。五子棋 15×15,规则简单,但先手优势大到必须打补丁:禁手限制先手不能走某些成形点,换手让后手有机会接管先手的局面,改进球制再往前一步。六子棋干脆改规则本身——棋盘放大到 19×19,先手只下一子,此后每手两子,用「每步多下一子」把先手优势削掉。这道对比常被拿来问「怎么设计规则削弱先手优势」,答案就两句:要么限制先手着法(禁手),要么改变下子节奏(每手两子)。
民间棋类不是凑数的,它们常出现在「分类判断」和「规则理解」两类题里。三通棋全盘 64 个小正三角形,即 64 个棋位,双方各 32 枚,轮流布子、每着一枚,乙方有一次连下两着的权利,先实现三通者胜——注意那个「只有一次」的乙方双着权,是平衡手段。二虎棋里虎方先走、可跳吃、每次吃一子,吃够一定数量即胜;犬方每次只走一子到邻近空位,靠围困取胜,把虎方全部棋子堵到无法走动才算赢。一字棋走子距离不限,至少一步、至多走到终点,不准逆行,一次可以动任一个棋位上的一个或多个棋子,但必须停在同一个目标棋位上。
点格棋的考点偏概念:邻近两点连成一边,四边围成一个方格,最后一个占边者拿走这个格子并且必须再连一边,最后占格多者胜。真正拉开差距的是那几个术语:死格、双环、长链、短链、环。答这类题要能说出「死格」为什么叫死——一旦某个格子只剩一边没连,而轮到对手去连,对手就白白拿走它,这类格子在中盘是战略资源。
苏拉卡尔塔的规则一句话就能概括:除吃子外每步只走一格,可沿垂直或对角;吃子必须沿弧线并经过一个完整的弧。答题时把「沿弧吃子」和「必须完整」两个限定词写出来,才算答完整。亚马逊每方 4 个「后」,每着由移动和设障两部分组成,双方争的是活动范围,无子可动判负,本质上是一种「憋死」类游戏。华容道是滑块类单人游戏,把最大方块移到下方中央箭头处即完成,它常被用来问「单人游戏算不算博弈」——这正好接上下一节的分类轴。
2.2 两套分类轴:按人数、按着法
分类题的失分,多半不是不知道类别,而是答了一半。题目问「棋类怎么分类」,标准答法是先给轴、再给类、最后给例,三句话说完。
第一根轴按参与人数:双人、单人、多人。双人弈棋占绝大多数,象棋、围棋、五子棋、国际象棋都是;单人的典型是华容道这类滑块游戏;多人的典型是跳棋。这根轴的意义在于状态空间的对手建模——单人游戏本质是路径规划,双人游戏才有对抗搜索,多人游戏则要考虑联盟与次序,三种问题的算法路线完全不同。
第二根轴按着法:走子类、填子类、混合类。走子类是开局前双方摆好、开局后轮流走动棋子,象棋、国际象棋、跳棋、牛角棋、苏拉卡尔塔、亚马逊都属于这一类。填子类是开局盘面无子、开局后轮流往盘上放子,围棋、五子棋、点格棋在这一类。混合类最容易被漏:开局盘面无子、轮流放入,一定条件之后转为轮流走动棋子,典型是五道棋,兼有填子、走子、吃子;日本将棋则是走子、吃子、填子三者都有。
这两根轴交叉起来,就是一盘棋的完整定位。答题时最好再补一句工程含义:走子类必须实现合法性判定和吃子处理,填子类重点在落点枚举和连通性判断,混合类要维护「阶段切换」的状态标志。这句话一出来,阅卷的人就知道你不是在背名词。
还有一个概念性的分组必须记住:棋类是完全信息动态博弈,牌类是不完全信息动态博弈。这条区分不是文字游戏——完全信息意味着双方对盘面一无所知的部分为零,所以可以老老实实展开博弈树;牌类有隐藏信息,博弈树这条路直接走不通,得换概率与信念更新的思路。凡是题目问「为什么计算机下棋比打牌进展快」,答案就落在这里。
2.3 真题演练:三道参数与分类题怎么答满
第一题:「棋类和牌类在博弈论意义上有什么区别?这个区别对算法选择有什么影响?」
答题思路分三层。先定性:棋类是完全信息动态博弈,牌类是不完全信息动态博弈。再解释:完全信息指任何时刻双方对局面信息的掌握是对称且完整的,因此可以把「我走一步、对手走一步」展开成一棵树,用搜索求值;不完全信息下同一局面存在多种可能状态,树上的节点不是一个确定局面而是一个信念集合。最后落到算法:前者走博弈树加剪枝这条路,后者要走概率采样与信息集上的决策。三层写完,这题基本满分,切忌只答「一个有信息一个没信息」。
第二题:「点格棋按着法属于哪一类?为什么?它的难点在哪?」
先答类别:属于填子类,因为开局盘面没有棋子,双方轮流往盘面上添加边。再给理由:整局的主要动作是「加边」而非「移动已有棋子」,虽然占格后会再连一边,但仍是添加动作。最后答难点:局面评估不只看占格数,还要看链结构——长链、短链、双环、死格决定了中后盘的得失节奏,程序如果只会数格子,进入长链阶段就会被对手牵着走。这题的分水岭在最后一段,答出链结构才算真懂。
第三题:「五子棋先手优势明显,工程上有哪些平衡手段?六子棋的思路有什么不同?」
先摆事实:五子棋在自由规则下已被证明先手胜,所以正式规则要加平衡手段。再列举:禁手限制先手在特定成形点的着法,换手让后手可以选择接手先手的局面,金球制一类的改进球制进一步调整先后手关系。然后对比:六子棋不是给先手加限制,而是改节奏——先手下一子,此后每手两子,用「每步多下一子」摊薄先手第一子的价值,同时把棋盘放大到 19×19,让复杂度显著提高。收尾可以加一句:这两种思路分别对应「限制行动」和「改变节奏」,是规则设计的两个基本方向。
提示:参数类简答最怕「只写数字不写含义」。棋盘尺寸后面跟一句「决定分支因子量级」,子力值后面跟一句「用于交换判断」,字数不多,但卷面档次完全不同。
3. 博弈树与搜索:竞赛主考场的答题骨架
参数题拿的是基础分,真正决定排名的在这一章。给一个局面、给一棵树、给一组分支因子,让你手推估值回传、数剪枝节点、估复杂度——这类题年年有,答不上来的原因往往不是不会写代码,而是脑子里没有那张三层结构的图。这一章先把树画清楚,再上剪枝,最后用真题练手推。
3.1 博弈树的三层结构与估值回传
博弈树的骨架只有三层:根节点是当前待决策的局面,下一层是「我」走完一步后的所有局面,再下一层是「对手」应对后的所有局面,如此交替直到叶子。习惯上把「我」的层叫 MAX 层,因为这一层选估值最大的分支;对手的层叫 MIN 层,选估值最小的分支。这个命名不是装饰,它决定了回传规则。
回传的逻辑说穿了很朴素:叶子节点由评估函数打分,分数从叶子往根方向传;遇到 MAX 层取子节点最大值,遇到 MIN 层取子节点最小值。为什么 MIN 层取最小?因为对手也在为自己争最好结果,而评估函数是从「我」的角度打的分,对手得分越低,对我越有利。
这棵树的规模由两个参数决定:分支因子 b 和搜索深度 d。全展开的叶子数是 b 的 d 次方。中国象棋中局分支因子大致几十,取 b=40、d=6,叶子数就是 40 的 6 次方,四十多亿,任何机器都搜不完。所以「为什么必须剪枝」这道题的答案不是「剪枝更快」,而是「不剪枝根本不可行」。这句话在简答里值分。
理解了规模,再说评估函数的接入点。评估函数只在叶子(或达到深度上限的节点)被调用,中间节点只做比较。这就带来一个必考的取舍:深度加一层,看得更远但代价乘上分支因子;深度减一层,快但容易在战术上翻车。答题时把「搜索深度与评估精度的权衡」这句话写出来,通常能拿到关键分。
还有一个常考的小点:着法生成必须过滤非法着法。把不合法的着法送进搜索,等于让程序自己制造幻觉,估值再准也没用。中国象棋的长将长捉、60 步不吃子判和,国际象棋的吃过路兵与王车易位条件,五子棋的禁手点,都必须在生成阶段处理掉。
3.2 Alpha-Beta 剪枝:手推与代码两条路
Alpha-Beta 的核心是两个边界值:α 是 MAX 层当前已经拿到的最好分数(下界),β 是 MIN 层当前已经能压到的最好分数(上界)。沿着树往下走时,这两个值不断收紧;一旦出现 α ≥ β,说明这个分支的结果不可能影响到上层决策,直接放弃。
手推题的固定流程是:从左到右遍历叶子,先算完最左边一支得到初始 α 和 β,再逐支推进,每进入一个 MIN 节点就把 β 往下压,压到不超过 α 就划掉剩余子节点。答题时把「当前 α、当前 β、被剪掉哪几支」三样写清楚,过程分就稳了。
代码这条路更能体现理解深度:
INF = float("inf") # 极小极大搜索 + Alpha-Beta 剪枝 # board:当前局面对象;depth:剩余搜索深度 # alpha:MAX 层已知最好下界;beta:MIN 层已知最好上界 # maximizing:True 表示当前是「我」的层(MAX),False 表示对手层(MIN) def alphabeta(board, depth, alpha, beta, maximizing): if depth == 0 or board.is_terminal(): return board.evaluate() # 叶子节点交给评估函数打分 if maximizing: value = -INF for move in board.legal_moves(): # 着法生成阶段已过滤非法着法 board.make(move) value = max(value, alphabeta(board, depth - 1, alpha, beta, False)) board.undo(move) # 必须回溯,否则局面被污染 alpha = max(alpha, value) # MAX 层抬高下界 if alpha >= beta: # 剪枝:对手层不会走到这里 break return value else: value = INF for move in board.legal_moves(): board.make(move) value = min(value, alphabeta(board, depth - 1, alpha, beta, True)) board.undo(move) beta = min(beta, value) # MIN 层压低上界 if alpha >= beta: break return value这段代码里,board承担局面表示与走子回溯,depth控制搜索层数,alpha和beta是剪枝窗口,maximizing决定当前层的取大还是取小。make和undo必须成对出现,漏一个undo,后面的兄弟分支就在错误的局面上展开,结果全错而且极难排查,这是最典型的翻车点。
alpha >= beta这个条件要能解释清楚:当 MAX 层已经有一个不差于 β 的结果时,上层的 MIN 节点绝不会选择进入这个分支,因为对手有更差(对他更有利)的选择。所以剪掉的不是「错的」分支,而是「不可能被选中的」分支。这句话是简答题的得分句,务必背下来。
剪枝的收益取决于着法排序。理想情况下,最优叶子数从 b 的 d 次方降到大约 2 乘以 b 的 d/2 次方,等于把指数砍半,搜索深度翻倍。但如果着法顺序很糟糕,剪枝几乎不起作用,退化成全搜索。所以工程上常见「先试吃子、先试杀手着法」的排序策略,答题时能提一句排序对剪枝效率的影响,是加分项。
3.3 真题演练:剪枝节点数与复杂度估算
第一题:「分支因子 40、搜索深度 6,全展开的叶子节点是多少?理想剪枝后大约多少?说明了什么?」
先算:40 的 6 次方约为 4.1×10 的 9 次方,四十亿量级。再算理想剪枝:约 2 乘以 40 的 3 次方,也就是十二万量级。最后说结论:两者相差四个数量级以上,剪枝把「不可行」变成「可行」,本质是把指数从 d 降到 d/2。这题的分不在算术,在最后那句结论。
第二题:「给出一棵深度为 4、分支因子为 2 的完全二叉树,叶子估值从左到右依次为 3、5、2、8、1、4、6、0,请手推 Alpha-Beta 剪枝过程,指出被剪掉的分支。」
答题步骤:第一步,最左一支走完,MAX 层拿到 3,MIN 层上界收紧到 3。第二步,进入第二支,遇到第一个叶子 5 时,MIN 层发现 5 大于 3,说明这一支对 MAX 更有利,MIN 层不会选它,于是剪掉该节点剩余子节点。第三步,按同样逻辑推进后续分支,逐个记录被剪的节点。答题时画简图、标注 α 和 β 的当前值,比纯文字描述清楚得多。
第三题:「为什么评估函数只在叶子节点调用?如果把评估放在中间节点会怎样?」
要点有三:一是成本,中间节点数量远小于叶子,但调用评估意味着每个节点都要做一次特征提取,整体代价会大幅上升;二是语义,中间节点的估值没有考虑对手的反击,容易高估;三是结构,搜索的意义就在于用「对手会还手」这一假设去修正静态评估。答完这三点,再补一句「所以中间节点只做取大取小」,逻辑就完整了。
第四题:「同一深度下,着法排序好坏对搜索结果有影响吗?」
答案是:对最终结果没有影响,对耗时影响巨大。剪枝是安全的,它只跳过不可能被选中的分支,不改变根节点的最优着法;但排序决定了有多少分支能被跳过。最优排序接近理论下界,最差排序退化为全搜索。答题时把这句「结果不变、效率大变」写出来,是标准的得分表述。
注意:手推剪枝题一定要从左到右、逐支推进,不要跳着看。跳跃推演是失分重灾区,因为你无法证明中间某个分支为什么被剪。
4. 棋局评估与软件构成:从能搜到会判断
搜索解决的是「怎么选」,评估解决的是「凭什么选」。一盘棋搜到叶子,程序必须给出一个分数,这个分数好不好,直接决定棋力。竞赛里评估函数的设计题经常以「请为某个棋种设计评估函数」的形式出现,答得好不好,看的是你能不能把棋类规则翻译成分数项。这一章先讲评估的四个来源,再讲软件的模块分工,最后拿两道设计题收尾。
4.1 评估函数的四类打分来源
评估函数的第一来源是子力。国际象棋的相对子力值是最标准的模板:兵 1、马 3、象 3、车 5、后 9。中国象棋没有统一到小数点后的标准值,但思路一样:车、炮、马价值高,兵卒过河后升值,士象在防守端有固定价值。答题时先给「以兵为 1 的相对值体系」,再说明它是用于交换判断而非绝对胜负,这一句能挡住追问。
第二来源是位置。同样是马,站在中心和控制要道的价值完全不同;同样是中国象棋的兵,过河前后是两个量级。位置分的常见做法是维护一张位置权重表,按棋子的落点查表加分。这类设计题的关键不是表长什么样,而是说清楚「位置分必须和子力分同量纲」,否则位置分很容易盖过子力分,程序会为了抢一个好点白送一个车。
第三来源是机动性,也就是可走着法的数量。机动性高的局面通常更主动,但这条不能滥用:某些局面下着法多恰恰意味着防线松散。答题时给一句限定——机动性分只作辅助项,权重压低,避免程序为了凑着法数而乱走。
第四来源是特殊规则项,这一项最容易被漏,也最能体现区分度。中国象棋要处理长将长捉与 60 步不吃子的和棋倾向,如果程序在优势局面下反复循环,就会被判和,评估函数里要能识别「循环无进展」并对己方不利。五子棋要处理禁手:先手走成禁手点直接判负,评估函数必须在候选着法阶段就把禁手点降权甚至排除。国际象棋要处理兵升变,一个即将升变的通路兵,价值远高于普通兵。把这些规则写成分数项,评估函数才算落地。
四个来源之间要配权重。常见的答法是给一个层级:子力为主,位置次之,机动性与特殊规则作修正项,最后做归一化。这样的回答既有结构,又不会被追问「权重具体是多少」时卡住——权重靠对局调参,不靠拍脑袋。
4.2 软件四大模块的分工与接口
计算机博弈软件的构成,标准四件套是:用户界面、棋盘模拟、搜索算法、评估函数。这四个模块的分工要在答题时说清楚,否则容易被追问「界面和搜索怎么解耦」。
用户界面负责棋盘显示、走子输入、计时与对局控制。它的职责边界是「不参与决策」,任何把搜索逻辑写进界面的做法都会让程序难以测试。棋盘模拟负责局面表示、着法生成与合法性判定,它是整个系统的基础,所有模块都通过它读写局面。搜索算法负责博弈树展开与剪枝,评估函数负责给叶子打分。
四个模块的接口可以这样描述:界面调用棋盘模拟把用户输入转成着法,再交给搜索模块求最优着法,搜索过程中反复向棋盘模拟请求合法着法、向评估函数请求叶子估值,最后把结果回传给界面渲染。这条链路说清楚,等于把整个软件架构讲完了。
局面表示是常考追问。棋盘模拟内部可以用一维数组、二维数组或位棋盘存局面,选择依据是着法生成的效率与合法性判定的复杂度。答题时不必给具体实现,但要说明「局面表示的选择服务于着法生成」,这句话能挡住大部分追问。
还有一条工程经验值得写进答案:搜索与评估之间最好约定一个纯函数式接口,评估函数只读局面、不修改局面。这样评估函数可以被单独测试,也可以被替换成不同版本做对比。这个约定在笔试里不算硬考点,但在设计题里是明显的加分项。
4.3 真题演练:两道评估函数设计题怎么答
第一题:「请为中国象棋设计一个基本的局面评估函数,说明各分数项与权重思路。」
答题框架分四段。第一段给子力项:以兵为基准值,车、炮、马给固定分值,兵卒按过河与否分档。第二段给位置项:车占开放线加分,马居中心加分,炮在中路与底线各有不同权重,士象在防守位置加分。第三段给特殊项:被将军扣分,将帅暴露扣分,长将循环无进展扣分,残局阶段子力项权重上调、位置项权重下调。第四段给权重与归一化:子力为主项,位置与特殊项为修正,输出统一到同一量纲。
这题的分水岭在第三段。只写子力和位置,说明你只会下棋;写出长将与和棋规则的处理,说明你想过「程序怎么输在自己手里」。
第二题:「五子棋的评估函数和象棋有什么本质不同?禁手怎么处理?」
先答相同点:都要有子力(这里对应棋子数量与形态)与位置分。再答不同点:五子棋的胜负是形态判定,不是吃掉对方,所以评估的核心是「形」——活三、冲四、活四、连五这些形态的威胁等级,而不是棋子值多少分。常见做法是扫描所有线路,统计各方向的连子形态并加权,同时考虑攻防两侧。最后答禁手:禁手点属于规则层面的非法着法,最稳妥的处理是在着法生成阶段直接过滤,而不是靠评估函数扣分,因为一旦走进禁手点,棋局立刻结束,扣多少分都来不及。
这题的高分句是「规则性非法着法在生成阶段处理,策略性不利着法在评估阶段处理」。把这两类问题分开,说明你理解了模块边界。
5. 常见错误:五个最容易翻车的失分点
复习到后面,最怕的不是不会,而是「以为自己会」。下面五条是从答题纸和代码里反复见到的错法,每一条都按「错在哪、为什么错、怎么答对」拆开。
5.1 把棋类和牌类混成一类
错在哪:被问到博弈分类时,答「棋牌都是双人对抗游戏,都属于完全信息博弈」。
为什么错:牌类存在隐藏信息,每个玩家看到的局面不同,属于不完全信息动态博弈。把两者混为一谈,后面所有关于搜索可行性的推论都会跟着错。
怎么答对:先给出「棋类是完全信息动态博弈、牌类是不完全信息动态博弈」这一组对照,再补一句「完全信息才能把对局展开成树,这是搜索类方法的前提」。一句话把分类和算法连起来,追问也挡得住。
5.2 子力值当绝对分背
错在哪:把「马 3、车 5、后 9」直接写进评估函数当绝对得分,叶子上限只有几十,结果位置分一加就盖过子力分。
为什么错:这组数字是相对值,原始定义是以兵为 1 的相对比较,用来判断交换是否划算,不是用来当总分的。
怎么答对:先说明「相对值,以兵为 1」,再说明使用方式——乘一个基准系数后计入总分,位置分与特殊项按比例缩放,保证同量纲。答题时补一句「权重靠对局调参确定」,比硬报一个数字安全。
5.3 认为剪枝会改变搜索结果
错在哪:回答「Alpha-Beta 剪枝可以剪掉不好的分支,所以结果可能和全搜索不一样,但更快」。
为什么错:剪枝只跳过不可能被选中的分支,根节点的最优着法不变。说结果会变,等于承认剪枝不安全,这是概念性错误。
怎么答对:标准表述是「结果等价、效率提升」。再补一句前提:剪枝的正确性依赖于着法生成不遗漏、估值回传方向正确。这两条一提,说明你知道剪枝在什么条件下才成立。
5.4 先手必胜与禁手的关系答反
错在哪:答「五子棋有禁手,所以先手不一定必胜」。
为什么错:因果颠倒。是因为先手优势过大、在自由规则下已被证明先手胜,才需要用禁手、换手这些手段去平衡。禁手是补丁,不是原因。
怎么答对:按「先手优势明显 → 已被证明先手胜 → 引入禁手与换手做平衡 → 六子棋改用每手两子改变节奏」这条线答,顺序不能乱。这个顺序本身就是一道题的答案结构。
5.5 评估函数只写子力
错在哪:设计题只答「按棋子价值求和」,没有位置、机动性和规则项。
为什么错:只算子力的程序在中局会走出「子力不亏但局面崩盘」的棋,而且处理不了和棋、禁手、升变这些规则性事件,实战中会输得很莫名。
怎么答对:按「子力为主、位置次之、机动性与特殊规则作修正」的层级答,并且至少具体写出一个规则项,比如中国象棋的长将循环扣分、五子棋的禁手点在生成阶段过滤。有一个具体例子,整段就立住了。
提示:这五条错法有一个共同点——都能靠「先给定义、再给条件、最后给影响」三步说清。答题时养成这个顺序,比背结论稳。
6. 押题思路:三天把六类题练成肌肉记忆
押题不是猜题目,是把题型收敛到几条固定路径上。这份辅导资料覆盖的内容,落到卷面上无非六类:棋种参数、分类判断、博弈树与剪枝、评估函数设计、软件模块分工、规则与胜负判定。每一类的答法都能练成条件反射,关键是别按章节顺序看,按「输出形式」练。
第一天练参数和分类。拿一张白纸,不看资料,把中国象棋、国际象棋、围棋、五子棋、六子棋、点格棋、苏拉卡尔塔、亚马逊八种棋的棋盘、子数、胜负条件、特殊规则默写一遍,写不出来的地方做个记号,第二遍只默记号处。默完再练分类轴:随便报一个棋名,三秒内说出它按人数属于哪类、按着法属于哪类、依据是什么。这一步练熟,送分区基本不会丢。
第二天练树和剪枝。找一棵深度 4、分支因子 2 的树,自己写八个叶子估值,手推一遍剪枝,边推边在纸上标 α 和 β 的当前值,推完对照代码逻辑检查。然后练复杂度估算:b=40 时把 d=4、5、6 的全展开叶子数和理想剪枝叶子数各算一遍,记住数量级。最后用嘴说一遍「为什么剪枝不改变结果」,说到不用想为止。
第三天练评估和模块。挑一个棋种,五分钟内口述一个评估函数:先说子力项怎么给,再说位置项怎么给,再说一个规则项怎么处理,最后说权重怎么配。说完换一个棋种再来一遍。模块题用固定句式:「界面负责显示与输入,棋盘模拟负责局面与着法生成,搜索负责树展开与剪枝,评估负责叶子打分,四者通过局面对象交互」。
我自己的血泪经验是:手推剪枝那一步千万不能只在脑子里过。我第一遍复习时觉得逻辑很顺,真到纸上推,走到第三支就忘了 α 该不该更新,白白丢了过程分。从那以后我每次练剪枝都强制走一遍「画图、标 α/β、写剪掉哪几支」的流程,哪怕题目只问结论。参数表也一样,我现在每次默写都强制把特殊规则栏填满,宁可多写一条和棋条款,也不留空。希望帮到你。
资料里这几块内容是按考点顺序整理的,参数表、手推示例、评估函数模板都在同一份文档里,照着上面三天的顺序过一遍,比零散搜题省时间。
本文还有配套的精品资源,点击获取