中国象棋人机博弈系统的研究与实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第二章基础技术介绍
增加气氛。
棋盘上贴图和显示棋子的过程如下:
1.得到当前绘图的DC句柄,并保存当前绘图环境到内存DC中。
2.载入棋盘图片,并在主界面的客户区绘画出来。
3.遍历棋子数组,根据数组中的数据,把相应位置的棋子绘出来。
4.更新内存DC到绘图DC中,这样就可以把棋盘和棋子显示出来了。
贴棋子时,棋子不能贴在鼠标点击的位置,而应该贴在最近棋盘交叉点上。
所以,需要判定用户要下的棋子落在哪一个交叉点。
假设棋盘格子的边长为S,棋盘左上角的交点为A,坐标为(Xa,艺)。
用户点击的点为B,其坐标为(五,K),那么,B点的相对横坐标就是兰£兰}!丝,相对纵坐标就是
.)—Y。
—-Y_o+_S/2,这样就知道该往棋盘上的哪个交叉点贴棋子了。
如下图所示:
A
图2-4显示器坐标与棋盘坐标表示图
在上图中,左上角A点的坐标是(O,0),B点的棋盘坐标很明显是(1,1)。
另外中国象棋程序要有悔棋功能,所以,需要一个栈,来保存历史下棋记录。
然后要悔棋时,根据历史下棋记录,还原棋盘上的棋子的位置,然后重绘棋盘。
2.2中国象棋介绍
所谓无规矩不成方圆,所以在研究中国象棋前,有必要先了解下中国象棋。
中国象棋即军际象棋,具有悠久的历史。
象棋在周代建朝(公元前11世纪)前后产生于中国南部的氏族地区。
唐代,象棋在中国发生了很大的变化,有了一些变革,已有“将、马、车、卒”4个兵种,棋盘和国际象棋一样,由黑白相间
10
的64个方格组成。
后来又参照我国的围棋,把64个方格变为90个点。
宋代,中国象棋基本定型,除了因火药的发明增加了“炮’’之外,还增加了“士"、“象”。
到了明代,可能为了下棋和记忆的方便,才将一方面的“将”改为“帅”,和现代中国象棋一样了。
中国象棋是中国一种流传十分广泛的游戏。
下棋双方根据自己对棋局形式的理解和对棋艺规律的掌握,调动车马,组织兵力,协调作战在棋盘一一这块特定的战场上进行着象征性的军事战斗。
以下一些名词是中国象棋的一些棋盘与棋子的说明【8】:
l、棋盘
棋子活动的场所,叫做”棋盘”,在长方形的平面上,绘有九条平行的竖线和十条平行的横线相交组成,共九十个交叉点,棋子就摆在这些交叉点上。
中间第五、第六两横线之间未画竖线的空白地带,称为”河界”,整个棋盘就以”河界”分为相等的两部分;两方将帅坐镇、画有”米”字方格的地方,叫做”九宫”。
2、棋子
象棋的棋子共三十二个,分为红黑两组,各十六个,由对弈双方各执一组,每组兵种是一样的,各分为七种:
红方:帅(1)、仕(2)、相(2)、车(2)、马(2)、炮(2)、兵(5)
黑方:将(1)、士(2)、象(2)、车(2)、马(2)、炮(2)、卒(5)其中帅与将、仕与士、相与象、兵与卒的作用完全相同,仅仅是为了区分红棋和黑棋。
下图是中国象棋的初始子力位置和配置图。
■乏jj…§=、4
i:蓬壤绉箨巍蓖攀滚滚淄≤j
鬻群烈i;
lij|隧蓠紫誉淼蚓}1j!
嚣--一1『;{『誊麓蒲。
“簟。
瀵綦i浏}
辑亳。
鬻镑毫。
Ⅻ
鉴誉豁盎谷套奈彘釜?一
..=纛一麓I{li
,..氛,挥‰j。
毒。
、天嚣i寡。
1;;1三二一
图2-5中国象棋初始子力配置麟
./\
/\/\
图2-6中国象棋博弈树示意图
博弈搜索的特性在于对弈各方都努力寻找各自的获胜状态格局,同时也努力阻止对方出现获胜状态局。
所以,与一般的状态搜索不同的是:博弈树的搜索有双方的参加,一方只能做出一半的选择。
所以说状态图的搜索是纯粹的与树。
而博弈树的搜索是与或树。
另外,除了非常少数简单的棋类(如井子棋)外,其它的棋类,是没有建立完全博弈搜索树的可能性的。
因为要建立完全搜索树,其节点数将达到电脑无法承受的数量级,不管是CPU处理的时间,还是内存,都完全没有这种可能性。
既然不可能建立完全博弈搜索树,那么,应该换个思路,在当前的局面下,找出最有利于自己的一步。
为此,需要有一个函数来为每个局面的优劣进行评分。
假设张三胜为正无穷大,李四胜为负无穷大。
和局为零。
其它局面则可以通过双方棋子数量和位置来对其给予一个介于负无穷大到正无穷大之间的数。
很显然,正数代表当前局面对张三有利,负数代表当前局面对李四有利。
如此一来,可以建立一棵深度固定的搜索树。
其叶子节点不必是终局状态,而只是处于中间状态的当前局面后续几步的节点,其值由上述估值函数给出。
而对于中间节点,就用极大极小原则,张三取其中的最大值,李四取其中的最小值。
所以,博弈树被分为max层和min层。
轮到张大下棋的层是max层。
轮到李四下棋的层是rain层。
14
第二章基础技术介绍
a:一个MAX结点的a值等于其后继结点当前最大的最终倒推值B:一个MIN结点的13值等于其后继结点当前最小的最终倒推值。
于是fl值就是MAX结点的倒推值下界;B值就是MIN结点的倒推值上界。
倒推值的上、下界可以被修正,但遵循下列原则:I.MAX结点的a值永不减少:2.MIN结点的B值永不增加。
于是可以得到以下两个结论:(1)一个MAX结点的Q值等于其后继结点当前最大的最终倒推值:(2)一个MIN结点的B值等于其后继结点当前最小的最终倒推值。
基于以上两个结论,可以得出口一∥剪枝的两个原则:【10】
1.(a.剪枝)若MIN结点的B值≤其父结点㈣的a值,则结点以下的搜索,且这个MIN结点的最终倒推值可取为它的13值。
2.(B.剪枝)若任意MAX结点的Q值≥其父结点M【N的B值,则可以终止该MAX结点以下的搜索,且这个MAX结点的最终倒推值可取为它的a值。
所以,最理想的口一∥搜索,就是对MIN结点先扩展最低估值的结点,对MAX结点最先扩展最高估值的结点,即双方均本着对本方有利的原则走步。
其伪代码如下:图2-8口一∥剪枝示例int
AlphaBeta(intdepth,intalpha,intbeta,int
minnode)16
第三章博弈系统模型和知识表示
牵·属·象·士?将?士·象·属·章
l\/I
I/\I
一炬!炮一
一E+本
色—十一;膏——一茎七一一茎
l
筻潮i.Z芥
ll
—r·--------L
I
l\/
I/\l
九八t六五四三二一
图3-2中国象棋的棋盘和初始布局
首先考虑下棋子的表示。
红黑双方共有32个棋子,红黑双方交替走棋。
总共有14种不同的棋子,红黑双方各7种兵种。
一种简单的棋子的编码方式如下:表3-1中国象棋棋子的编码(简单方式)
兵种红帅红车红马红炮红士红象红兵
编码1234567
兵种黑将黑车黑马黑炮黑士黑象黑兵编码8910ll121314然后考虑下棋盘的表示方式。
可以用一个10"9字节的二维数组来表示,用BYTE(或者CHAR)chessBorad[10][9],表示一个棋盘。
其中,chessBoard[i]U]的值表示第i行第j列有什么棋子。
值为O表示没有棋子,值为1.14的话如表格3.1所示,表示相应类型的棋子。
如果使用一维数组表示,那么,只需一个大小
为90的一维数组chessBoard[90】,在判断数组中的某个元素位于第几行第几列时,比如数组元素chcssBorad[ent],它就是位于cnt/9行,删列的,由于这么
做不用进行二维数组的偏移操作,所以效率会稍微高些。
本文中,用一维数组表
2l
表3-2本文中使用的棋盘示意图
00010203040506070809OaObOcOdOeOf
10111213141516171819la1blc1d1eIf
IlIlIlIlIIlIIII
30313233343537393a3b3c3d3e3f
4041424344454648494a4b4c4d4e4f
50515253545557595a5b5c5d505f
606162636465666768696a6b6c6d6e6f
70717273747677787a7b7C7d7e7f
80818283848687888a8b8c8d8e8f
909192939495969798999a9b9c9d9e9f
aOala2a3a4a5a7a9aaabacadaeaf
b0b1b2b3b4b5b6b8b9babbbcbdbebf
cOclc2c3c4c5c7c9cacbCCcdcecf
IIlIIllIIlIIlIl
IIl-IIII_-I-I_-
llIIlIIIIIlIlII
上图中,33到cb之间的长方形表示棋盘部分,粉红色部分不使用,黄底部分表示九宫部分。
由于不是棋盘.棋子联系数组不是一个数字表示一个兵种,而是一个数字表示一个棋子,所以,棋子的编码方法和表格3.1有所不同。
棋子编码如下表所示:
\/l-I—L
钐八f广^巳一卒——卜本
Z一一j七一一交一I}
爱:簟:j∥_}}:十
l\∥
l/1\翟————囊K—j7r寸_一一泵雨耳L-
\∥l
I.I/卜广二1,☆\l1
盱of一^C兰延一一茗&一lll
1.楚纠≯芥+!一I—L.八∥1rl
/I\图¨红黑对称示意图
上面的两个棋局,表面上看起来是不同的局面,但是,实际上,它们是红黑对称的。
假如左半图这时候轮到红方走,在开局库中没有搜索到相应的局面,那么,假设开局库中有右半图的局面,可以查找右半图中黑方的着法,将着法镜像,就可以做为左半图中红方的着法了。
还有一种情况,如下图:
墨,向jK
一肘_J一蛩L.毋
f\l/JI
刀\广I一炮臣JL
^匕!——‘7巴7广夏—L;夏一一交一一杰夏一一瘴
f楚州j≯芥
II十
JLI\夕
一1广/1\ej承一一肘_J耍K—胃而.三事L\/I
/\JL广二1/幽\1广—一——^匕兰^C=
Z一一三歪一一三夏一一茗&—L本
}楚河澎祭II_·____LJL1广\\/I/卜
九八t六五四三二一九八七六五四三二一
图3.5左右对称示意图
上面的两个棋局,表面上看起来也不一样,但是实际上,它们是左右对称的。
假如左半图现在轮到红方走,如果左半图中的局面在开局库中找不到,而右半图。