中国象棋算法

合集下载

中国象棋和棋规则权威解释

中国象棋和棋规则权威解释

中国象棋和棋规则权威解释中国象棋是一种古老的棋类游戏,也被称为象棋。

它是中国文化的瑰宝之一,流传至今已有几千年的历史。

中国象棋有其独特的规则和特点,下面将对中国象棋的规则进行权威解释。

一、棋盘和棋子中国象棋的棋盘是一个长方形,由十条平行线和九条垂直线组成,交叉形成九九八十一个交叉点。

棋盘分为红黑两部分,每个玩家控制一个颜色。

“红棋”位于棋盘的下方,而“黑棋”位于棋盘的上方。

中国象棋共有32枚棋子,分为两个阵营:红方和黑方。

每个阵营包括一个帅(将),一个仕(士),两个相(象),两个马,两个车,两个炮和五个兵(卒)。

二、棋子的移动1.帅(将):帅的移动范围限制在九宫格内,每步只能在九宫格内移动一格。

2.仕(士):仕的移动范围也限制在九宫格内,每步只能在九宫格内斜移一格。

3.相(象):相的移动跳格,每次走两个格,只能在己方的半边棋盘内移动。

不能过河,当对方棋子占据离象的位置一个格的时候,该位置处于“象眼”之中,相不能移到这里。

4.马:马的移动有特定的“马蹄”形式,即先走一格,再向前斜走或向后斜走一格。

马脚位置处有其他棋子则无法跳脚移动。

5.车:车只能直线移动,可以横向或纵向移动若干格,但不能斜向移动。

车通过其他棋子的方式是“车行”。

6.炮:炮的移动类似车,但炮在走向终点的距离上有一个棋子隔开,才可以吃棋。

7.兵(卒):兵的移动有一定的特殊规则。

兵在没有过河之前只能向前移动,每次只能移动一格。

过河之后,兵可以左右移动,但不能后退。

三、吃棋在中国象棋中,吃棋是一种非常重要的攻击和防御手段。

如果一个棋子移动到一个敌方棋子所在的位置,这个敌方棋子就被吃掉了。

吃敌方棋子后,该棋子站在敌方棋子的位置。

四、将军和获胜将军是指其中一方的帅(将)被敌对方的棋子威胁到,无法再移动时的局面。

如果一方的帅(将)被将军,则该方进入被将状态。

如果一方无法避免将军(达到将军的局面)或者无法解将,则被判输。

获胜的条件是将军对方的帅(将)且对方无法解将。

中国象棋规则教程大全

中国象棋规则教程大全

中国象棋规则教程大全
一、基本规则
1. 比赛棋盘为8×9格,分为红黑两方,每方有16个棋子。

2. 棋子的摆放位置是对称的,由红方先行。

3. 棋局开始后,双方轮流行棋,每次一步。

4. 棋子的移动必须在棋盘内进行,不能超出边界。

二、各种棋子及其移动规则
1. 帥/将:只能在九宫格内移动,每次只能移动一步。

2. 士/仕:只能在对角线上的九宫格内移动,每次只能移动一步。

3. 象/相:只能在交叉点上的九宫格内移动,每次只能走两格,走到对方半边需要过河。

4. 車:可以直线横向或纵向移动,没有距离限制。

5. 马:可以走日字形,即先向前或向后走一步,再向左或向右
走一步。

6. 炮:可以直线横向或纵向移动,但是要隔着一个棋子吃子,
没有距离限制。

7. 兵/卒:前进一格,过河后可以左右移动,每次只能移动一步。

三、胜负判定
1. 将军:将帅相对且无法避免被对方吃掉。

2. 走子无路:一方无法行棋。

3. 将死:一方被对方将军且无法逃脱。

四、特殊规则
1. 双方不能走长将长捉:相同棋局连续3次。

2. 兵/卒过河后升变:过河后可以升变为任意棋子。

3. 车马炮兵/卒吃对方棋子时必须跳过一个棋子。

五、其他注意事项
1. 玩家应当遵守国际象棋规则,尊重对手和裁判。

2. 对于争议情况,应当寻求裁判的决定。

