
简介亚马逊棋作为一款由瑞士数学家于1988年设计的双人策略棋类融合围棋、国际象棋与战舰游戏元素始终是机器博弈研究的理想平台。这套资料围绕该游戏整理出多个版本的程序合集包含gamazons-0.70、gamazons-0.83及amazons等源码与可执行文件适合研究AI决策、搜索算法的开发者以及高校相关课程师生对照学习。压缩包共203个文件约687KB涵盖C源码、头文件、makefile构建脚本、PNG图像资源与configure配置等结构完整可支撑跨版本对比。已有614人学习下载。深入阅读代码既能理解游戏状态表示、alpha-beta剪枝、蒙特卡洛树搜索等经典算法的落地实现又能通过不同版本差异观察评估函数与性能优化的演进是一份兼具教学与参考价值的棋类AI入门素材。 如果你只知道围棋、国际象棋那可能低估了一款规则只要两句话就能说清、却在AI领域至今让人挠头的棋类亚马逊棋。我第一次在策略游戏论坛看到这个名字以为它只是国际象棋“皇后”的变体真正摆上10×10棋盘实测几局才发现它每回合“先走棋、再射箭”的双动结构直接改变了你评估局面的方式。这篇文章会把我整理亚马逊棋资料时踩过的坑、验证过的规则细节、练棋路径以及能直接上手的工具清单一并写出来给对抽象策略棋感兴趣的朋友省下不少自己翻零散帖子的时间。1. 我眼里的亚马逊棋规则只有两条麻烦却不少1.1 一个回合为什么必须“做两件事”亚马逊棋的规则压缩到极致就是两句话每回合先移动自己的一枚亚马逊棋子然后从这个棋子的新位置射出一支箭箭落下的格子永久变成障碍。棋盘是10×10双方各4枚棋子初始布置在己方底边的1、4、7、10列上。棋子走法与国际象棋皇后完全一致直线、横线、斜线距离不限但不能跨越任何棋子和已经射下的箭。把两句话放到一局对局里你会发现真正难的不是“移动”也不是“射箭”而是这两个动作必须连着做。移动时你在扩展自己的控制范围射箭时你又在永久缩小棋盘上可用的空间。每回合之后全局的空格只会减少不会增加。换句话说这盘棋本质上是一场对有限空间的瓜分游戏——你每走一手都在给自己的未来铺路也在给对手的未来砌墙。1.2 为什么“没吃过子”也能赢我见过不少新手的疑惑这棋是不是要把对方棋子吃掉才算赢完全不是。亚马逊棋没有吃子概念棋子从头到尾数量不变胜负只看谁先动不了。当一方所有4枚棋子都找不到任何合法的“移动射箭”组合时这一方立刻输掉。这里有个容易被忽略的细节判断“动不了”时不仅要看棋子能不能走到某个格子还要看走到那个格子之后能不能再找到一个方向射出一支箭。移动合法但射箭无路可走这手同样不成立。我第一次用软件对弈时就被这个判定坑过以为自己还有好几步可走实际上已经被逼到死角。所以训练时我强烈建议不要只用眼睛数空格最好借助能自动标出合法着法的工具先建立对“合法手”的直觉。2. 规则里的五个模糊地带先避开这些坑再看棋谱2.1 箭到底从哪射旧位置还是新位置这是网上中英文资料最容易打架的地方。亚马逊棋的标准规则是箭从棋子移动后的新位置射出不是从移动前的位置。很多人因为先看过某个不严谨的翻译帖导致整盘棋的封锁方向完全反了。你在自己摆棋时先走一步到目标位再从新位置朝外面射箭就对了。这个细节看起来小但对攻防方向影响极大。如果箭从旧位置射出那你相当于“走一步、封住原来的窝”等于自断退路而从新位置射出则是“走一步、再向前方封一道门”核心目的是用棋子的机动性换取更前端的控制。2.2 移动路径上能不能“飞过去”不能。很多从跳棋转过来的人默认棋子可以跳跃但亚马逊棋的移动路径要求全程畅通不能穿越自己或对方的棋子也不能穿越任何箭矢。箭矢本身是永久障碍后期棋盘越来越挤一枚棋子被围住后可能连一个方向都走不出去这就是“困毙”的前兆。2.3 射箭能不能射到对手棋子所在格不能。箭矢格子不能是任何棋子所在格也不能穿越棋子或已有箭矢。箭可以紧贴着棋子落下但绝不能落在棋子头上。反过来说你可以在对手棋子旁边落箭直接把它的出路一封这种“贴身封堵”是残局里最常见的制胜手段。2.4 能不能只移棋不射箭或者只射箭不移棋标准对局不允许。每一回合必须“移动”和“射箭”各执行且只能执行一次缺一不可。任何跳过射箭的操作都会让棋盘空间不减导致游戏可能无限循环所以规则强制你每一步都消耗一格空间。这也意味着你每次移动时都必须提前想好这个新位置射箭是否还有合适的落点。我在带朋友入门时常用一个类比你每回合相当于“搬家”加“封路”。搬家是为了占据更好的位置封路是为了限制对方但每次封路也会让自己未来的移动空间少一格。真正的高手不是走得快而是算得准懂得每封锁一格能换回多少价值。2.5 把对方一枚棋子围死就赢了吗不是。胜负判定看的是全部4枚棋子的总机动性。哪怕你围死了对手3枚只要还有1枚能走出合法的一手对局就继续。所以中后期经常出现“双方各自在被分割的孤岛里打转”谁也不愿意先在局部耗尽空间。这种多区域并存的局面让亚马逊棋比很多棋类更考验全局调度能力。模糊点标准答案为什么关键箭从哪射移动后的新位置决定封锁方向能否跳跃不能路径必须畅通棋子会被“困死”箭能否落在棋子上不能贴身封堵只封路径不踩子能否跳过射箭不能强制消耗空间围死一枚是否获胜否要全部动不了残局常多区域并行3. 从乱下到会下我验证过的一套三阶段练法3.1 阶段一别背开局先下十盘“自由棋”很多抽象棋爱好者有个习惯上手先找开局谱。亚马逊棋我建议反着来先不碰任何理论直接在平台或棋盘上自对弈十盘。这个阶段的目标不是赢而是感受“每回合少一格”带来的压迫感。你会发现前期空间很大时随手走都不会立刻出问题但到了终局前面任何一步浪费空间的棋都会变成债。我陪新手练棋时要求他们只记一件事每回合结束后对比自己和对手的有效空格数量。这个数字会像温度计一样告诉你局面走势。下三五盘之后再回头看规则感受会完全不同——你不再觉得规则啰嗦而是能看出每条规则都在逼你权衡眼前利益和长远空间。3.2 阶段二开局和定式的核心不是抢中心网上能找到的亚马逊棋开局资料不多但零零散散提到的一些套路都指向同一个原则前几步的核心不是占领中心格子本身而是让自己的4枚棋子之间保持连接通道。道理很简单终局阶段你想要围住别人自己的棋子之间必须先形成一道“活墙”如果棋子之间被箭矢或对方棋子切断联系很容易被逐个击破。一个我实测有效的开局思路第一手把边线棋子朝棋盘中心方向推两至三格同时用箭封住对手从同侧渗透的线路方向不要盲目朝中腹乱射而是封在对方棋子前进的咽喉上。这样看似保守但能保证你的棋子未来有至少两个方向的出口。等第二、第三手再逐步衔接形成一片连续控制区。3.3 阶段三残局训练用“一步一数”法这是我认为最涨棋的阶段。残局时空间已经碎片化盘面可能分割成三四块独立区域每块区域里双方各有一两枚棋子。此时不要凭感觉走我习惯用“一步一数”法数清楚当前每个小区域里自己和对方还能各走多少手。具体操作是把每个连通空域看作一个独立的小棋盘分别估算“如果我先动手对方最优应对之后我还能走几步”。这个方法听起来笨但练上几十盘后你会对“先手价值”异常敏感。很多看似复杂的残局核心其实就是一道加法题谁在某个区域里先耗尽空间谁就输掉那里。4. 中盘的真正胜负手空间连接与封锁节奏4.1 把“机动值”当成棋盘上的比分中盘阶段我不会只盯着具体棋子的位置而是会估算所谓的“机动值”——也就是每个棋子当前位置所有合法落点的数量之和。亚马逊棋没有一个可以直接量化的“子力价值”因为棋子的价值完全取决于它还能走到多少格子而这些格子又能通向哪些区域。一盘棋走到中盘时双方机动值的差距通常不会特别夸张真正的变化在于机动值的分布。你可以用工具或自己做个小统计双方各4枚棋子中有多少枚仍然保持了多方向出口又有多少枚实际上已经被压缩在狭窄通道里。被压缩的一方哪怕总数没少太多后续每一步的主动权都会不断流失。4.2 建立连续的“墙”而不是打满补丁中盘最常见的失误是把箭射得零零散散这里封一下、那里堵一下却没有形成连续的封锁面。单个箭点的作用是有限的对手完全可以绕行但两枚棋子之间如果形成连续的箭头走线就像围棋里的墙一样能够把棋盘切成两块。我在实战中总结的经验是落箭之前看一眼目标格周围有没有己方棋子或其他箭矢形成的“骨架”。如果这枚箭能接上已有骨架哪怕暂时阻断不了太多路线也要优先考虑如果它只是孤零零卡在中腹除非有明确围困目标否则大概率是在浪费空间。终局想赢基本靠的是自己提前搭好的墙而不是靠对手失误送给你机会。4.3 有时候“不封”比“封”更可怕新手容易陷入一种误区能封就封看到对手棋子就贴上去射箭。但对手也有4枚棋子你把所有箭都用在围堵一枚棋子上其他区域的3枚就可能“偷跑”等到你发现时多条出口已经被它们占住了。中盘更有效的策略是牵制用一枚棋子的推进去压迫对方逼它调整路线而不是急于用箭锁死它的去向。换个说法亚马逊棋的节奏很像双方同时在盘面上“修路”和“拆路”。你每封住对方一个方向自己也在消耗一个空格。所以封路的优先级必须动态调整优先封那些连接多个区域的枢纽格那些只影响局部一两步的点可以暂时放着让对手自己浪费步数去处理。5. 引擎为什么难缠状态空间、分支因子和一个能跑的评估函数5.1 比国际象棋更高的分支因子你可能好奇规则这么简单的棋为什么没有出现一个像Stockfish那样“碾压人类”的著名引擎核心原因是它的状态空间实在太大。国际象棋中盘平均分支因子大约在35左右而亚马逊棋每回合包含“移动”和“射箭”两个连续动作平均分支因子可以超过300甚至更高。搜索树一旦加深几层节点数量就会爆炸式增长评估函数的误差也会被放大。这也是为什么亚马逊棋引擎的实际水平远没有达到完美许多局面下人类高手依然能和强引擎打得有来有回。对我这种爱好者来说这是个好消息哪怕你不想深入算法只靠经验和棋理也仍然有和程序对抗的乐趣。5.2 一个基础评估函数至少要看什么如果你想自己写一个简单的亚马逊棋AI评估函数不需要一开始就做得很复杂。我建议从三个指标开始双方棋子总机动值之差、双方控制区域面积之差、棋子的连通性。机动值好理解就是所有棋子合法落点数量区域面积可以简化为“每枚棋子在笛卡尔方向上能到达的最大延伸距离”连通性则看己方棋子之间是否存在畅通的路径如果被切断要扣分。下面放一个极简的Python示例只做机动值统计便于你理解评估函数的大致结构def mobility_score(board, player): total 0 for pos in board.pieces[player]: total len(valid_moves_from(pos, board)) return total def evaluate(board): return mobility_score(board, white) - mobility_score(board, black)实际可用版本还需要加入移动后射箭枚举但核心思想就是这样局面越开放、选择越多价值越高。等到你能准确计算机动值时再把封锁墙长度、中心控制权这些特征加进去引擎水平会提升不少。5.3 研究引擎和平台建议如果你对源码感兴趣可以搜索开源项目“FreeAmazon”它以及一系列衍生引擎常用于亚马逊棋AI研究。它们大多把搜索框架和评估函数分开适合作为入门模板。建议不要直接拿来对弈而是先跑通随机对局观察引擎的走子偏好再逐步修改参数这样你对算法的理解会比单纯读论文快得多。6. “附带资料”全清单平台、引擎、装备与我的复盘习惯6.1 线上对弈和观战平台想快速积累实战经验直接上在线对弈平台是最方便的。IGGameCenter和BrainKing是比较经典的选择它们都支持亚马逊棋既有即时对局也有人机模式。我个人偏好先在平台上和人机下十几盘熟悉操作后再开真人局因为真人局思考时间通常较长新手一上来容易紧张反而影响判断。这些平台的界面通常自带“合法着法提示”功能。前期我建议打开提示不是让你照着走而是让你直观理解哪些位置是当前意义上的好选择。等你对路径判断熟练后再关掉提示强行用脑子算。6.2 线下装备一副棋盘加两种颜色的小物件就够了线下找人面对面对弈亚马逊棋装备非常简单一张10×10棋盘、两色各4枚棋子再加两色标记物用来表示箭矢。很多家庭都有现成的围棋或五子棋棋盘直接借用即可棋子可以用硬币或纽扣代替箭矢则用不同颜色的小纸片或塑料片。我的建议是箭矢标记物最好比棋子的尺寸小一圈否则棋盘很快会显得拥挤、看错。如果你打算长期练可以买一包双面彩色圆片颜色选和棋子反差大的比如黑色棋子配橙色箭点、白色棋子配蓝色箭点复盘时一眼就能分辨。6.3 我的复盘习惯比分不如看“封堵手数”每次对局结束后我不急着看输赢而是会做一件事把双方落下的每一个箭点标上序号然后重新过一遍整个棋局重点看中盘阶段哪几支箭真正起到了阻断作用哪几支纯属浪费。这个习惯帮我找出了不少“自我感觉封得很好、实际毫无用处”的棋。复盘时我还会特别关注自己“从第几手开始被动”。很多时候输棋并不是最后那一步走错而是中盘某一步为了封对手一个无关紧要的方向把自己的连接线切断了。找到这个转折点比记住一套赢棋套路更值钱。你可以把这些心得记在笔记里下次开新局之前翻一翻很容易避开同样的坑。最后分享一个我私藏的小技巧残局数手数时把每个被分割的空域想象成一个“袋子”一旦发现自己的棋子被袋口封住不要恋战果断放弃那个区域把剩余空间转化成其他区域的机动性。这个习惯帮我赢下了不少看起来要输的残局。祝你也早日体会到那种“一箭封喉”的快感。本文还有配套的精品资源点击获取