实验室 · 弈

象棋

九路十线,中隔一条楚河汉界。车走直、马走日、象飞田、炮隔山,兵过河才敢横着走。可与电脑对弈,也可两人围着一块屏幕厮杀。

红方走棋 点选己方棋子,再点落点
红方俘获
黑方俘获
点一枚己方棋子,棋盘上会浮出它所有的合法落点:空点是淡墨圆点,可吃子的点用朱砂方框圈住。再点一下落点即走子。
会让自己被将的着法不会出现在提示里——这不是仁慈,是规则。
此处未设长将、长捉与重复局面的判负条款,残局若见机器来回晃子,径自换个走法即可。

规 则 速 记

七种棋子,七套脾气。
 横竖任意格数,路上不得有子。全盘最凶的一枚,开局值约九个兵。
 走「日」字。若它要迈出的那一步正对面有子挡着,叫蹩马腿,此路不通——挡的是横竖那一格,不是斜角。
相 / 象 走「田」字,田心有子叫塞象眼,走不了。相不过河,只能在本方五路之内当守门人。
仕 / 士 只在九宫格内斜着走一步,寸步不离主帅左右。
帅 / 将 九宫内横竖一步。两个主帅不得在同一纵线上直接照面(中间无子),谓之白脸将,走成即为违规,此程序不予放行。
 不吃子时走法同车;吃子必须隔且只隔一个棋子,这枚垫脚的子叫「炮架」,敌我皆可当架。
兵 / 卒 未过河只能向前一步;过河之后可前可左右,唯独不能回头。这是全盘最讲究的一枚。
胜负 被将且无着可解,是将死;轮到走棋却无一步合法着法,是困毙——按中国象棋规则,困毙同样判负。

机 器 怎 么 想

它不会下棋,它只会算账。

一、先把局面折算成一个数

子力是底账:车九、炮四点五、马四、仕相各二、兵一(过河后翻倍),帅无价。再叠上一张位置表——同样一匹马,卧在窝里和踩在中腹,分数差着一截;兵越过河越值钱。最后加上机动性(双方合法着法数之差)与将军项:被将扣分,将军加分。

二、alpha-beta 剪枝

把三到四层的着法铺成一棵树,交替假设「我挑最大、你挑最小」。一旦某个分支已经坏到对手绝不会让它发生,整枝砍掉不再算。着法按「吃大子优先、被小子吃优先」排序,剪得更狠。

三、静态搜索收尾

算到底层若刚好停在一串换子中间,评分会失真。所以叶子节点再往下只算吃子着法,直到局面安静为止,避免「看见白吃一个车就欢天喜地、下一步被反吃」的水平线效应。

四、时间与节点闸门

逐层加深,每层算完才敢采用结果。超过约一秒二或节点数超限就立即收手,用上一层已算完的着法。所以它在残局会显得比开局聪明——子少了,同样的时间能看得更深。