吴昊品游戏核心算法 Round 8 —— 吴昊教你下国际象棋(复杂模拟)

 

历史】据现有史料记载,国际象棋的发展历史已将近2000年。关于它的起源,曾经有过多种不同的说法,诸如起源于中国、印 度、锡兰、波斯、阿拉伯国家等等。目前世界上多数棋史学家认为国际象棋最早出现在印度。 18世纪时,W.琼斯指出:古印度是国际象棋诞生的摇篮。大约公元 2~4世纪时,印度有一种叫作“恰图兰加”(chaturanga)的棋戏,内有车、马、象、兵 4种棋子,象征着印度古代的军制。在当时流传的印度叙事史诗《摩诃婆罗多》中,有"四军将士已安排"的诗句。四军”就是指军队分为车、象、马、兵 4个兵种。但作为今日国际象棋前身的这种“四方棋”,当时是由掷骰子的方法来进行的。游戏的目的也不是将死对方的王,而是吃掉对方全部棋子。  以梵语“恰 图兰加”命名的“四方棋”在 6世纪时由印度传入波斯,由于语音上的讹误,古波斯人把“恰图兰加”误读为“恰特兰格”(chatrang)。“恰特兰格” 就被阿拉伯人改称为“沙特兰兹” (shatranj),以后这种 “沙特兰兹” 在中亚和阿拉伯国家广泛流传。10世纪前后,阿拉伯国家已经出现了许多闻名一时的棋手。世界名著《一千零一夜》中,就曾提及哈里发何鲁纳·拉施德的宫廷诗 人里有一位著名棋手。公元 819年,在巴格达还举行过几个棋手的比赛。 

国际象棋大约在10世纪以后,经中亚和阿拉伯传到欧洲的各个地区,先传到意大利,然后是西班牙和法国。11世纪末叶,遍及欧洲各国。在当时的文献中,将国际象棋列为骑士教育的 “七艺” 之一。“七艺”是骑术、游泳、射箭、击剑、狩猎、赋诗和下棋。法国的英雄史诗《罗兰之歌》中,也谈及这一点。15、16世纪,国际象棋终于定型成今日的样式和棋制。现存最早的国际象棋谱,出版在1497年。 

国际象棋的着法有过许多次变革。早先,王的走法虽一样,但据说是可以被吃掉的。关于王车易位的特权是从16世纪上半叶才开始有的,这是欧洲人的一项创造发 明。皇后的名称、 性别和威力曾经有过多次奇妙的改变。在沙特拉兹时期,皇后这只棋子表示“律师”、“大臣”或“将军”。后来法国人把皇后一子的形式稍稍变了一下,成了现在 这样的女性。过去,皇后并不是最强的棋子,它只能斜走1格,与中国象棋的士非常类似。双方的皇后只能在不同颜色的格子上斜走,因此不能相遇。皇后具有现在 这样强大的威力,大约是在15世纪中叶以后。兵在过去只能前进1格,第1次走动时也一样,一直到16世纪初,兵的威力才提高到现在这样。兵到达第 8格,过去只能升变为皇后,不能升变成别的棋子。只有车和马的走法一直没有改变。至于国际象棋的棋盘,在13世纪以前是不分黑白格的。 

后汉明帝时(公元 1世纪下半叶),中国与印度开始正式交往,隋唐之后,文化交流更形频繁。中国的象棋与国际象棋着法类似,渊源相近,在过去的发展历史中可能互有影响。直到 今天,这两种象棋的车和马走法相同(只是国际象棋的马不受蹩腿的限制),基本规则也类似。现代国际象棋盘完全一样;河南开封出土的北宋铜质棋子,“士”的图案为身穿戎装的女子,和国际象棋里的皇后性别一样。

 

【规则】基本规定

国际象棋由黑白两棋组成,执白先行,国际象棋的对局目的是把对方的王将死

一方的王受到对方棋子攻击时,称为王被照将,攻击方称为"将军",此时被攻击方必须立即"应将"。如果无法避开将军,王即被将死,攻击方取胜。除"将死"外,还有"超时判负"与"和棋"。

棋盘和棋子

国际象棋棋盘是个正方形,由横纵各8格、颜色一深一浅交错排列的64个小方格组成。深色格称黑格,浅色格称白格,棋子就放在这些格子中移动,右下角是白格。棋子共三十二个,分为黑白两组,各十六个,由对弈双方各执一组,兵种是一样的,分为六种:

中文简称

中文全称

国王

皇后

城堡(战车)

主教(传教士)

骑士

近卫军

英文简称

K

Q

R

B

N

P

英文全称

King

Queen

Rook

Bishop

Knight

Pawn

数量

1

1

2

2

2

8

在比赛中,国际象棋棋子采用立体棋子,非正式的下棋可以采用平面图案的棋子。