以上为中国象棋的基本规则,希望这份教程可以帮助您更好地了解和享受中国象棋。

象棋计算公式

象棋计算公式

象棋计算公式象棋作为中国传统的智力游戏,历史悠久,深受广大人民喜爱。

在象棋中,每个棋子都有自己特定的移动规则和价值,而玩家需要根据这些规则和价值来制定自己的战术和策略。

在这篇文章中,我们将讨论一些象棋计算公式,帮助玩家更好地理解象棋的战术和策略。

一、棋子的价值计算。

在象棋中,每个棋子都有自己的价值,而这个价值是根据棋子的能力和移动规则来确定的。

一般来说,我们可以用以下的价值计算公式来确定一个棋子的价值:棋子的价值 = 基本价值 + 位置价值 + 活动价值。

其中,基本价值是指棋子本身的能力和价值,比如车的基本价值就比马高,因为车的移动范围更广,攻击力更强。

位置价值是指棋子所处的位置对其攻击和防守的影响,比如一个位于中心的马比一个位于边缘的马更有价值,因为中心位置可以更容易地进攻敌方的要害。

活动价值是指棋子的活动能力,比如一个能够灵活移动的马比一个被对方牵制的马更有价值。

通过这个价值计算公式,玩家可以更好地评估自己和对手的棋子,从而制定更合理的战术和策略。

二、棋局的评估。

除了评估单个棋子的价值之外,玩家还需要评估整个棋局的形势,从而决定自己的下一步棋。

在象棋中,一个合理的棋局评估公式可以帮助玩家更好地理解整个棋局的形势,从而做出更合理的决策。

一个常见的棋局评估公式可以分为以下几个方面:1. 材料优势,即双方棋子的数量和价值的比较。

如果自己拥有更多的棋子或者更有价值的棋子,那么就具有材料优势。

在这种情况下,玩家可以选择更积极的进攻策略,因为自己有更多的资源来进行攻击。

2. 位置优势,即双方棋子的位置对比。

如果自己的棋子更好地控制了棋盘的中心或者对方的要害位置,那么就具有位置优势。

在这种情况下,玩家可以选择更稳健的防守策略,因为自己的棋子已经占据了有利的位置。

3. 发展优势,即双方棋子的发展速度和稳定性。

如果自己的棋子发展得更快或者更稳定,那么就具有发展优势。

在这种情况下,玩家可以选择更长远的策略,因为自己的棋子已经处于了更有利的发展轨道上。

最新下中国象棋的规则

最新下中国象棋的规则

最新下中国象棋的规则国象棋是很开发智力的一项有益活动,适合青少年朋友,也适合其它各年龄层的人群,那你了解其中的一些关于象棋的规则吗?下面是有中国象棋的规则,欢迎参阅。

中国象棋分为红棋和黑棋,双方对奕,各执一棋,每人各走一步。

双方拥有同样数量和作用的棋子,中间楚河,汉界把双方分开,初始棋局棋子的放置位置是固定的,红黑各放一半棋盘,双方最后一排按中间帅(将),2边依次是仕(士)-相(象)-马-车排列,2边2个马上方的第3行各放1个-跑(炮),车的第4行放上兵(卒),每间隔一个位置放一个,总共5个兵(卒),这样子双方各18颗棋子。

摆放好棋子之后,执红棋方先走,然后再轮到执黑棋方走,各走一步。

每种棋子的走法各不相同。

下面来说说每种棋子的走法。

帅(将)只能走在九宫格里,每次只能走一步,仕(士)只能走九宫格里的对角线,相(象)走“田”字格,马走“日”字格,车走“直线”,跑(炮)走直线,吃子用“隔山打炮”,即中间隔有1个子就能吃掉同行列的另一个棋子。

兵(卒)只能向前走,过到对方棋盘也可以向横走,但不能向后退。

有棋子在相(象)要走“田”字格中间的位置,那相(象)不能移动。

有棋子在马的四周任何一个位置,就不能走到有棋子方向“日”字格的位置。

帅(将)和仕(士)只能走中间的九宫格,相(象)不能过对方的楚河汉界,只能走自己一半的棋盘。

