2005年6月我系第二批科技小组的项目正式确定为实现一款中国象棋对弈软件。基本功能包括人机对战、网络对战。我负责开发人机对战的引擎部分,也就是让计算机下棋。经过了暑假整整两个月的学习与实践,我终于初步完成了程序,虽然电脑的下棋水平实在不敢恭维,但好歹也是我心血所成,所以就苟且将其命名为scCChess1.0版本,整理一下发到blog上来。(本程序在8月底就完工了,之所以现在才贴上来是因为我本想在这个学期对它进行改善,力求让电脑的下棋水平再上一个层次之后再贴出来,免得众老鸟笑话。结果这个学期实在是比较忙,而且现在又找不到人做界面,我不得不转去给我的引擎做界面。唉,说来惭愧啊,小生对做界面至今仍未入门,当你看这篇blog时,说不定我正在痛苦的学着MFC……再加上其他一些乱七八糟的事恐怕年前是不会有空修改引擎了。所以干脆先贴了,以后若有大改再贴新的。如果有哪位朋友耐住性子、牺牲了宝贵时间看了小生的东西,还望多提宝贵意见。谢谢、谢谢……
好了,说了这么多废话现在转入正题。
程序的基本框架:
从程序的结构上讲,大体上可以将本程序划分为四大部分:
棋局表示、 着法生成、 搜索算法、 局面评估
程序的大概的思想是:
首先使用一个数据结构来描述棋局信息,对某一特定的棋局信息由着法生成器生成当前下棋方所有合法的着法并依次存入着法队列。然后通过搜索算法来逐一读取着法并调用局面评估函数对该着法所产生的后继局面进行评估打分,从中选出一个最有可能导致走棋方取胜的着法。在搜索的过程中还可以采用一些辅助手段来提高搜索的效率。其过程如下图所示:
在搜索算法上我采用了Alpha-Beta搜索。此外,为了提高搜索的效率,我还加进了历史启发以及归并排序等以辅助搜索。这些用的都是前人的东西。本程序最具创造性的地方在于局面评估部分(请允许我用“创造性”这个词,尽管我设计的算法可能很幼稚——从目前电脑的下棋水平来看我不得不这么说,但毕竟耗费了我好多脑细胞啊)。搜索算法和局面评估是整个程序的核心。其中局面评估对计算机的下棋水平起着至关重要的影响。也是今后我的程序想要提高机器“智能”所要着重改进的地方。呵呵,既然如此重要这个就放在最后再讲了。
程序项目的构成:
我为程序建了一个win32控制台项目,这意味着我的程序用了一个DOS的界面(在界面开发出来之前,我通过在DOS窗口中输入坐标、电脑反馈坐标的方式来和电脑下棋,以此测试我的引擎)。
我将各个模块分别写成头文件,最后再包进一个主的cpp文件。我知道这样似乎有点外行,但对像我一样的初学者来说这种方法简单易懂:)
整个项目包含如下文件:
scCChess.cpp
——程序主文件。负责游戏的开始。
scCChess.h
——主头文件。定义了初始化游戏、开始游戏等基本函数。
CChessDef.h
——象棋相关定义。包括棋子棋盘的表示,行棋的基本结构类型等定义。
CChessEvaluate.h
——局面评估。为某一特定局面进行评分。
CChessMove.h
——着法生成器。就当前局面生成某一方所有合法着法。
CChessSearch.h
——搜索部分。对着法队列进行搜索,求出最佳着法。
HistoryHeuristic.h
——历史启发。Alpha-Beta搜索之补充,以提高搜索效率。
SortMove.h
——着法排序。对着法按其历史得分进行降序排序,以提高搜索效率。
参考资料:
在写本程序时我参考学习了以下资料:
*《PC 游戏编程(人机博弈)》 作者:王小春 重庆大学出版社
* 象棋百科全书 ElephantBoard的主页 http://www.elephantbase.net/ 站长邮箱: webmaster@elephantbase.NET
*《Visual C++.NET 小游戏开发时尚编程百例》 作者:网冠科技 机械工业出版社
* 以及众多其它无名作者的源程序
它们对我最终能够顺利完成程序起了巨大的帮助作用。在此,谨向以上所列表示感谢!
此外,我还要感谢我们的指导老师——蒋德茂老师和陈宇老师,他们给了我们科技小组很大的支持和帮助。在此,也向两位老师表示感谢!
下面将陆续介绍程序各部分的实现……