布子规则

对于初学者,摆棋时记住:

右下角是白格,白后占白格,黑后占黑格。

走子规则

王(K):横、直、斜都可以走,但每次限走一步。不过,王是不可以送吃的,即任何被敌方控制的格子,己方王都不能走进去。否则,算"送王",犯规。三次就要判负。

(1)除易位时外,王可走到不被对方棋子攻击的任何相邻格子,而且只能走一步。

(2)易位是由王和己方任何一个车一起进行的仍被视作王的一着的走法,参见“特殊规则”(王车易位)。

后(Q):横、直、斜都可以走,步数不受限制,但不能越子。

车(R):横、竖均可以走,步数不受限制,不能斜走。除王车易位外不能越子。

象(B):只能斜走。格数不限,不能越子。开局时每方有两象,一个占白格,一个占黑格。

马(N):每步棋先横走或直走一格,然后再往外斜走一格;或者先斜走一格,最后再往外横走或竖走一格(即走“日”字)。可以越子,没有"中国象棋"的"蹩马腿"限制。

兵(P):只能向前直走,每着只能走一格。但走第一步时,可以走一格或两格。兵的吃子方法与行棋方向不一样,它是直走斜吃,即如果兵的斜进一格内有对方棋子,就可以吃掉它而占据该格。

特殊着法

除了上面所有棋子的一般着法外,国际象棋中存在下面三种特殊着法:

· 吃过路兵:如果对方的兵第一次行棋且直进两格,刚好形成本方有兵与其横向紧贴并列,则本方的兵可以立即斜进,把对方的兵吃掉。这个动作必须立刻进行,缓着后无效。记录时记为 “en passant” 或 “en pt”, 法语中表示 “路过”。

·兵的升变:任何一个兵直进达到对方底线时,即可升变为除"王"和"兵"以外的任何一种棋子,可升变为“后”、“车”、“马”、“象”,不能不变。这被视为一步棋。升变后按新棋子的规则走棋。

·王车易位:每局棋中,双方各有一次机会,让王朝车的方向移动两格,然后车越过王,放在与王紧邻的一格上。王车易位根据左右分为"长易位"和"短易位"。

在下面四种情况下,王车易位不允许:

王或对应的车已经移动过;

王和车之间有其他棋子阻隔;

王正被对方"将军";

王经过或到达的位置受对方棋子"将军"。

胜、负、和

· 国际象棋的对局目的是把对方的王将死。比赛规定:一方的王受到对方棋子攻击时,成为王被照将,攻击方称为“将军”,此时被攻击方必须立即“应将”,如果无法避开将军,王即被将死(长将除外)。除“将死”外,还有“超时判负”与“和局”。出现以下情况,算和局:

1.一方轮走时,提议作和,对方同意.

(注 意:一方提和时,必须在自己走棋的时间内提出和棋,同时走出自己的棋并按钟。任何提和都不可以撤回。对方在自己 的时间内思考是否和棋。同意,则口头声明;不同意,则拒绝或直接走棋。任何人都不能连续提和,即自己的提和被对方拒绝后若没有对方再次提和遭拒绝的话,那 么自己是不可以提和的。)

2.双方都无法将死对方王时,称为material或“死局”.

3.一方连续不断地将对方的王,且对方无力避免,这被称为“长将和”.

4.轮到一方走棋,王没有被将军,但却无路可走,称为stalemake或“逼和”.(吴昊评注:这种规则叫无子可动,这中国象棋不同)

5.对局中同一局面出现三次,而且每次都是同一方走的,并且没有任何可走棋步的差别,判为和局,称为"3 folder"或“三次重复”

6.双方在连续50回合内都没有吃掉对方任何一子,并且未移动一个兵的,判为和局。

 

  本 Round作为《吴昊品核心算法:中国象棋》的姊妹篇而存在,我这里叙述的时候,运用的方法类似,就是将计算机语言通过组织自然而然地翻译为自然语言,或 者,说是以相反的方式翻译。总之,和中国象棋的模拟类似,只是这次的模拟更复杂,毕竟,国际象棋比中国象棋的规则更多,虽然说它们两者的数据结构大同小 已,但由于其规则不同,算法也不一样。作为本例的Source,是来自中山大学第六届程序设计竞赛的第三题。ACM一般的代码行数不会超过150行 (3KB左右,长代码一般见于计算几何),但是,国际象棋的模拟排除在外,其规则的复杂程度决定了算法的复杂程度(注意了,是复杂程度,而不是复杂度)

  作为模拟算法,该Problem也是一个在后台运作的判胜负的程序,根据给出的双方的走子记录判定出当时的胜,平,负三种状态:

  (如下是我自己画的逻辑关系图)

 

你可能感兴趣的:(round)