其它棋子全棋盘都可以走。

中国象棋以将对方的帅(将)吃掉,就为赢。

如果双方都没有办法吃掉对方的帅(将),则为平局。

6年龄比较小的孩子,还可以玩另一种比较简单有趣的玩法,将棋子朝下摆放在四方格里面,只需使用一半的棋盘方格摆放,依照顺序每人每次翻开一个棋子,第1次翻开的棋子是红,那对方就算是执黑棋。

吃子的顺序按照大可以吃小的走:帅(将)-仕(士)-相(象)-车-马-跑(炮)-兵(卒)-帅(将),兵(卒)只能吃帅(将),遇到其它的棋子都会被吃掉。

帅(将)可以吃掉除了兵(卒)的其它所有棋子。

一样大小的棋子可以一起碰掉。

中国象棋判断胜负的方法

中国象棋判断胜负的方法

中国象棋判断胜负的方法中国象棋是由两人轮流走子,在战法上遵循古代孙子兵法中的不战而屈人之兵,善之善者也的作战思想,以“将死”或“困毙”对方将(帅)为胜的一种二人对抗性游戏。

下面我们讲解判断中国象棋胜负的方法。

希望能给大家带来帮助!判断中国象棋胜负的方法:1.一方的一个棋子准备吃掉对方的帅(将),叫“将军”(check),若对方的帅(将)不能逃脱,也就是说无论如何“将军”者在下一个回合都能吃掉对方的帅(将),则为“将死” (checkmate),吃掉对方帅(将)者判胜利。

2.如果轮到一方走,此时这方并没有被“将军”,但其走无论任何一个棋子,另一方都能在下一个回合里吃掉他的帅(将),则也判这方负。

3.如果轮到走棋的一方没有任何能够移动的棋子,那么也判这方负。

4.双方均无能力“将死”对方时,判和。

象棋走子规则中国象棋是中华民族传统文化的一部分,不仅在国内深受广大棋迷的喜爱,而且流传至国外,也逐步赢得很多棋迷的青睐。

下面店铺主要说的是象棋走子规则。

希望能给大家带来帮助!王:横、直、斜都可以走,但每着限走一步。

(1) 除易位时外,王可走到未被对方棋子攻击的任何相邻格子。

(2) 易位是由王已方任何一个车一起进行仍被视作王的一着的走法,其进行方式如下:王从原始位置向任何一围的方向横移两格,然后那人横越过王而置于王刚经过的格子。

(3) 如果一方先触摸车一起然后再触摸王,那么他不能用那个车进行易位,这种情况须按以下A和B条处理。

A:除上述上,如果行棋方有意识地触摸了同一方的一个或更多的棋子,他触动或吃掉所触措的第一个可以走动或可以被吃的棋子;或者一个已方的棋子和个对方的棋子,他用前者吃掉后者;如果这种吃法不合规则,如果无法确定先触摸哪一个棋子,则以已方棋子作为已被触摸的棋子。

B:如果所触摸的已方棋子均没有合乎规则的着法(或者对所触摸的对方棋子均没有合乎规则的吃法),行棋方有权走任何合乎规则的着法。

(4) 如果一方在准备易位时触摸了王,或者同时触摸了王和车,然后发现易位不合规则,他可以选择走王或者向另一翼易位,前提是向那一翼易位是合乎规则的,如果王没有合乎规则的走法,该方有权造反走任何规则的着法。

中国象棋规则口诀

中国象棋规则口诀

中国象棋规则口诀中国象棋是中国传统的棋类游戏,具有悠久的历史和深厚的文化底蕴。

它是两人对弈的游戏,棋盘上有32个棋子,分为红黑两色。

下面,我将为您介绍中国象棋的规则,以帮助您更好地理解和学习这个古老而精彩的游戏。

一、棋子的摆放1. 棋盘上横向共有9条线,纵向共有10条线,交叉处称为“格”,其中红方位于下方,黑方位于上方。

2. 每方棋子摆放在棋盘的两侧,共分为前、后、中三行,每行有四个位置。

