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

中国象棋和棋规则权威解释中国象棋是一种古老的棋类游戏,也被称为象棋。
它是中国文化的瑰宝之一,流传至今已有几千年的历史。
中国象棋有其独特的规则和特点,下面将对中国象棋的规则进行权威解释。
一、棋盘和棋子中国象棋的棋盘是一个长方形,由十条平行线和九条垂直线组成,交叉形成九九八十一个交叉点。
棋盘分为红黑两部分,每个玩家控制一个颜色。
“红棋”位于棋盘的下方,而“黑棋”位于棋盘的上方。
中国象棋共有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. 发展优势,即双方棋子的发展速度和稳定性。
如果自己的棋子发展得更快或者更稳定,那么就具有发展优势。
在这种情况下,玩家可以选择更长远的策略,因为自己的棋子已经处于了更有利的发展轨道上。
中国象棋判断胜负的方法

中国象棋判断胜负的方法中国象棋是由两人轮流走子,在战法上遵循古代孙子兵法中的不战而屈人之兵,善之善者也的作战思想,以“将死”或“困毙”对方将(帅)为胜的一种二人对抗性游戏。
下面我们讲解判断中国象棋胜负的方法。
希望能给大家带来帮助!判断中国象棋胜负的方法:1.一方的一个棋子准备吃掉对方的帅(将),叫“将军”(check),若对方的帅(将)不能逃脱,也就是说无论如何“将军”者在下一个回合都能吃掉对方的帅(将),则为“将死” (checkmate),吃掉对方帅(将)者判胜利。
2.如果轮到一方走,此时这方并没有被“将军”,但其走无论任何一个棋子,另一方都能在下一个回合里吃掉他的帅(将),则也判这方负。
3.如果轮到走棋的一方没有任何能够移动的棋子,那么也判这方负。
4.双方均无能力“将死”对方时,判和。
象棋走子规则中国象棋是中华民族传统文化的一部分,不仅在国内深受广大棋迷的喜爱,而且流传至国外,也逐步赢得很多棋迷的青睐。
下面店铺主要说的是象棋走子规则。
希望能给大家带来帮助!王:横、直、斜都可以走,但每着限走一步。
(1) 除易位时外,王可走到未被对方棋子攻击的任何相邻格子。
(2) 易位是由王已方任何一个车一起进行仍被视作王的一着的走法,其进行方式如下:王从原始位置向任何一围的方向横移两格,然后那人横越过王而置于王刚经过的格子。
(3) 如果一方先触摸车一起然后再触摸王,那么他不能用那个车进行易位,这种情况须按以下A和B条处理。
A:除上述上,如果行棋方有意识地触摸了同一方的一个或更多的棋子,他触动或吃掉所触措的第一个可以走动或可以被吃的棋子;或者一个已方的棋子和个对方的棋子,他用前者吃掉后者;如果这种吃法不合规则,如果无法确定先触摸哪一个棋子,则以已方棋子作为已被触摸的棋子。
B:如果所触摸的已方棋子均没有合乎规则的着法(或者对所触摸的对方棋子均没有合乎规则的吃法),行棋方有权走任何合乎规则的着法。
(4) 如果一方在准备易位时触摸了王,或者同时触摸了王和车,然后发现易位不合规则,他可以选择走王或者向另一翼易位,前提是向那一翼易位是合乎规则的,如果王没有合乎规则的走法,该方有权造反走任何规则的着法。
(最新版)中国象棋全国比赛规则

