中国象棋算法
中国象棋和棋规则权威解释
中国象棋和棋规则权威解释中国象棋是一种古老的棋类游戏,也被称为象棋。
它是中国文化的瑰宝之一,流传至今已有几千年的历史。
中国象棋有其独特的规则和特点,下面将对中国象棋的规则进行权威解释。
一、棋盘和棋子中国象棋的棋盘是一个长方形,由十条平行线和九条垂直线组成,交叉形成九九八十一个交叉点。
棋盘分为红黑两部分,每个玩家控制一个颜色。
“红棋”位于棋盘的下方,而“黑棋”位于棋盘的上方。
中国象棋共有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.双方均为允许着法,双方不变作和。
中国象棋将帅算法
– – – – –
– – – – – – –
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)
中国象棋比赛规则:2020年最新编辑
中国象棋比赛规则:2020年最新编辑1. 简介中国象棋,亦称“国际象棋”,是一种两人对弈的策略性棋类游戏。
它源远流长,深受我国人民喜爱。
本规则旨在为象棋比赛提供一套统一、明确的竞赛准则。
2. 棋盘与棋子2.1 棋盘象棋棋盘由横、竖各九条线组成,共八十一个交叉点。
棋盘两端各有一个“井”字形图案,称为“九宫”。
2.2 棋子象棋共有七种棋子,分别为:将(帅)、士(仕)、象(相)、马、车(車)、炮(砲)和卒(兵)。
每种棋子都有独特的走法。
3. 棋子的走法3.1 将(帅)将(帅)只能在九宫内移动,每次只能走一格,可沿横线、竖线或斜线移动。
3.2 士(仕)士(仕)只能在九宫内移动,每次只能走一格,可沿横线或竖线移动。
3.3 象(相)象(相)每次只能走“田”字形,即对角线加一格。
不可过河。
3.4 马马每次走“日”字形,即先横走或竖走一格,再斜走一格。
不可过河。
3.5 车(車)车(車)每次可以走直线,不限距离。
不可斜走。
3.6 炮(砲)炮(砲)每次可以走直线,但必须跳过一个棋子。
不可斜走。
3.7 卒(兵)卒(兵)只能向前走,每次一格。
过河后可以横走或竖走。
4. 比赛规则4.1 先后手比赛采用双方轮流走棋,先手为红方,后手为黑方。
4.2 胜负判定1. 将死对方将(帅)的一方为胜。
2. 双方达成和棋的条件:棋盘上所有棋子都走遍,双方都无法取胜。
4.3 和棋申请双方达成和棋共识后,可向裁判申请和棋。
裁判确认后,比赛结束。
4.4 限时比赛设置每方限时,如:红方25分钟,黑方20分钟。
超时的一方判负。
4.5 犯规1. 走棋犯规:走棋不符合棋子走法,判负。
2. 重复局面:比赛过程中,双方局面重复三次,判负。
5. 比赛纪律1. 选手应尊重对手,遵守比赛秩序。
2. 选手在比赛过程中不得交流,不得查看手机或其他资料。
3. 选手超时、犯规或违规行为,裁判有权作出判罚。
6. 附则本规则解释权归比赛主办方所有。
如有未尽事宜,由主办方和裁判共同协商解决。
象棋的基本规则及杀法介绍
象棋的基本规则及杀法介绍推荐文章中国象棋基本杀法大全热度:象棋基本杀法全集_象棋基本杀法大全热度:中国象棋基本杀法热度:中国象棋基本杀法之侧面虎热度:中国象棋基本杀法热度:中国象棋源远流长,中国哲学博大精深,其中关于象棋的规则更是很多。
下面是有象棋的基本规则及杀法介绍,欢迎参阅。
中国象棋的基本规则及杀法介绍工具/原料中国象棋一副两个人方法/步骤中国象棋有32个棋子,每人16个。
红方为车马相仕炮各2个兵5个帅一个。
黑方为车马象士炮各2个卒*5 将一枚。
其中象=相士=仕卒=兵将=帅。
当一方将对方的将(帅)吃掉或者对方认输则算赢下面我们挨个介绍一些各个棋子怎么用的!首先说几句我们当时的玩法口诀:马走日,相走田,炮打隔山,小卒过河不回还。
車走直线。
我们就先说一下車吧!車走直线,就是車可以直接上下走,左右走,但是必须是直线。
我来演示一下如下图車可以往上走一格或者两格。
左右走并且这些线路上的对方的任何棋子,車都可以吃掉。
下面说马马走日就是马走的是日字格马可以走两种。
另外还要注意一点就是別马腿,就是如果有一格棋子挨着马这个马可以去A,但是不能去B。
这是马的一种特殊情况!这个很有用的!相(象)走田就是相(象)走的是田字格我还是用红方演示就是图示的相可以去箭头所示的两个位置。
另外还有一个情况就是別象眼就是出现图2的情况的时候,其中红炮就是別了相眼,相只能左边田字不能右边田字了士(仕)走斜线,而且不能出去如图一所示的范围内!走法图一范围图二当然就更不可能过河了!将(帅)走直线一次只能走一格如图1 一个箭头是走一次范围和士一样炮打隔山就是如果炮想杀对方的棋子,必须中间隔一个棋子(这个棋子是谁的无所谓)。
如下图所示红炮可以隔着自己的兵打掉对方的卒子。
卒(兵)子过河不回还就是卒(兵)只能前进不能后退而且在自己地盘不能左右走动,必须过了河到对方的地盘才能左右走动,但是永远不能后退。
每次只能走一格。
象棋基本杀法1.挂角马就是你的马跳到如图示的位置就可以挂角杀了!然后配合自己的車炮等就可以将对方的将杀了!2.双炮将军这个如果你能走到这个地步那就厉害了!图示的对方可以跳马但是如果对方这个地方没有马就必输了3.双車杀将就是用两个車来对方地盘将军假设中间没有对方的棋子車就可以直接将死对方!。
中国象棋规则
中国象棋规则中国象棋规则(通用5篇)中国象棋规则篇11、认识棋盘和棋子棋盘棋子活动的场所,叫做"棋盘",在长方形的平面上,绘有九条平行的竖线和十条平行的横线相交组成,共九十个交叉点,棋子就摆在这些交叉点上。
中间第五、第六两横线之间未画竖线的空白地带,称为"河界",整个棋盘就以"河界"分为相等的两部分;两方将帅坐镇、画有"米"字方格的地方,叫做"九宫"。
棋子象棋的棋子共三十二个,分为红黑两组,各十六个,由对弈双方各执一组,每组兵种是一样的,各分为七种:红方:帅(1)、仕(2)、相(2)、车(2)、马(2)、炮(2)、兵(5)黑方:将(1)、士(2)、象(2)、车(2)、马(2)、炮(2)、卒(5)2、走棋和吃子对局时,由执红棋的一方先走,双方轮流各走一着,直至分出胜、负、和,对局即终了。
轮到走棋的一方,将某个棋子从一个交叉点走到另一个交叉点,或者吃掉对方的棋子而占领其交叉点,都算走一着。
双方各走一着,称为一个回合。
各种棋子的走法帅(将):帅和将是棋中的首脑,是双方竭力争夺的目标。
它只能在"九宫"之内活动,可上可下,可左可右,每次走动只能按竖线或横线走动一格。
帅与将不能在同一直线上直接对面,否则走方判负。
仕(士):仕(士)是帅(将)的贴身保镖,它也只能在九宫内走动。
它的行棋路径只能是九宫内的斜线。
相(象):相(象)的主要作用是防守,保护自己的帅(将)。
它的走法是每次循对角线走两格,俗称"象走田"。
相(象)的活动范围限于"河界"以内的本方阵地,不能过河,且如果它走的"田"字中央有一个棋子,就不能走,俗称"塞象眼"。
车:车在象棋中威力最大,无论横线、竖线均可行走,只要无子阻拦,步数不受限制。
因此,一车可以控制十七个点,故有"一车十子寒"之称。
中国象棋比赛规则解读
中国象棋比赛规则解读
中国象棋是一种受到广泛喜爱的传统棋类游戏。
为了确保比赛
的公平性和规范性,制定了一系列的比赛规则。
本文将对中国象棋
的比赛规则进行解读。
1. 棋盘和棋子:
- 棋盘为正方形,由64个交叉点组成,分为红方和黑方两部分。
- 棋子共有32枚,红色的为红方棋子,黑色的为黑方棋子。
- 每个棋子具有特定的走法和攻击方式。
2. 比赛目标:
- 比赛的目标是将对方的“将”棋吃掉,达到击败对手的目的。
- 如果自己的“将”棋被对方吃掉,则比赛失败。
3. 走棋规则:
- 每次走棋,只能移动一枚己方棋子,并遵循特定的走法。
- 走法包括直线走、斜线走、马走日、象走田、士走斜线、帅
走直线等多种类型。
- 棋子之间不能相互穿越和叠放,除非进行特殊的吃子操作。
4. 吃子规则:
- 当己方棋子走到同一位置的敌方棋子时,可以选择进行吃子操作。
- 各个棋子有不同的吃子方式,如炮的炮吃、车的直线吃等。
- 对方的棋子被吃掉后,从棋盘上移除。
5. 特殊规则:
- 过河兵变:当兵过河后,可以向前直线移动。
当兵到达对方底线后,可以选择变成其他棋子。
- 将军和将死:将军是指对方的“将”棋处于被威胁的状态,需立即采取行动。
将死是指己方的“将”棋处于无法躲避对方攻击的状态。
- 和棋:比赛中如果出现双方无法杀死对方“将”棋的情况,即为和棋。
通过本文的解读,我们可以更加清楚地了解中国象棋比赛的规则,以提高我们参与比赛的水平和素养。
(字数:218)。
中国象棋规则有哪些_中国象棋规则
中国象棋规则有哪些_中国象棋规则中国象棋是起源于春秋战国,历经了上千年时间沉淀的一种棋类智力游戏,那么你知道象棋的规则吗?下面是有中国象棋规则,欢迎参阅。
第1条走棋规则1.1 对局时,由执红棋的一方先走,双方轮流各走一着,直至分出胜、负、和,对局即终了。
轮到走棋的一方,将某个棋子从一个交叉点走到另一个交叉点,或者吃掉对方的棋子而占领其交叉点,都算走了一着。
双方各走一着,称为一个回合。
1.2 各种棋子的走法如下:帅(将)每一着只许走一步,前进、后退、横走都可以,但不能走出“九宫”。
将和帅不准在同一直线上直接对面,如一方已先占据,另一方必须回避。
士每一着只许沿“九宫”斜线走一步,可进可退。
相(象)不能越过“河界”,每一着斜走两步,可进可退,即俗称“相(象)走田字”。
当田字中心有别的棋子时,俗称“塞(相)象眼”,则不许走过去。
马每着走一直(或一横)一斜,可进可退,即俗称“马走日字”。
如果在要去的方向有别的棋子挡住。
俗称“蹩马腿”,则不许走过去。
车每一着可以直进、直退、横走,不限步数。
炮在不吃子的时候,走法同车一样。
兵(卒)在没有过“河界”前,每着只许向前直走一步;过“河界”后,每着可向前直走或横走一步,但不能后退。
1.3 走一着棋时,如果己方棋子能够走到的位置有对方棋子存在,就可以把对方棋子吃掉而占领那个位置。
只有炮吃子时必须隔一个棋子跳吃,即俗称“炮打隔子”。
除帅(将)外其他棋子都可以听任对方吃,或主动送吃。
吃子的一方,必须立即把被吃掉的棋子从棋盘上拿走。
口语歌:马走日字,象飞田。
车走直路,炮翻山。
士走斜路护将边,小卒子一去不回还。
车走直路马踏斜,相飞田子炮打隔,卒子过河了不得。
第2条将死和困毙2.1 一方的棋子攻击对方的帅(将),并在下一着要把它吃掉,称为“照将”,或简称“将”。
“照将”不必声明。
被“照将”的一方必须立即“应将”,即用自己的着法去化解被“将”的状态。
如果被“照将”而无法“应将”,就算被“将死”。
象棋中常用的最小值最大值算法及剪枝算法
象棋中常⽤的最⼩值最⼤值算法及剪枝算法1.象棋中通常需要推算当前局⾯下,每⾛⼀步之后的局⾯分,通常我们可以设定考虑⼏步棋,通常我们所说的算棋,⽽计算机的AI算法中最常⽤的就是最⼤值最⼩值算法,⽽剪枝算法是对最⼤值最⼩值算法的⼀种优化。
如上图所⽰:1.如果在当前局⾯下,假设有三步可⾛的棋,⾛完之后得到的局⾯分分别为100,80,90,如果仅考虑⼀步的情况下,当然是选100所对应的棋⾛,这是最简单也是最短视的⾛法,这样的AI会让⼈认为太笨了。
此时level=12.如果考虑两步棋的情况,⾛完第⼀步之后,轮到对⽅⾛了,对⽅⾛完之后,此时的局⾯分是第三层的分,可能的⾛法有:⾛100分⽀的话,有三种可能:60,10,40,⾛80分⽀的话,有:50,30,20,⾛90分⽀的话,有:40,50,30,假设我们都不傻,都会挑使对⽅最不利的棋⾛,因此⾛100分⽀的话,对⽅可定会⾛10分⽀,如果⾛80分⽀的话,对⽅肯定⾛20分⽀,如果⾛90分⽀的话,对⽅肯定⾛30分⽀,因此我们为了使⾛两步之后(仅考虑2步,level=2),⾃⼰获得的局⾯分最⼤,使⾃⼰最有利,则必须⾛90分⽀,这样的话,对⽅⽆论怎么⾛,得到的最⼩值局⾯分都是30,都⽐⾛其他分⽀(100和80)的最⼩值要⼤。
这就是最⼩值最⼤值算法。
3.如果考虑三步棋的情况,此时level=3,到第四层局⾯的时候,此时level=0,即只需要直接计算当前每个分⽀的局⾯分即可,得到:15,35,8,9,25,15,34,25,8,20,18,10,7,14,32,21,16,15,此时我们如何⾛才最有利呢?a.假设第⼀步⾛100分⽀,则对⽅肯定⾛10分⽀,此时我们只能⾛9分⽀(getMaxScore),b.如果第⼀步⾛80分⽀,则对⽅肯定⾛20分⽀,此时我们只能⾛18分⽀(getMaxScore,获取最佳局⾯分)c.如果第⼀步⾛90分⽀,则对⽅肯定⾛30分⽀,此时我们只能⾛16分⽀(getMaxScore,获取最佳局⾯分)因此,我们只需要考虑在第四层中选取⼀个最⼤值即可。
中国象棋的比赛规则
中国象棋的比赛规则玩中国象棋,怎么能不知道中国象棋的比赛规则呢?这里有非常详细的规则解答哦,让你再也不用担心不知道规则。
以下是店铺为大家搜集整理提供到的中国象棋的比赛规则,希望对您有所帮助。
欢迎阅读参考学习!什么是中国象棋中国象棋是起源于中国的一种棋戏,属于二人对抗性游戏的一种,在中国有着悠久的历史。
由于用具简单,趣味性强,成为流行极为广泛的棋艺活动。
中国象棋比赛规则1.基本规则:遵循友谊第一,比赛第二的原则,讲究棋风、棋德,赛出风格,比出水平。
2.时间规定:比赛时用秒表或手表计算双方走棋时间。
每方走一着棋的时间不得超过秒,如有一着棋超过时间,判负。
3.对弈:在对局时,由执红棋的一方先走,双方轮流各走一着,直至分出胜负或走成和棋为止。
4.胜负判定:对局时,一方出现下列情况之一,就算输棋,对方得胜:(一)帅(将)被对方将死(二)帅(将)被将军,无法避免地同对方将(帅)直接对面(三)被困毙(四)同一局棋技术犯规两次判负(五)自己宣布认输5.对局时,出现下列情况之一,就算和棋:(一)属于理论上公认的双方均无取胜可能的局势;(二)提议作和,应使双方机会均等。
只要是一方提和,另一方已宣告同意,双方都不许反悔。
(三)双方走棋出现循环反复已达三次,符合棋例中不变作和的有关规定,可由任何一方提议作和,经审查局面属实,即使另一方不同意,裁判员也有权判为和棋。
如双方都没有提和,而循环反复局面还在延续,裁判员有权不征得双方同意就决定判和。
6、赛制与计分:本次比赛实行三局两胜制。
若出现平局现象,双方选择加赛一局或以抽签方式分出胜负。
7、分组抽签规则在前三轮比赛中每轮都采取抽签分组的方式,有一人为轮空,直接进入下一阶段比赛。
抽到红色数字扑克牌者执红棋先走。
第一轮比赛从两套数字1-6及一张K扑克牌中抽取,抽到K者为本轮比赛轮空,直接进入第二轮比赛。
其余抽到相同数字的二人分为一个组进行比赛。
第一轮比赛的胜者与轮空者重新进行抽签分组,从两套数字1-3及一张K扑克牌中抽取,抽到K者为本轮比赛轮空,直接进入第三轮比赛。
中国象棋如何计算?为什么李来群计算这么厉害?
中国象棋如何计算?为什么李来群计算这么厉害?象棋算法又称审势算法,大体可分为以下六类:1分析算法:分析局势条件,正确理解局面因素,从而识别棋局主要矛盾,以快择相应的战略战术或辅以着法分析。
最后做出对棋局估算的一种审势方法,2综合算法:是和上者相反的一种算法,上者是从面临的局势出发逐步进行分析,而综合算法却是从可能获得的最后形势出发,一路倒推过来,并确定从局势条件能否过度到理想局势的一种算法,3假设算法:通过自己的创造性想象力,将棋局中的某些条件做一个假设性的变形,从而估计,能否造成这一有利情况而最终夺取有力结果。
这种算法叫做假设算法。
前者把理想局面假设于战役的末尾,它的算法以倒推为主,而假设算法则把变形局面想象于战役中间,它的算法即有分析又有综合,顺推倒推相辅相成。
4除外算法:出于战略条件,局势因素或另有缘故,棋手崛弃其他选择,而单独估算与上述考虑相应的变路。
因此采用局外算法往往与棋手的,竞技策略有关,从思想上看,它与假设算法正好相反,而且本算法极需谨慎使用,如果不是万不得已,那么大可不必破釜沉舟,望险冒进。
5归错算法:排除一些明显或可能导致不利的变路,果敢的估算剩下的后选招法,即使某种候选招法的演化,是一个待定局面也好,因此这是一种尝试算法在某些性质上相反的一个审势估算方法。
6比较算法:在以上各种算法都难应用或效果欠佳时,可用比较算法,尽量估计自己面临待定局面的各路招法变化,比较他们的结果然后择优选用。
临局时应该综合运用以上各种算法,灵活的处理问题,以期取得最大利益,在特别复杂的棋局面前,在时间紧迫的条件下,选择算法可能要比,超时判负明智一些,选择时应择取变化复杂的棋路为宜。
李来群在象棋界巨大的成功,其实是从小的学棋精深分不开的,常常背着棋子在街边棋摊找高手下棋,常常是啃着干馒头,一下就是一天,常常因为下棋受到老师的教训。
在他那个年代,都认为下棋是没有出路的,他的父亲也是经常因为下棋揍他,后来下棋时间长了,受到名手秦连元的介绍,去参加比赛,经常比赛,李来群在象棋界混出名气,之后比赛中受到刘殿中的赏识,进了职业队训练,棋艺更是突飞猛进。
- 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。