为什么同样是翻转棋作业,有人只求跑通,有人却直接给棋盘装上“思考回路”?
事情发生在多伦多大学工程系大一。当时的实验要求先写代码实现翻转棋(Reversi/Othello)的全部交互逻辑,再在8×8棋盘上做一个能自动落子、还能自己评估局势的AI。任务最后一步最刺激:必须击败两个教官机器人,才能进入课程排行榜,争夺额外加分。
第一步:把规则变成代码
翻转棋规则不复杂:黑白棋子,落子时要把对方的棋子夹在两边,夹住的子全部翻成自己的颜色,最终棋盘上子多的一方获胜。但工程实验不会这么简单——棋盘大小可变,捕获方向有8个。所以第一部分代码要处理:
- 判断坐标是否在棋盘内
- 检查某个方向是否有合法吃子
- 生成全部合法落子点
- 执行翻子操作并更新棋盘
- 复制棋盘状态供后续搜索
这些函数全在终端环境下跑。作者晒出的函数声明包括 inBounds、checkLegalInDirection、flip、copyBoard 等,全是C语言,没靠任何现成游戏库。
第二步:让AI会“想”
只把规则写齐只是入门,要打赢教官机器人,得让AI会预判。作者选的方案是 minmax(极小化极大)搜索 + alpha-beta 剪枝。
Minimax的思路很简单:每个局面都能打分,分数越高对你越有利。你下这一步时,假设对手也会玩——他会选对他来说分数最低、也就是对你最不利的走法。你从未来的棋盘倒推回来,找到那个“在对手最优应对下仍能拿到最高分”的落子。
这是很多入门教程都会讲的内容。原作者当时没被教过,于是去网上找资料,比如 Sebastian Lague 的解释视频中就提到,黑棋最优走法会通向分数3——在3和5之间选小的,因为对手会压你。
第三步:用剪枝把时间压进1秒
搜索树越深,局面判断越准,但计算量爆炸。不优化的minimax根本来不及。加上 alpha-beta 剪枝后,搜索时会跳过那些双方都不可能选择的分支,在相同深度下砍掉大量无效计算,每步棋的时间就能压在1秒以内——这是实验的硬性要求。
最后的结果
靠这套组合拳,作者的AI击败了两个教官机器人,随后被送入循环赛,进入课程排行榜参与排名。
从只会写吃子判断的新手,到能用搜索算法下棋的AI,中间差的就是“多挖一步”的功夫。算法不是玄学,它只奖励那些肯把问题想透的人。
热门跟贴