我们已经见证了一个中国象棋程序的制作过程。用这个过程按部就班地演绎国际象棋,凭借当今的软件开发工具和硬件水平,或许就能打造出一个和“深蓝”一样聪明的程序。
但是,国际象棋毕竟比中国象棋复杂,要让一个国际象棋程序走出不是很糟的棋,以下问题是必须注意的。
8.1
特殊的规则
国际象棋的初学者都会被王车易位、吃过路兵、兵的升变这三个特殊的规则所困扰,电脑程序设计师也不例外。由于王车易位和吃过路兵的引入,描述一个国际象棋局面并不简单,它所包括的内容有:
(1) 棋盘上每个格子所放的棋子;
(2) 轮到哪方走;
(3) 是否永久丧失了王车易位的权利,这就包含了
4个布尔型变量,分别表示白方能否短易位和长易位,以及黑方能否短易位和长易位;
(4) 是否能吃过路兵,即对方上一步棋是否把兵挺了两格,并且要知道是哪个兵挺了两格。
以上
4点中,前两点与中国象棋没什么两样。
至于王车易位,执行一个走法的时候非常简单:一旦一方动了王,它就永远丧失了王车易位的权利。但撤消走法
(UndoMove)的时候,如何还原王车易位的权利呢?吃过路兵也存在同样的问题。
因此,描述一个国际象棋走法,也是相当复杂的:
(1) 走法的起始格和目标格
(跟中国象棋一样
);
(2) 吃掉的棋子
(跟中国象棋一样
);
(3) 是否王车易位:在执行和撤消这种走法时,王和车都必须移动;
(4) 是否永久丧失了王车易位的权利:撤消这种走法的时候,要还原这个权利;
(5) 是否吃过路兵:撤消这种走法的时候,被吃的兵所还原的位置与走法的目标格不同;
(6) 是否错过了吃过路兵的机会:撤消这种走法的时候,要还原这个机会。
8.2
局面评价函数
和中国象棋一样,国际象棋的子力价值同样是局面评价函数中最关键的因素,而且每个子的价值跟位置是相关的。但是,仅仅用固定的绝对位置往往无法取得很好的效果,随着局面的进展和兵形的变化,子力的位置价值会发生很大的变化。
因此,评价国际象棋的局面时,需要考虑的因素有很多:
(1) 子力的控制力:后、车、象等长兵器,辐射的格子越多,控制力就越强。另外,如果有其他棋子把它的辐射路线挡住,控制力就会打些折扣,如果是兵挡住了辐射路线则被认为辐射完全中断
(兵被认为是“死”的子,就好像棋盘的边界
),而对于马这样的短兵器,能踩到的格子越多,攻击性就越强,而踩到棋盘中央区域要比踩到棋盘边缘好很多;
(2) 王的位置:开中局阶段王在棋盘边缘比较有利,残局阶段王在棋盘中央比较有利,另外,优势一方要尽可能地让自己的王接近对方的王,这样才能使“车杀单王”等残局的行动有所方向;
(3) 兵的绝对位置:兵越接近底线分数约高,而中路的兵通常比边路的兵分数高;
(4) 兵形:兵形的评价内容实在丰富,这里只举一个最典型的例子:车在通路兵后面有较高的加分。
现在我们应该有足够信心去完成一个国际象棋程序了。只要掌握好以上几个要点,那么这个程序走出的棋应该不会太业余。