它在传统中的位置
象棋排局是更古老的传统。已知最早的排局“二龙出海”,见于南宋类书《事林广记》,年代定为1266年。古典棋谱随后出现:1570年收局550则的《适情雅趣》,1632年的《橘中秘》,再到清代各谱,其中1801年的《竹香斋象戏谱》收有“七星聚会”等著名江湖排局(棋谱简史)。
贯穿其中的是固定的目标。每道题都标明结果,胜或和,解题者替败方走出最顽强的应着。明代的题几乎都是胜局,清代的多为和局。这个传统靠一代代变换局面发展,而不是变换对解题者的要求。
西方排局走了另一条路:保留棋盘,改变目标。马克斯·朗格于1854年发表了第一道合作杀,白方先走,且不止一解;萨姆·劳埃德1860年的题首次让黑方先走,A. 巴尔贝1861年的题首次只有唯一解(该体裁的历史)。自杀题、连续着法题等也都是这样来的。如今合作杀是国际棋联排局年鉴(FIDE Album,官方的优秀排局选集)中最大的单一类别:2010至2012年卷9,218则中占2,539则(FIDE)。
将棋也从国际象棋那里借来了这个想法。将棋排局家称之为ばか詰(bakazume),即合作诘将:双方合作,用最少的步数将死守方的王;与将棋的普通诘将棋一样,攻方先走(国际象棋里通常是被杀的一方先走),盘上一般没有攻方的王,守方持有所有不在盘上的棋子。以此为目标的变体诘将棋到1960年代已有发表;1970年Kato Tetsu发表了一道长达163手的作品,1971年《詰将棋パラダイス》杂志开始定期刊登这类题(日文维基百科)。
日文维基百科这一页的例子说明了合作目标带来的变化。把香车打在1路上离王更远的地方,看起来同样可行,但这样一来,持有所有余子的守方就能在中间打入一子。普通诘将棋不计较一个只会被直接吃掉的垫子;合作诘则要计算它,所以只有打在1d才能三步成杀。我们对这个局面的搜索结果一致:它是唯一的三步合作杀,且不存在一步杀。
我们还没有找到比我们更早的象棋合作杀。用国际象棋排局家对合作杀的各种叫法做中文网络搜索,找到的是国际象棋题和普通的象棋杀法,从来没有合作的象棋题;古典棋谱要求的也都是胜或和。如果你知道更早的一道,请告诉我们。
如何编题
生成器是这项工作中天真的一半,这一点值得直说。局面生成器盲目地摆出图形:要么枚举少数几子的所有摆法,要么按设定双方子力的配置随机摆出阵容。求解器遍历双方各两步的所有合作走法,黑方先走,只保留恰好一路成杀的图形。生成器本身完全不知道什么是好题:它不瞄准任何主题,不偏好静着胜过吃子,也没有经济性的概念。给黑方整支军队、红方一两个子的配置,产出了大部分值得一看的题。
for each diagram the position maker deals:
# every placement, or random armies from a profile
if the diagram is illegal: discard
lines = every Black, Red, Black, Red line that mates
if len(lines) != 1: discard # sound: exactly one
keep (diagram, lines[0]) # 1,470 kept
# final picture: the mater and its square, the
# general's square, what covers each escape
group the kept problems by their final picture
keep one per group # 186
re-prove each one, counting a general with no legal
move as mated, and requiring no mate in one
# 164 stand这只是起点,上面还有很大的空间。排局家从一个构思出发,围绕它搭建局面,搜索也可以这样做。它可以从想要的杀形出发,比如炮隔着黑方的炮架将杀,再倒推出两步之前的局面,而不是一直摆到碰上一道为止。它可以拿一道好题,一次改动一个子,保留那些让正确的第一步更难看出、或让红方闲置子力更少的改动。它可以给解题者的感受打分:黑方有多少个第一步看起来和正解一样自然,关键着是不是一步静着。或者它可以完全不靠随机摆局。国际象棋排局家现在有了穷举的合作杀表,五子以内已经完整,列出给定子力下所有无误的合作杀,搜索只剩挑选;我们没有为象棋做这样的表。这些方法每一种都能找到我们的方法找不到的题。
结果
搜索找到1,470道无误的合作杀。大多数是同一个杀形从不同的布局得到,往往只是一个旁观的子挪了一格,所以我们按最终杀形分组。剩下186种不同的杀法。复核又去掉了22道,原因见下文,留下164道。
164道中,39道是纯杀,即被杀一方将周围没有一格被重复控制;19道是纯正杀:既是纯杀,盘上每个红子又都在发挥作用。
| 成杀的子 | 题数 |
|---|---|
| 卒 | 58 |
| 车 | 50 |
| 马 | 28 |
| 炮 | 28 |
最好的十道
十道题,各有一个主题。全部164道都在这个研习里,这十道在前,其余按排名排列。每一道都属于我们搜索的那一块:黑、红、黑、红,红方第二步成杀。
红方只有帅和一兵,对黑方七子,其中有一车和双士。先找出孤兵能在哪一格成杀,再想想哪个黑子得去堵住自己的将。
红方有帅和一匹已在黑方阵中的马;黑方有十二子。黑方有45种合法的第一步,只有一种能导向杀局。
一门红炮对黑方十五子。炮没有炮架就不能将军,所以要看哪个黑子能当炮架。
一辆红车对十二子,黑方底线已经空了一些。问题是黑将旁边哪些格子需要填上,用什么子填。
又是帅和一马对十二子,这次马在h8,靠近角上的一辆黑车。这匹马要用掉红方的两步。
十道中子力最多的一局:三个红兵深入黑方半边,对黑方十四子。
六个子:红方帅、炮、兵,黑方将、炮、马。看看e5的红炮在将军之前需要什么。
黑将已经离开底线,红兵和红炮叠在g路上。红方这里的最后一步一着两用。
开阔的棋盘上黑方有双车、一马、一炮,第一步有55种合法走法。红方只有一马。
帅和一兵对十二子,兵已在黑方九宫旁的f8。黑方得用自己的子把笼子合上。
我们学到了什么
象棋决定什么才算无误。将帅无子可走即判负,所以合作杀也可以在被杀一方没有被将军、只是无棋可走时结束。我们的编题程序只检测了将死。按真正的规则复核后,186道中有22道另有程序没看到的路线,从3路到64路不等,其中两道一步就能杀。从国际象棋移植来的无误检验,也把国际象棋对“终局”的理解一并带了过来。
九宫让这些悬殊的题成为可能。象棋的将帅从不离开九个点的九宫,最多只有四个点可走,所以黑方走几步就能把它围死。这与搜索的结果相符:黑方整支军队对红方一两个子的配置产出了大部分好题,因为几乎所有的搭建都由黑方完成,红方只需赶到。国际象棋的王拥有整个棋盘和最多八个格子,那里的合作杀要花多得多的步数把这些格子一一封掉。
炮是国际象棋不可能有的主题。炮隔一子将军,而在合作杀里被杀一方是合作的,所以黑方可以送上炮架。164道中有19道借黑方的炮架成杀。将帅不能对面的规则又添了一种:红帅可以从自己的九宫控制格子,比如第七道题。
找到无误的题是容易的部分。搜索找到1,470道无误的合作杀,大多数是同一个杀形从不同的布局得到:按最终杀形分组后只有186种。是否无误是一个求解器能检验的是非题。一道题值不值得摆给朋友看则不是,而这个流程里没有任何东西能衡量它。这正是下一个生成器要填补的空白。
还有什么可找
我们只搜索了这个体裁的一角,其余都还空着。首先是更长的合作杀。我们的搜索几乎没找到无误的三步合作杀:多一步,双方就有多得多的方法走到同一个杀形,所以生成器得直接瞄准唯一路线,而不是先摆后筛。无误的象棋合作杀最长能有多长:十步,二十步,一百步?搜索能否证明一道长题是同类中最短的,或者它的路线是唯一的?
更多看似不可能的题:最弱的红方子力对最多的黑子,一个孤兵将死整支军队。还有这个体裁的其他形式:红方先走,以及红方作为被杀的一方。这两种我们都还没有搜索。如果你找到一道,或者比我们的更长、更奇的,我们很想看看:发到论坛,或者写在你自己的博客上并告诉我们在哪里。
这一小块已经表明,象棋容得下合作杀,而且它们不是换了张棋盘的国际象棋题。让象棋成为象棋的那些规则,困毙判负、炮架、将帅对面,决定了哪些题无误,也决定了最好的题如何成杀。好题看起来不可能,因为红方几乎什么都没有。它之所以成立,是因为黑方的大军正是构成杀局的材料:墙、炮架、自己将周围被填满的格子。这就是这项工作背后的希望:把西方排局家发明的体裁搬到象棋棋盘上,找出它们在这里的美,并且终有一天找到一道好到让象棋棋手停下来、摆给朋友看的合作杀。