结对实验

链接:https://github.com/xiaojibibi/test/blob/master/xiangqi.txt   

象棋水平的发展是需要靠信息技术来推动的,国际象棋有两个很好的范例,一个是象棋棋谱编辑和对弈程序的公共平台——WinBoard平台,另一个是商业的国际象棋数据库和对弈软件——ChessBase,他们为国际象棋爱好者和研究者提供了极大的便利。国际象棋软件有着成功的商业运作,已发展成一种产业。然而,电脑在中国象棋上的运用还刚刚起步,尽管国内涌现出一大批中国象棋的专业网站和专业软件,但是由于缺乏必要的基础工作,电脑技术在中国象棋上的应用优势还无法体现出来。

在设计中国象棋软件过程中,国际象棋软件有很多值得借鉴的成功经验和优秀的思想。例如B. Moreland,微软(Microsoft)的程序设计师,业余从事国际象棋引擎Ferret的开发,他的一系列关于国际象棋程序设计的文章非常值得其他棋类程序设计人员借鉴。然而,中国象棋与国际象棋存在着很大的差异,因此国际象棋的某些成熟技术,无法直接应用于中国象棋,需要对其加以改进和创新。

本文针对中国象棋程序设计的一系列问题,总结出一些搜索引擎的设计方法,并给出java语言的实现

2.2程序的设计及实现

本系统主要有以下4个模块,每个模块对应一个程序包:

1engine:搜索引擎包,系统的核心部分。

2message:网络对战过程中各种消息及其传递机制的类实现包。

3main:主界面实现包。

4pieces:棋子及其相关类实现包。

现就各个包中的要点给与说明。

2.2.1 搜索引擎的实现(engine包)

(1) BitBoard.java:位棋盘的实现,见2.4节。

(2) CCEvalue.java:评价函数知识类。

本程序使用开源软件“梦入神蛋”的快速评价函数。该函数包含子力价值和棋子所在位置的奖励值。子力价值分别是:帅-0, - 40, -40, -88, -200, -96, -9。帅是无价的,用0表示。以马为例,位置的奖励值如下:

0, -3, 5, 4, 2, 2, 5, 4, 2, 2,

-3, 2, 4, 6,10,12,20,10, 8, 2,

2,  4, 6,10,13,11,12,11,15, 2,

0,  5, 7, 7,14,15,19,15, 9, 8,

2,-10, 4,10,15,16,12,11, 6, 2,

0,  5, 7, 7,14,15,19,15, 9, 8,

2,  4, 6,10,13,11,12,11,15, 2,

-3, 2, 4, 6,10,12,20,10, 8, 2,

0, -3, 5, 4, 2, 2, 5, 4, 2, 2  

上面的每行代表棋盘的一条纵线。其中,-10所在的位置是“窝心马”,所以要罚10分。

(3) ChessPosition.java:动态局面类

包含对局过程中的动态信息,主要实现的是2.4节的各类位棋盘和移子函数。

(4) MoveStruct.java:着法表示类。

(5) PreMove.java:伪合法着法生成模块,见4.1

(6) MoveSortStruct.java:合法着法的生成及其排序算法,见4.2

(7) SearchMove.java:搜索算法,实现如下功能:

1)主置换表及开局库

2)Alpha-Beta搜索算法

3)针对吃子着法的静态搜索算法

4)适应性空着裁剪算法:见5.5.2,根据不同情况来调整R值的做法,称为“适应性空着裁剪”(Adaptive Null-Move Pruning),它首先由Ernst Heinz发表在1999年的ICCA杂志上。其内容可以概括为:

a. 深度小于或等于6时,用R = 2的空着裁剪进行搜索

b. 深度大于8时,用R = 3; 

c. 深度是67时,如果每方棋子都大于或等于3,则用 R = 3,否则用 R = 2

5)带时间控制的迭代加深搜索算法:每次加深搜索都判断时间是否够用。

6)“将军”扩展(加深)搜索算法:当搜索到己方被“将”时,增加搜索的深度。

7)主要变例搜索算法

2.2.2 信息传输机制(message包)

在对弈过程中(主要是网络对弈)需要在对弈双方之间传输各类信息,抽象为各类消息。如时间规则的协定、各方的走子信息等。每方都有消息接收、消息处理和消息发送程序(OuterMsgReceiver、LocalMsgReceiverQzMessageHandlerMessageSender)。己方的MessageSender与对方的OuterMsgReceiver通过接口SrConnection连接。所有接收的消息放入消息队列QzMsgQueue中,等待消息处理进程QzMessageHandler来处理。所有的消息都封装在QzMessage类对象中,消息的类型通过消息的Header类型(以静态常量存放在MsgHeader类中)来区分。

2.2.3 棋子(pieces包)

Qizi.java包含棋子的信息,如棋子的(在棋盘上的)位置、图片、名称、类型、状态等。PiecesFactory.java以“工厂”模式提供根据棋子类型或其他信息生成相关Qizi对象的方法。

2.2.4 主控模块(main包)

实现了程序界面与消息传递、搜索引擎的集成。

(1) NewBoard.java:棋盘坐标系统及其界面的实现。

(2) CChessApp.java:主界面类,以内部类实现了QzMessageHandler接口、计时规则TimeRule接口以及事件的处理程序,根据需要生成其他的并发线程如消息接收、处理和发送,机器思考(启动搜索引擎),计时显示等。

(3) SetRuleDialog.java:设置规则的对话框。

(4) SetSysInfoDialog.java:设置系统的一些属性如对战模式、连接端口等。

(5) Translation.java:提供了一系列实用方法主要有:

1)FEN串与局面ChessPosition对象之间的转换

2)不同着法表示(见第一章)之间的转换。如“炮二平五”与“Ch2-e2”及“62.5C2.5“(C6代表炮)这几种表示法之间的转换

3)棋谱文件的读入和存储。

4)开局库的生成:将近年实战的棋谱文件(可能有几种格式)整理生成开局库。

这里的结对是指共同编程,两个人对着同一台电脑,对着同一段代码。这样交流首通过这次的结对编程,我倒是也学到了一点东西。首先就是概念上的纠正,原来先方便很多,两个人相互有什么新的想法都可以马上说出来然后交流和探讨,即使communicator和MSN再怎么方便还是没有面对面的交流更加便捷。其次就是大家都感受到的合作的效率问题,两双眼睛共同盯着一段code,两个脑袋共同分析着一个算法,错误更容易被发现,一些不规范不合理不好理解的地方也就更容易被改善,代码的可读性能够提高很多。虽然最后我们的代码有点小冗长,但是在规范性和可读性上还是很不错的。

posted @ 2015-05-17 18:03  风萧沫  阅读(269)  评论(7编辑  收藏  举报