(最新版)中国象棋全国比赛规则1. 总则1.1 本规则适用于全国各级别的中国象棋比赛,旨在维护比赛的公平、公正与秩序。
1.2 比赛由中国象棋协会负责组织与管理,地方协会协助执行。
1.3 参赛选手须为本国籍,且遵守本规则。
2. 比赛形式与赛制2.1 比赛形式分为个人赛和团体赛。
2.2 个人赛分为男子组、女子组和老年组,团体赛分为男子团体、女子团体和混合团体。
2.3 比赛采用积分编排制,根据参赛人数确定比赛轮数。
2.4 每轮比赛结束后,根据积分排名,进行下一轮的对手编排。
2.5 比赛时间安排:每局比赛时间根据比赛级别和轮次确定,一般为25分钟或30分钟。
每方基本用时为15分钟,超时判负。
3. 棋局规定3.1 棋盘与棋子:标准中国象棋棋盘,红黑双方各16枚棋子。
3.2 走棋:选手按顺序走棋,每次一步,走棋后需用手指轻敲棋盘以示完成。
3.3 计时:比赛开始时,裁判将计时器置于棋盘旁边,选手在规定时间内完成走棋。
3.4 交换棋子:在比赛开始前,双方选手可进行一次棋子交换,交换后不得再提出交换要求。
3.5 和棋:双方选手达成和棋协议,或比赛时间到,棋局未分胜负,判定为和棋。
4. 犯规与判负4.1 犯规行为:选手在比赛中出现以下行为视为犯规:- 违规使用电子产品;- 在规定时间内未完成走棋;- 故意移动棋子,影响对手思考;- 其他影响比赛公平、公正的行为。
4.2 判负:选手在比赛中出现犯规行为,将被判负。
5. 异议与仲裁5.1 参赛选手对比赛结果有异议,可在比赛结束后向裁判提出申诉。
5.2 裁判组应在收到申诉后30分钟内作出答复。
如经核实,比赛结果确有错误,将进行更正。
5.3 参赛选手对裁判判决有异议,可在比赛结束后向仲裁委员会提出申诉。
5.4 仲裁委员会作出的判决为最终裁决。
6. 赛事纪律6.1 参赛选手应遵守比赛纪律,服从裁判判决。
6.2 参赛选手不得在比赛中进行不正当竞争,不得使用非法手段干扰对手。
6.3 参赛选手违反赛事纪律,将被取消比赛成绩,并可能受到禁赛等处罚。
中国象棋规则口诀

中国象棋规则口诀中国象棋是中国传统的棋类游戏,具有悠久的历史和深厚的文化底蕴。
它是两人对弈的游戏,棋盘上有32个棋子,分为红黑两色。
下面,我将为您介绍中国象棋的规则,以帮助您更好地理解和学习这个古老而精彩的游戏。
一、棋子的摆放1. 棋盘上横向共有9条线,纵向共有10条线,交叉处称为“格”,其中红方位于下方,黑方位于上方。
2. 每方棋子摆放在棋盘的两侧,共分为前、后、中三行,每行有四个位置。
3. 两方的棋子摆法对称,即红方的前后中三行上面依次摆放着车、马、相、士、将、士、相、马、车;黑方的前后中三行下面依次摆放着車、馬、象、士、帥、士、象、馬、車。
二、棋子的走法1. 将帅:将帅是棋局中最重要的棋子,它的移动范围限制在九宫格内,即将帅在宫格之间上下左右各移动一格。
2. 士:士只能在九宫格内移动,移动规则是斜线移动一格,不得离开九宫格。
3. 象:象只能在九宫格内移动,移动规则是沿着棋盘的斜线走,每次走两格,不得越过中间的河界。
4. 马:马的移动规则是“日”字型,即先向前、后或左、右走一格,再按斜角移动一格。
5. 车:车可横向或纵向走,每次可以一直向前、后、左、右走到棋盘的边缘或遇到其他棋子停止。
6. 炮:炮的移动规则与车相同,但它有特殊的吃子规则,即炮可以跳过一个棋子吃掉另一个棋子,被跳过的棋子称为“炮架”。
7. 兵(卒):兵只能向前走,开始时每个兵只能前进一格,过河之后可以左右移动,但不得后退。
而且,过河后的兵还可以升级成为“进士”、“仕”、“相”或“马”,具体升级规则依赖于不同的棋局。
三、其他规则1. 将帅不能直接对峙,也就是说,将帅之间需要隔着一个以上的棋子。
2. 将帅不能面对面,即将与帅不能在同一条直线上。
例如,将帅不能在同一纵向直线上,否则就会造成“将军”的局面,需要被解决。
3. 将军:当将军发生时,被“将军”的一方必须采取行动来解决将军的局面。
如果没有解决将军的方法,则被将军一方判负。
4. 王车易位:当局面上不存在任何威胁时,将和车还可以通过双方沟通,实现王车易位。
象棋各兵种降和值力数

