Anteater Chess
一个国际象棋变体,EECS 22L 的第一个项目,基于 C 语言。
- 类型
- 课程项目
- 年份
- 2026
- 角色
- 算法开发
- 技术栈
- C · GTK 3 · Make
项目简介
Anteater Chess 是 EECS 22L 的团队项目:一个 8×10 棋盘的变体象棋。相比传统国际象棋多了两个食蚁兽棋子。小组包含六个人,使用 GTK 3 的 GUI。细节功能包括棋钟、走子历史、提示和悔棋。我负责其中 bot 的算法部分,棋盘、规则和界面由其他队友完成。
引擎是一个两千多行的 C 文件。核心是迭代加深的 alpha-beta 搜索:每一层都以上一层的分数开一个窄窗口,搜过的局面存进置换表,再配合空着裁剪和静态搜索把搜索树剪小;走法排序靠杀手着法、历史得分和静态交换评估,好的走法先搜,剪枝才剪得掉。界面上的难度档位和提示按钮用的都是这同一套搜索,区别只在给它多少时间,在超时前返回当前最佳的结果。
锦标赛的规则是每方 10 分钟,通过多次的自对弈,我最终给引擎每步留 10 秒左右的预算。这 10 秒能搜多深,取决于剪枝和走法排序的效率,所以优化的重点放在这两处:同样的时间里搜得更深,对弈时差距就很明显。所以我们尽量采用尽可能更小的数值类型,同时避免复制的使用,这样才做到了最好的优化。最终引擎在课程锦标赛拿到第二名,与第一名并列,毕竟遇到强对手只能平局了。
这个变体本质上和标准的棋盘并没有什么特别大的差别,但是变体棋子没有任何现成的价值参考,只能经过数轮的调整来得出。从最后的结果上来看,这个吉祥物棋子的价值甚至不如一只小兵,令人感叹。
我负责的部分
- 01
搜索
采用了alpha-beta算法,包含空着裁剪和静态搜索。
- 02
评估函数
子力价值与分阶段的棋子位置表结合,额外加上机动性、王安全、蚂蚁结构、开放线等数种阵型分数。新棋子的子力价值经过了大量的自对弈确认并优化了。
- 03
时间管理
为算法的效率做了优化,让其在更短的时间内能迭代更深的层数,并在最终 10 分钟时限的前提下,给出了每步 10 秒的预算。