棋种小传
它从哪里来,为什么长成今天这个样子。
起源中国 · 现代形制定型于北宋末至南宋(11–12 世纪)
「象棋」这个名字比这盘棋更老
先秦文献里就出现过「象棋」二字,但那多半指别的博戏,不是今天的棋。真正接近现代形制的中国象棋——九宫、河界、炮——大致在北宋末到南宋之间定型。北宋司马光曾设计过一种「七国象戏」,说明当时棋类改造相当活跃;而现存最早的完整棋谱与规则记述,要到南宋末至元初的《事林广记》。
炮:一枚有时代烙印的棋子
整个恰图兰卡棋族里,只有中国象棋这一支长出了「炮」。它的走法也独一无二:不吃子时同车,吃子时必须隔一枚棋。这个「隔物投射」的直觉,一般认为对应的是抛石机时代的攻城器械——「砲」字本从石,火药普及之后才写作「炮」。这属于通说而非定论,但棋子名称的字形变化确实与那段技术史同步。
把防守钉死,让进攻飞起来
士不出宫、象不过河、将困九宫——这三条限制看似削弱了棋力,实际效果恰恰相反:它让防守子永久绑定在一小块区域,进攻子却拥有全盘机动。于是中国象棋的节奏远快于国际象棋,十几步定型是常事。棋子放在交叉点而非格内、棋盘中间横着一条空白河界,也都在放大车与炮的长驱能力。
为什么规则里有一大段在讲「重复」
攻杀太快带来一个副作用:双方都能用连续将军或连续捉子把局面拖住。中国象棋因此发展出全世界棋类里最细致的循环裁决——长将判负、长捉判负,还要区分什么算「捉」、什么算「闲」。别的棋种把重复局面一律判和,中国象棋偏要分出对错,这是它把「进攻责任」写进规则的方式。
- 《橘中秘》(明)与《梅花谱》(清)是流传最广的两部古谱,前者主攻当头炮,后者主张屏风马应对,两者的分歧至今仍是开局主线。
- 「楚河汉界」是后世给河界起的名字,取自楚汉相争的典故,并不说明这盘棋起源于那个年代。
- 中国象棋的引擎发展比围棋更早成熟:以 Pikafish 为代表的现代程序已远超顶尖人类棋手。
完整规则
先把一回合能做什么、怎样获胜弄清楚。
- 棋盘
- 9 路 10 行交叉点
- 先手
- 红方
- 胜负条件把对方的将(帅)将死或困毙即获胜。将死指它正被将军而无法解将;困毙指轮到对方走棋时,它的全部棋子一步合法着法都走不出来。两种情况都判对方负——这一点和国际象棋不同,那里困毙(逼和)算和棋。
- 行棋方式红方先行,之后双方轮流走一手,每手必须走一枚棋子,不能停着不走。棋子走在交叉点上,落点有敌方棋子就把它吃掉移出棋盘,落点有己方棋子则不能走。吃子不是强制的。
- 将、帅只能在九宫(三路乘三行)内沿横竖走一格,不能斜走,也不能走出九宫。双方将帅不能在同一直线上直接照面,中间至少要隔一枚棋;任何走出照面局面的着法都不合法,界面不会给出这样的落点。
- 士只能在九宫内斜走一格,全盘只有五个可停点。相、象走田字,田字中心的象眼被任何一方的棋子占住就不能走,并且不能过河,因此双方各自只有七个象位。
- 马走日字,先直后斜。起步方向紧邻的那一格是马腿,被任何棋子占住就不能跳;马腿不分敌我,自己的棋一样会别住自己的马。
- 车沿横竖直线走任意格数,路上不能有任何棋子。炮不吃子时和车完全一样;吃子时必须在炮和目标之间恰好隔一枚棋作炮架,隔零枚或两枚以上都不成立,炮架是哪一方的棋都可以。
- 兵、卒过河前每次只能向前一格;过河后可以向前或者左右横走一格,任何时候都不能后退。走到对方底线的兵只剩下左右横走两种选择,中国象棋没有升变,它也不会被移出棋盘。
- 任何让自己的将帅走完之后仍然处在被攻击状态、或者形成将帅照面的着法都不合法,界面不会给出这样的落点。这条限制凌驾于其它一切规则之上。
- 被将军的一方必须解将,方法只有三种:吃掉正在将军的棋、用棋垫在中间挡住、或者把将帅移到不被攻击的点上。三种都做不到就是被将死,对局立即结束。
第一次这样下
按这个顺序思考,很快就能完成一盘。
- 用当头炮起手最容易上手第一手炮二平五把炮摆到中路瞄住对方中卒,第二手马二进三保住自己的中兵并托住炮,第三手车一平二让右车走到炮原来的位置成为直车。三步之后中路、马、车都已经投入战斗。
- 面对当头炮,最稳的应法是屏风马:马8进7、马2进3 两只马并排护住中卒,再车9平8 出直车顶住对方的直车。如果只顾出车不补马,中卒一旦被中炮吃掉,整个阵形会立刻塌陷。
- 不想背开局变化,可以选择飞相局(相三进五)、仙人指路(兵七进一)或者起马局(马二进三)。这三种开局都不急于架炮,先把防守和出子搭好,再根据对方的应法决定攻击方向。
- 每走一步之前做三项固定检查对方哪只车与我方将帅同在一条直线、中间只隔一枚随时能走开的棋;对方的炮和我方将帅之间是不是恰好有一枚棋,那枚棋一旦离开就是将军;我方的马腿和象眼有没有被自己的棋堵住。
- 记住兑子的大致价值一只车约等于两只马或两门炮,炮和马接近(开局炮略强,残局马略强),过河兵的价值远高于未过河的兵,士象是将帅的护甲,缺士怕车、缺象怕炮。引擎在判断长捉目标时用的也是类似的比价:车 900、炮 450、马 400、士象 200、兵卒 100。
- 先学会四种基本杀法再谈进攻双车错(两只车轮流沉底将军)、马后炮(马先控制住将帅的退路,炮在后面照将)、铁门栓(中炮镇住中路,车沉底把士堵死)和白脸将(挪开中间的挡子,让己方将帅照面参与杀棋)。
实战策略
从会走升级到有计划地走。
- 开局阶段的核心目标是让车尽快离开原位。被自己的马、炮、仕相长期堵在角上的车等于少一个子;出车之前先想清楚它要占哪条直线或者哪一行。
- 炮的威力来自炮架。当头炮之所以强,是因为对方的中卒本身就是现成的炮架;同样的道理,有时留着对方一枚棋不吃,比吃掉它更有价值。
- 马要走到有兵保护的前沿点才安全,边马和被别住腿的马几乎没有作用。计划用马进攻之前,先算清它未来两步的落点是不是都有腿可走。
- 进攻必须多子协同。一只车单独沉底通常会被士象和马逐步消化,车、炮、马之中至少两种子形成连续威胁,才可能形成真正的杀势。
- 领先子力时主动兑掉对方有反击力的车和炮,同时尽量保住自己的士象;子力简化之后,多一兵一马的优势才好转化成胜势。
- 落后时相反,不要继续简化。把棋子集中到一侧制造复杂局面,或者争取交换到单车难破士象全这类公认的和棋残局。
- 残局先限制再进攻把对方的将帅活动范围压到最小,再计算杀法,不要无目的地连续将军——那既浪费步数,也可能触发长将判负。
胜负与特殊规则
容易漏掉、但会直接改变结果的细节。
- 将帅被将军且吃、挡、走三种解将方法都用不了时被将死,判负。
- 困毙同样判负轮到一方走棋时,它的全部棋子一步合法着法都走不出来(例如剩下的子都被别住,或者一动就形成将帅照面),即使没有被将军也算输。这一点和国际象棋的逼和判和完全不同。
- 重复局面的判定在当前局面(含轮到谁走)第三次出现时触发。程序取最近两次重复之间的这一段着法,逐方检查这段里是不是每一步都在做同一件违规的事,再决定判负还是和棋。
- 长将判负在这段着法里,某一方走的每一步都在将军,判该方负。
- 长捉判负某一方在这段里每一步都没有将军,而且每一步都在捉同一枚敌方棋子(程序会跟随这枚棋的移动继续追踪),判该方负。
- 「捉」在实现里有严格定义发起捉的必须是刚刚走动的那一枚棋,而且不能是将帅或兵卒——将帅和兵卒的攻击一律算闲着;被捉的不能是将帅(那属于将军),也不能是尚未过河的兵卒;这一步必须制造出新的威胁,走子之前已经被己方其他棋子捉住的目标不算;而且目标必须是无根子,也就是吃掉它之后对方没有合法的反吃。因此长拦、长兑,以及反复捉一枚有根子,都算闲着,不判负。
- 一步同时捉住两枚以上的棋时,程序按车 900、炮 450、马 400、士象 200、兵卒 100 的价值取最高的一枚作为长捉的对象,避免目标在循环里漂移导致判定失效。
- 双方都违规,或者双方都没有违规,都按和棋处理。需要注意的是,一将一捉这类混合循环在本实现里不构成单方违规,会直接判和。
- AI 同样受这套规则约束主引擎选出的着法如果会让它自己构成长将或长捉判负,页面会改用规则感知的本地搜索重新挑一步,并在提示里注明改选的原因。
- 本实现没有自然限着(长时间无吃子)判和这一条,只有上面的重复局面判定会导致和棋或判负。
常见失误
新手最容易掉进去的几个坑。
- 移开将帅正前方唯一的挡子,形成双方将帅照面的非法局面。界面会拒绝这一步,但计划里必须提前算到,否则原本想好的着法会突然走不了。
- 把炮当车使用炮只有在不吃子时才和车一样,吃子必须隔恰好一枚炮架,隔两枚或者贴着敌子都不能吃。
- 只看到马的落点,没有检查马腿;自己的棋照样会别住自己的马。
- 以为对方长将一定判负就放心不管。只要在同一段循环里自己也存在违规,或者对方走的是一将一捉这类混合循环,结果都是和棋。
- 用兵、卒或者将帅去反复驱赶对方的棋子,指望对方被判长捉。这两种棋的攻击在规则里算闲着,这样重复下去只会走向和棋。
- 把对方逼到无子可动只当成僵局,忘了困毙在中国象棋里直接判负;残局里应该主动收紧对方的活动空间,而不是急着吃子。