这样每当和棋后,双方各自翻面所吃的敌棋,合计实际“值力数”对比即可分出胜负。
2018-11-26
撰文及绘图:Sjw_ddk
这些数字在胜负分晓的对局中无实际作用在和棋的结局时以获得敌人值力数大的多的一方为胜如果值力数也相同则为正和即和棋
象棋各兵种降和值力数
1、车:“值力数”9乘2枚=18
2、马:5乘=10
3、炮:4乘2=8
4、象:3乘2=6
5、仕:3乘2=6
6、兵:3乘5=15
7、将:63乘1=63
以上数值,旨在为了应对和棋过多,每个兵种另一面都刻着各自的“值力数”(表示价值和力量的降和数字)。
中国象棋比赛规则

中国象棋比赛规则一、基本规则遵循友谊第一,比赛第二的原则,讲究棋风、棋德,赛出风格,比出水平。
二、赛制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.双方均为允许着法,双方不变作和。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
解剖大象的眼睛——中国象棋程序设计探索黄晨*2005年6月( * 联系地址:复旦大学化学系表面化学实验室,eMail:morning_yellow@elephantbas )(一) 引言我在今年2月写出了象棋程序ElephantEye的第一个版本(0.90),本来它只是象棋界面ElephantBoard的调试引擎。
在设计程序的过程中,我尝试性地加入了很多算法,发现每次改进都能让程序的棋力有大幅度的提高,因此便对象棋程序的算法产生了浓厚的兴趣。
到现在我已经陆续对ElephantEye作了几十次加工(目前版本为0.94),使得它的棋力接近了中等商业软件的水平,在公开源代码的象棋程序中,ElephantEye是最强的一个。
我希望能通过公开源代码的方式,推动中国象棋程序水平的整体发展,然而根据很多网友的反馈意见,发现源代码中的很多部分并不是那么容易理解的。
因此我才打算以《中国象棋程序设计探索》为题,写几篇详细介绍ElephantEye算法的连载,希望能让的源代码充分发挥它的作用。
下面我先简要谈一下我自己对ElephantEye的体会。
1.1 ElephantEye用到了哪些算法?在我写本次连载以前,我已经完成了《象棋百科全书》网站上《对弈程序基本技术》专题中所有文章的翻译,ElephantEye的大部分算法都参考了这些文章,这些算法我会在连载中一笔带过,详细的内容希望读者参考这些译文,那里还有我加的很多译注,希望它们能够加深读者对这些算法的体会。
当然,仅根据这些文章所提供的算法,是写不出很好的程序的,我参考了王小春的《PC游戏编程——人机博弈》一书,也参考了一些国际象棋的源程序,并通过自己的探索,在ElephantEye中加入了另外的非常重要的算法,尤其是启发算法,我认为它们在程序中发挥了关键性的作用,而且很多细节在绝大多数文字资料中没有详细给出,我会在我的连载中重点介绍。
我猜读者最感兴趣的内容是ElephantEye的着法生成器,这应该算是象棋程序的核心部分,同时也是各个程序差异最大的部分。
在写ElephantEye以前,我在《象棋百科全书》网站上刊登了大量介绍“位棋盘”的文章,这是个非常有吸引力的思想,但是我试验下来觉得它的速度并不快,在ElephantEye的程序里我只把位棋盘运用在将军判断上。
尽管如此,ElephantEye短短10行的将军判断也许是程序的一个亮点吧,那么这部分内容我将尽量介绍得详细一点。
此外,一些看似和棋力关系不大的技术,诸如开局库、长将检测、后台思考、时间策略、引擎协议等等,其实也直接影响着象棋程序的稳定性,因此也有必要逐一讲解。
总之,每个技术都很重要,我的连载虽然不能面面俱到,但我会尽我所能来作详细阐述的。
1.2 如何正确评价ElephantEye目前的棋力?ElephantEye是“蛮力型”象棋程序,与大多数商业程序的不同之处在于,它没有审局能力,那么它的棋力到底有多强?网友对这个问题众说纷纭,有人认为它无法跟一流的商业软件相比,毕竟ElephantEye是免费程序,其源代码又是公开的,为什么非要去和顶尖程序去比呢?也有人认为它能战胜中等商业软件,但电脑对电脑和电脑对人类根本就不是一回事,这么一个不懂得防守空头炮的程序怎能说它厉害呢?还有人喜欢在同一搜索水平(比如6层、8层或10层)上比较两个不同的程序,这种标准去比较“蛮力型”程序和“知识型”程序,这有意义吗?要正确认识这个问题,我想说明几点:(1) 测试标准要合理,这个标准只能是“时限”,即给两个程序以同样多的时间,可以对每步都限定时间,也可以是比赛所采用的时段制或加时制,而不能以同样的搜索水平作标准。
另外,如果两个程序运行在同一台电脑上,那么不能启用后台思考功能。
(2) 某几盘对局并不能说明问题,我以“浅红象棋”为平台用ElephantEye对阵“梦入神蛋”,ElephantEye遗憾地以2:3败北。
我有充分的信心表明ElephantEye的棋力比梦入神蛋强得多,因为两者用了相同的评价函数,但同样时间ElephantEye通常要比梦入神蛋多搜索一层以上,那么2:3的比分又能说明什么问题呢?(3) 跟人类比和跟电脑比是两回事,每个电脑程序都有弱点,这些弱点很容易被人类棋手抓住,但其他电脑程序则不会抓住你的弱点。
一般认为,知识缺乏的程序弱点也多(例如ElephantEye不懂得防守空头炮),因此对阵人类棋手失败的几率要比对阵其他程序高得多。
1.3 ElephantEye对象棋有哪些认识?要说ElephantEye一点象棋知识都不具备,这种观点我是无法接受的。
很多搜索算法确实只能用在象棋上,这一点ElephantEye做得比很多商业程序都好,这些算法体现在以下几个方面:(1) 杀棋局面在置换表中的特殊处理,这使得ElephantEye识别杀棋的速度快了很多;(2) 将军扩展,这使得ElephantEye对可能有杀棋的线路特别感兴趣,它会在搜索上增加对这些路线的投入;(3) 带检验的适应性空着裁剪,这个算法首先由一个以色列学者发表于2002年(不是“适应性”的),最近我对该算法作了改进,使得它能正确处理残局中的等着杀和连等着杀,速度也快了很多。
这些算法使得ElephantEye有很强的处理杀局和残局的能力,我相信绝大多数商业软件都没它做得好。
如果一个程序能在很短的时间内告诉你,几步之后必定有一方会被将死,或者几步之后优势一方就可以破士或破象,那么这个程序的实用价值还算小吗?(二) 棋盘结构和着法生成器在阅读本章前,建议读者先阅读《象棋百科全书》网站中《对弈程序基本技术》专题的以下几篇译文:(1) 数据结构——简介(David Eppstein);(2) 数据结构——位棋盘(James Swafford);(3) 数据结构——旋转的位棋盘(James Swafford);(4) 数据结构——着法生成器(James Swafford);(5) 数据结构——0x88着法产生方法(Bruce Moreland);(6) 数据结构——Zobrist键值(Bruce Moreland);(7) 其他策略——重复检测(Bruce Moreland)。
2.1 局面和着法的表示局面是象棋程序的核心数据结构,除了要包括棋盘、棋子、哪方要走、着法生成的辅助结构、Zobrist键值等,还要包含一些历史着法,来判断重复局面。
ElephantEye的局面结构很庞大(见<ccstruct.h>),其中大部分存储空间是用来记录历史局面的。
struct CchessPosition {……int MoveNum;MoveStruct MoveList[MaxMoveNum]; // MaxMoveNum = 256char LoopHash[LoopHashMask + 1]; // LoopHashMask + 1 = 1024……}其中MoveStruct这个结构记录了四个信息:(1) 着法的起始格(Src),(2) 着法的目标格(Dst),(3) 着法吃掉的棋子(Cpt),(4) 着法是否将军(Chk)。
有意思的是,每个部分都只占一个字节,后两个部分(Cpt和Chk)与其说有特殊作用,不如说是为了凑一个32位整数。
在MoveStruct出现的很多地方(置换表、杀手着法表、着法生成表)里,这两项都是没作用的,而只有在CchessPosition结构的记录历史着法的堆栈中才有意义。
Cpt一项主要用在撤消着法上,它可以用来还原被吃的棋子,而Chk一项则可以记录当前局面是否处于将军状态。
ElephantEye是用MovePiece()函数来走棋的,每走完一步棋就做两次将军判断:第一次判断走完子的一方是否被将军,即Checked(Player),如果被将则立即撤消着法,并返回走子失败的信息;第二次判断要走的一方是否被将军,由于交换了走子方(即执行了Player = 1 Player),所以仍旧是Checked(Player),如果被将则Chk置为1,这个着法被压入历史着法堆栈。
因此LastMove().Chk就表示当前局面是否被将军。
2.2 循环着法的检测Cpt和Chk的另一个作用就是判断循环着法:ElephantEye判断循环着法时,依次从堆栈顶往前读,读到吃过子的着法(Cpt不为零)就结束;而是否有单方面长将的情况,则是通过每个着法的Chk一项来判断的。
在循环着法的检测中,我们感兴趣的不是Cpt和Chk,而是LoopHash结构,这是一个微型的置换表,用来记录历史局面。
ElephantEye在做循环着法的判断这之前,先去探测这个置换表,如果命中置换表,则说明可能存在重复局面(由于置换表可能有冲突,所以只是有这个可能),因而做循环检测;如果没有命中则肯定没有重复局面。
ElephantEye使用“归位检测法”来判断循环着法,即从最后一个着法开始,依次向前撤消着法,并记录每个移动过的棋子所在的格子。
如果所有移动过的棋子同时归位,那么循环着法就出现了。
因此<ccstruct.h>中的IsLoop()函数建立了两个归位数组,第一个记录了棋子的原始位置,第二个记录了新的位置,当两个位置重合时,说明棋子归位。
2.3 棋盘-棋子联系数组众所周知,棋盘的表示有两种方法。
一是做一个棋盘数组(例如Squares[10][9]),每个元素记录棋子的类型(包括空格);二是做一个棋子数组(例如Pieces[32]),每个元素记录棋子的位置(包括被吃的状态)。
如果一个程序同时使用这两个数组,那么着法生成的速度就可以快很多。
这就是“棋盘-棋子联系数组”,它的技术要点是:(1) 同时用棋盘数组和棋子数组表示一个局面,棋盘数组和棋子数组之间可以互相转换。
(2) 随时保持这两个数组之间的联系,棋子移动时必须同时更新这两个数组。
根据这两个原则,棋盘-棋子联系数组可以定义为:struct CchessPosition {int Squares[90];int Pieces[32];};棋子数组Pieces[48]是ElephantEye的一个特点,0到16没有作用,16到31代表红方棋子(16代表帅,17和18代表仕,依此类推,直到27到31代表兵),32到47代表黑方棋子(在红方基础上加16)。
这样,棋盘数组Squares[90]中的每个元素的意义就明确了,0代表没有棋子,16到31代表红方棋子,32到47代表黑方棋子。
这样表示的好处就是:它可以快速判断棋子的颜色,(Piece & 16)可以判断是否为红方棋子,(Piece & 32)可以判断是否为黑方棋子。
棋子数组Squares[90]存储的是每个棋子所在的格子,用“列x 10 + 行”表示(稍后再来解释为什么不用“行x 9 + 列”,红方最左边的车为0,黑方最左边的车为89。