3. 两方的棋子摆法对称,即红方的前后中三行上面依次摆放着车、马、相、士、将、士、相、马、车;黑方的前后中三行下面依次摆放着車、馬、象、士、帥、士、象、馬、車。

二、棋子的走法1. 将帅:将帅是棋局中最重要的棋子,它的移动范围限制在九宫格内,即将帅在宫格之间上下左右各移动一格。

2. 士:士只能在九宫格内移动,移动规则是斜线移动一格,不得离开九宫格。

3. 象:象只能在九宫格内移动,移动规则是沿着棋盘的斜线走,每次走两格,不得越过中间的河界。

4. 马:马的移动规则是“日”字型,即先向前、后或左、右走一格,再按斜角移动一格。

5. 车:车可横向或纵向走,每次可以一直向前、后、左、右走到棋盘的边缘或遇到其他棋子停止。

6. 炮:炮的移动规则与车相同,但它有特殊的吃子规则,即炮可以跳过一个棋子吃掉另一个棋子,被跳过的棋子称为“炮架”。

7. 兵(卒):兵只能向前走,开始时每个兵只能前进一格,过河之后可以左右移动,但不得后退。

而且,过河后的兵还可以升级成为“进士”、“仕”、“相”或“马”,具体升级规则依赖于不同的棋局。

三、其他规则1. 将帅不能直接对峙,也就是说,将帅之间需要隔着一个以上的棋子。

2. 将帅不能面对面,即将与帅不能在同一条直线上。

例如,将帅不能在同一纵向直线上,否则就会造成“将军”的局面,需要被解决。

3. 将军:当将军发生时,被“将军”的一方必须采取行动来解决将军的局面。

如果没有解决将军的方法,则被将军一方判负。

4. 王车易位:当局面上不存在任何威胁时,将和车还可以通过双方沟通,实现王车易位。

中国象棋比赛规则

中国象棋比赛规则

中国象棋比赛规则一、基本规则遵循友谊第一,比赛第二的原则,讲究棋风、棋德,赛出风格,比出水平。

二、赛制1.赛制:按编制A,B进行交叉比赛。

(1)小组循环:赛1盘,负/弃权不积分。

例如A1对B1(2)交叉比赛:赛1盘,若两盘平局加赛一局,比赛A先B后。

(3)比赛开始5分钟未到指定地点参赛的视为弃权(4)已经排好对阵的双方,如果有特殊情况不能按规定时间参赛,请于提前告知,以便及时协调调整。

2.比赛用时:30分钟(对于特殊情况酌情处理)。

三、胜负判定(1)对局时,一方出现下列情况之一,就算输棋,对方得胜:帅(将)被对方“将死”;走棋后形成帅(将)直接对面;被困毙(轮到走棋的一方,无子可走,就算被“困毙”);长将、长吃;自己宣布认输;在同一棋局中,三次“犯规;在对局中拒绝遵守本规则或严重违反纪律。

(2)对局时,出现下列情况之一,就算和棋:属于理论上公认的双方均无取胜可能的局势;提议作和,应使双方机会均等。

只要是一方提和,另一方已宣告同意,双方都不许反悔;双方走棋出现循环反复三次,符合“棋例”中“不变作和”的有关规定。

四、行棋规则1.一着棋走了以后,不得再予更改。

落子生根,以手离开棋子为准。

2.触摸对方的棋子,就必须吃掉那个棋子,只有当己方的任何棋子都无法去吃时,才可以另行走子。

3.不准摸子,否则按技术犯规论处。

五、犯规对局时,一方出现下列情况之一,即为犯规:1.在对方走棋时间内,无故提出问题,或有其他构成干扰对方注意力的行为;2.提议作和经对方拒绝后,连续提出;3.摸触了己方不可能走动的棋子;4.摸触了对方的棋子,而己方的任何棋子都无法吃掉它;六、判决标准1.循环赛结束后,一轮胜出即将进入下一轮。

七、棋例释义1.长将、长杀、长捉、一将一杀、一将一捉、一杀一捉等循环重复的攻击手段,统称为“禁止着法”。

2.闲着(含:兑、献、拦、跟)、数将一闲、数杀一闲、数捉一闲等着法,无论是否重复,统称为“允许着法”。

