象棋 Learn Xiangqi

重复局面与长将

每个国际象棋棋手都会栽一次的那条规则

在国际象棋里,没完没了地将军是劣势一方的救命稻草:那是重复局面作和,是一条活路。在象棋里,一直将军的那一方判负。就这一处颠倒,决定了大量的棋局;它也是一个国际象棋棋手第一次认真下象棋时,从优势局面输掉的最常见方式。本站是判这条规则的。

一、规则本身

同一个局面第三次出现时,这盘棋就结束了。至于是什么结果,取决于重复的那一圈里发生了什么:

所以责任落在进攻方身上。一个除了将军之外无法取得进展的人,不被允许就这样把棋局绑架下去——要么变着,要么认输。而防守方把将在两个格子之间挪来挪去,一点毛病也没有。

二、什么叫「同一个局面」

棋子摆法相同,而且轮到走棋的是同一方。后面这半句要紧:看上去一模一样、但轮到对方走的盘面,是另一个局面,不计入那三次。这也是为什么一次重复至少要四步才凑得出来,而不是两步——两边都得回到各自的摆法,并且轮到自己走。

除此之外什么都不算数。棋子是绕哪条路回来的、这盘棋已经走了多少步、双方各自打的什么主意,一概无关。

三、一步闲着就改判

这里开始变得微妙,值得弄懂而不是背下来。「每一步都将军」是就整整一圈来衡量的。如果进攻方在这一圈里插进一步不是将军的棋——调整一下位置、下一个不是将军的威胁、什么都行——同时仍然回到同一个局面,那这一圈就不再是全将军了,结果从判负变成和棋。

这一点对两边都成立,也是实战里真正用得上的结论。如果你是重复的那一方,宁可和也不想输,那圈里走一步闲着就够了。如果你是被长将的一方,宁可赢也不想和,那你需要对手没有任何一步闲着能同时维持这个重复。

四、只算这一圈,不算整盘棋

这一圈是从被重复局面倒数第三次出现的地方算起的——不是从开局算起。在重复开始之前很久走过的一步闲着,救不了任何人:它在圈外,而被审判的只有这一圈。

正是这个细节让这条规则可以被程序实现,也正是本站引擎从前弄错过的地方。现在覆盖它的测试断言的是整条状态时间线,而不是最后一个状态——因为一个晚判四步的结论,或者从错误的区间里读出来的结论,如果你只看结尾,和正确的结论长得一模一样。

五、本站判什么,不判什么

这里的引擎会按上面的规则自动判定长将重复作和,不需要谁来申请。触发的时候,你会看到棋局以长将一方判负告终。

它没有实现长捉,这是一处真实的缺口,而不是简化。正式比赛规则同样禁止在不将军的情况下没完没了地捉一个无根子,处理方式也差不多——捉的一方判负。但要判定什么算「捉」,需要判断哪个子受到威胁、它有没有根、这个威胁是不是真的,这比长将所需要的机器多得多。在本站,一次长捉会就这么重复成和棋;在棋会或者正式比赛里不会,所以别把这个习惯从这块棋盘上带走。

六、落到实战

由此有三件实际的事,比规则条文本身更值钱:

下一局,触发的时候棋盘会替你判:重复作和显示重复局面,判和,长将显示长将加上胜方。但在这一圈成形的过程中,没有任何提示,所以上一节里那点数数的功夫还得你自己来。接下来可以看残局——国际象棋到象棋的另一处大颠倒就在那里:困毙在这里算输,不算和。