3.双方均为允许着法,双方不变作和。

中国象棋将帅算法

中国象棋将帅算法

– – – – –
– – – – – – –
crc=0; while(len--!=0) { da=((uchar)(crc/256))/16; /* 暂存CRC的高四位 */ crc<<=4; /* CRC右移4位,相当于取CRC的低12位)*/ crc^=crc_ta[da^(*ptr/16)]; /* CRC的高4位和本字节的前半字节相加后 查 表计算CRC,然后加上上一次CRC的余数 */ da=((uchar)(crc/256))/16; /* 暂存CRC的高4位 */ crc<<=4; /* CRC右移4位, 相当于CRC的低12位) */ crc^=crc_ta[da^(*ptr&0x0f)]; /* CRC的高4位和本字节的后半字节相 加后 查表计算CRC,然后再加上上一次CRC的余数 */ ptr++; } return(crc); }
• 半字节计算CRC:
– unsigned cal_crc(unsigned char *ptr, unsigned char len) { – unsigned int crc; – unsigned char da; – unsigned int crc_ta[16]={ /* CRC余式表 */ – 0x0000,0x1021,0x2042,0x3063,0x4084,0x50a5,0x 60c6,0x70e7, – 0x8108,0x9129,0xa14a,0xb16b,0xc18c,0xd1ad,0 xe1ce,0xf1ef, – }
作业
• 验证CRC16的三种算法得到的CRC码是否 一致 • 验证CRC16的三种算法的时间复杂度各为 多少
Hale Waihona Puke 附件——CRC16表• • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • crc16tab = (0x0000, 0xC0C1, 0xC181, 0x0140, 0xC301, 0x03C0, 0x0280, 0xC241, 0xC601, 0x06C0, 0x0780, 0xC741, 0x0500, 0xC5C1, 0xC481, 0x0440, 0xCC01, 0x0CC0, 0x0D80, 0xCD41, 0x0F00, 0xCFC1, 0xCE81, 0x0E40, 0x0A00, 0xCAC1, 0xCB81, 0x0B40, 0xC901, 0x09C0, 0x0880, 0xC841, 0xD801, 0x18C0, 0x1980, 0xD941, 0x1B00, 0xDBC1, 0xDA81, 0x1A40, 0x1E00, 0xDEC1, 0xDF81, 0x1F40, 0xDD01, 0x1DC0, 0x1C80, 0xDC41, 0x1400, 0xD4C1, 0xD581, 0x1540, 0xD701, 0x17C0, 0x1680, 0xD641, 0xD201, 0x12C0, 0x1380, 0xD341, 0x1100, 0xD1C1, 0xD081, 0x1040, 0xF001, 0x30C0, 0x3180, 0xF141, 0x3300, 0xF3C1, 0xF281, 0x3240, 0x3600, 0xF6C1, 0xF781, 0x3740, 0xF501, 0x35C0, 0x3480, 0xF441, 0x3C00, 0xFCC1, 0xFD81, 0x3D40, 0xFF01, 0x3FC0, 0x3E80, 0xFE41, 0xFA01, 0x3AC0, 0x3B80, 0xFB41, 0x3900, 0xF9C1, 0xF881, 0x3840, 0x2800, 0xE8C1, 0xE981, 0x2940, 0xEB01, 0x2BC0, 0x2A80, 0xEA41, 0xEE01, 0x2EC0, 0x2F80, 0xEF41, 0x2D00, 0xEDC1, 0xEC81, 0x2C40, 0xE401, 0x24C0, 0x2580, 0xE541, 0x2700, 0xE7C1, 0xE681, 0x2640, 0x2200, 0xE2C1, 0xE381, 0x2340, 0xE101, 0x21C0, 0x2080, 0xE041, 0xA001, 0x60C0, 0x6180, 0xA141, 0x6300, 0xA3C1, 0xA281, 0x6240, 0x6600, 0xA6C1, 0xA781, 0x6740, 0xA501, 0x65C0, 0x6480, 0xA441, 0x6C00, 0xACC1, 0xAD81, 0x6D40, 0xAF01, 0x6FC0, 0x6E80, 0xAE41, 0xAA01, 0x6AC0, 0x6B80, 0xAB41, 0x6900, 0xA9C1, 0xA881, 0x6840, 0x7800, 0xB8C1, 0xB981, 0x7940, 0xBB01, 0x7BC0, 0x7A80, 0xBA41, 0xBE01, 0x7EC0, 0x7F80, 0xBF41, 0x7D00, 0xBDC1, 0xBC81, 0x7C40, 0xB401, 0x74C0, 0x7580, 0xB541, 0x7700, 0xB7C1, 0xB681, 0x7640, 0x7200, 0xB2C1, 0xB381, 0x7340, 0xB101, 0x71C0, 0x7080, 0xB041, 0x5000, 0x90C1, 0x9181, 0x5140, 0x9301, 0x53C0, 0x5280, 0x9241, 0x9601, 0x56C0, 0x5780, 0x9741, 0x5500, 0x95C1, 0x9481, 0x5440, 0x9C01, 0x5CC0, 0x5D80, 0x9D41, 0x5F00, 0x9FC1, 0x9E81, 0x5E40, 0x5A00, 0x9AC1, 0x9B81, 0x5B40, 0x9901, 0x59C0, 0x5880, 0x9841, 0x8801, 0x48C0, 0x4980, 0x8941, 0x4B00, 0x8BC1, 0x8A81, 0x4A40, 0x4E00, 0x8EC1, 0x8F81, 0x4F40, 0x8D01, 0x4DC0, 0x4C80, 0x8C41, 0x4400, 0x84C1, 0x8581, 0x4540, 0x8701, 0x47C0, 0x4680, 0x8641, 0x8201, 0x42C0, 0x4380, 0x8341, 0x4100, 0x81C1, 0x8081, 0x4040)
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
入神蛋”,ElephantEye遗憾地以2:3败北。我有充分的信心表明ElephantEye的棋力比梦
入神蛋强得多,因为两者用了相同的评价函数,但同样时间ElephantEye通常要比梦入神
蛋多搜索一层以上,那么2:3的比分又能说明什么问题呢?
(3)跟人类比和跟电脑比是两回事,每个电脑程序都有弱点,这些弱点很容易被人
源代码充分发挥它的作用。
下面我先简要谈一下我自己对ElephantEye的体会。
1.1 ElephantEye用到了哪些算法?
在我写本次连载以前,我已经完成了《象棋百科全书》网站上《对弈程序基本技术
》专题中所有文章的翻译,ElephantEye的大部分算法都参考了这些文章,这些算法我会
在连载中一笔带过,详细的内容希望读者参考这些译文,那里还有我加的很多译注,希
类棋手抓住,但其他电脑程序则不会抓住你的弱点。一般认为,知识缺乏的程序弱点也
多(例如ElephantEye不懂得防守空头炮),因此对阵人类棋手失败的几率要比对阵其他程
序高得多。
1.3 ElephantEye对象棋有哪些认识?
要说ElephantEye一点象棋知识都不具备,这种观点我是无法接受的。很多搜索算法
顶尖程序去比呢?也有人认为它能战胜中等商业软件,但电脑对电脑和电脑对人类根本
就不是一回事,这么一个不懂得防守空头炮的程序怎能说它厉害呢?还有人喜欢在同一
搜索水平(比如6层、8层或10层)上比较两个不同的程序,这种标准去比较“蛮力型”程
序和“知识型”程序,这有意义吗?
要正确认识这个问题,我想说明几点:
管如此,ElephantEye短短10行的将军判断也许是程序的一个亮点吧,那么这部分内容我
将尽量介绍得详细一点。
此外,一些看似和棋力关系不大的技术,诸如开局库、长将检测、后台思考、时间
策略、引擎协议等等,其实也直接影响着象棋程序的稳定性,因此也有必要逐一讲解。
总之,每个技术都很重要,我的连载虽然不能面面俱到,但我会尽我所能来作详细
接近了中等商业软件的水平,在公开源代码的象棋程序中,ElephantEye是最强的一个。
我希望能通过公开源代码的方式,推动中国象棋程序水平的整体发展,然而根据很
多网友的反馈意见,发现源代码中的很多部分并不是那么容易理解的。因此我才打算以
《中国象棋程序设计探索》为题,写几篇详细介绍ElephantEye算法的连载,希望能让的
(1) 测试标准要合理,这个标准只能是“时限”,即给两个程序以同样多的时间,
可以对每步都限定时间,也可以是比赛所采用的时段制或加时制,而不能以同样的搜索
水平作标准。另外,如果两个程序运行在同一台电脑上,那么不能启用后台思考功能。
(2)某几盘对局并不能说明问题,我以“浅红象棋”为平台用ElephantEye对阵“梦
我的连载中重点介绍。
我猜读者最感兴趣的内容是ElephantEye的着法生成器,这应该算是象棋程序的核心
部分,同时也是各个程序差异最大的部分。在写ElephantEye以前,我在《象棋百科全书
》网站上刊登了大量介绍“位棋盘”的文章,这是个非常有吸引力的思想,但是我试验
下来觉得它的速度并不快,在ElephantEye的程序里我只把位棋盘运用在将军判断上。尽
e.net)
(一)引言
我在今年2月写出了象棋程序ElephantEye的第一个版本(0.90),本来它只是象棋界
面ElephantBoard的调试引擎。在设计程序的过程中,我尝试性地加入了很多算法,发现
每次改进都能让程序的棋力有大幅度的提高,因此便对象棋程序的算法产生了浓厚的兴
趣。到现在我已经陆续对ElephantEye作了几十次加工(目前版本为0.94),使得它的棋力
望它们能够加深读者对这些算法的体会。
当然,仅根据这些文章所提供的算法,是写不出很好的程序的,我参考了王小春的
《PC游戏编程——人机博弈》一书,也参考了一些国际象棋的源程序,并通过自己的探
索,在ElephantEye中加入了另外的非常重要的算法,尤其是启发算法,我认为它们在程
序中发挥了关键性的作用,而且很多细节在绝大多数文字资料中没有详细给出,我会在
“适应性”的),最近我对该算法作了改进,使得它能正确处理残局中的等着杀和连等着
杀,速度也快了很多。
这些算法使得ElephantEye有很强的处理杀局和残局的能力,我相信绝大多数商业软
件都没它做得好。如果一个程序能在很短的时间内告诉你,几步之后必定有一方会被将
死,或者几步之后优势一方就可以破士或破象,那么这个程序的实用价值还算小吗?
确实只能用在象棋上,这一点ElephantEye做得比很多商业程序都好,这些算法体现在以
下几个方面:
(1)杀棋局面在置换表中的特殊处理,这使得ElephantEye识别杀棋的速度快了很多
;
(2)将军扩展,这使得ElephantEye对可能有杀棋的线路特别感兴趣,它会在搜索上
增加对这些路线的投入;
(3)带检验的适应性空着裁剪,这个算法首先由一个以色列学者发表于2002年(不是
阐述的。
1.2如何正确评价ElephantEye目前的棋力?
ElephantEye是“蛮力型”象棋程序,与大多数商业程序的不同之处在于,它没有审
局能力,那么它的棋力到底有多强?网友对这个问题众说纷纭,有人认为它无法跟一流
的商业软件相比,毕竟ElephantEye是免费程序,其源代码又是公开的,为什么非要去和
(二)棋盘结构和着法生成器
在阅读本章前,建议读者先阅读《象棋百科全书》网站中《对弈程序基本技术》专题的以下几篇译文:
(1)数据结构——简介(David Eppstein);
(2)数据结构——Leabharlann 棋盘(JamesSwafford);
(3)数据结构——旋转的位棋盘(JamesSwafford);
(4)数据结构——着法生成器(James Swafford);
中国象棋算法
———————————————————————————————— 作者:
———————————————————————————————— 日期:
解剖大象的眼睛——中国象棋程序设计探索
黄晨*2005年6月
( *联系地址:复旦大学化学系表面化学实验室,eMail:morning_yellow@elephantbas
相关文档
最新文档