国际象棋软件和象棋软件哪个的算法要复杂些?

国际象棋软件和象棋软件哪个的算法要复杂些?,第1张

国际象棋要复杂,看规则多少

象棋:

第一章 行棋规定

第1条 棋盘棋子

1.1象棋盘由九道直线和十道横线交叉组成。棋盘上共有九十个交叉点,象棋子就摆在和活动在这些交叉点上。

棋盘中间没有划通直线的地方,叫做“河界”;划有斜交叉线的地方,叫做“九宫”。

九道直线,红棋方面从右到左用中文数字一至九来代表;黑棋方面用阿拉伯数字1至9来代表。

1.2 棋子共有三十二个,分为红、黑两组,每组共十六个,各分七种,其名称和数目如下: 象棋的摆法

红棋子:帅一个,车、马、炮、相、士各两个,兵五个。

黑棋子:将一个,车、马、炮、象、士各两个,卒五个。

1.3 对局开始前,双方棋子在棋盘上的摆法见右图(印刷体棋图规定:红方棋子在下,用阳文;黑方棋子在上,用阴文)。

1.4 比赛用的标准棋盘,应每格都为正方形,每方格长宽均应为3.2至4.6cm。每个平面圆形棋子直径应为2.7至3.2cm,大小与棋盘合适配套。棋盘和棋子底色,均应为白色或浅色。棋盘上直线和横线应为红色或深色,四周应有适当空白面积。棋子面色分为红黑两组,字体和圆框应当醒目。

演示比赛用的大棋盘为直式,红方在下,黑方在上。棋盘和棋子大小,应配合场所相应增大。

第2条 走棋和吃子

2.1 对局时,由执红棋的一方先走,双方轮流各走一着,直至分出胜、负、和,对局即终了。

轮到走棋的一方,将某个棋子从一个交叉点走到另一个交叉点,或者吃掉对方的棋子而占领其交叉点,都算走了一着。

双方各走一着,称为一个回合。

2.2 各种棋子的走法如下:

帅(将)每一着只许走一步,前进、后退、横走都可以,但不能走出“九宫”。将和帅不准在同一直线上直接对面,如一方已先占据,另一方必须回避。

士每一着只许沿“九宫”斜线走一步,可进可退。

相(象)不能越过“河界”,每一着斜走两步,可进可退,即俗称“相(象)走田字”。当田字中心有别的棋子时,俗称“塞(相)象眼”,则不许走过去。

马每着走一直(或一横)一斜,可进可退,即俗称“马走日字”。如果在要去的方向有别的棋子挡住。俗称“蹩马腿”,则不许走过去。

车每一着可以直进、直退、横走,不限步数。

炮在不吃子的时候,走法同车一样。

兵(卒)在没有过“河界”前,每着只许向前直走一步;过“河界”后,每着可向前直走或横走一步,但不能后退。

2.3 走一着棋时,如果己方棋子能够走到的位置有对方棋子存在,就可以把对方棋子吃掉而占领那个位置。只有炮吃子时必须隔一个棋子(无论是哪一方的)跳吃,即俗称“炮打隔子”。

除帅(将)外其他棋子都可以听任对方吃,或主动送吃。吃子的一方,必须立即把被吃掉的棋子从棋盘上拿走。

第3条 将死和困毙

3.1 一方的棋子攻击对方的帅(将),并在下一着要把它吃掉,称为“照将”,或简称“将”。“照将”不必声明。

被“照将”的一方必须立即“应将”,即用自己的着法去化解被“将”的状态。

如果被“照将”而无法“应将”,就算被“将死”。

3.2 轮到走棋的一方,无子可走,就算被“困毙”。

第4条 胜、负、和

4.1 对局时一方出现下列情况之一,为输棋(负),对方取胜;

4.1.1 帅(将)被对方“将死”。

4.1.2 走棋后形成帅(将)直接对面。

4.1.3 被“困毙”。

4.1.4 在规定的时限内未走满规定的着数。

4. 1.5 超过了比赛规定的迟到判负时限。

4. 1.6 走棋违反行棋规定。

4.1.7 走棋违反禁例,应变着而不变。

4.1.8 在同一棋局中,三次“犯规”。

4.1.9 自己宣布认输。

4.1.10 在对局中拒绝遵守本规则或严重违反纪律。

4.2 出现下列情况之一,为和棋:

4.2.1 双方均无可能取胜的简单局势。

4.2.2 一方提议作和,另一方表示同意。

4.2.3 双方走棋出现循环反复三次,符合“棋例”中“不变作和”的有关规定。

4.2.4 符合自然限着的回合规定,即在连续60个回合中(也可根据比赛等级酌减),双方都没有吃过一个棋子。

国际象棋:

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

比赛规定:

一方的王受到对方棋子攻击时,成为王被照将,攻击方称为"将军",此时被攻击方必须立即"应将",如果无法避开将军,王即被将死。除"将死"外,还有"超时判负"与"和局"。出现以下情况,算和局:

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

双方都无法将死对方王时,判和;

一方连续不断将军,对方王却无法避开将军时,成为"长将和";

轮到一方走棋,王没有被将军,但却没有任何棋子可以移动,成为"逼和";

对局中同一局面出现三次,而且每次都是同一方走的,判为和局。

棋盘和棋子

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

中文全称 国王 皇后 城堡 主教 骑士 兵卒

英文全称 King Queen Rook Bishop Knight Pawn

中文简称 王 后 车 象 马 兵

英文简称 K Q R B N P

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

布子规则:

对于初学者,摆棋时记住:王对王,后对后;白后站白格,黑后站黑格。黑王站白格,白王站黑格。

注意:比赛时为了便于记忆和记录,布置棋盘时总是让自己的右下角是白色格。

走子规则:

· 王:横、直、斜都可以走,但每次限走一步。

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

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

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

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

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

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

(5)不符合规则的易位: 王已经移动过,或者 用来易位的车已经移动过.

(6)下列情况暂不能易位: 王的原始格子或者将要越过的格子或者将要占据的格子正受到对方棋子的攻击,或者王和用来易位的车之间尚有别的棋子

· 后:横、直、斜都可以走,步数不受限制,但不能越子。它是国际象棋中威力最大的子。

· 车:横、竖均可以走,步数不受限制,不能斜走。一般情况下不能越子。

· 象:只能斜走。格数不限,不能越子。每方有两象,一个占白格,一个占黑格。

· 马:每步棋先横走或直走一格,然后再斜走一格(每次斜走六个正方格子),可以越子,没有"中国象棋"中"蹩马腿"的限制。

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

特殊着法:

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

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

·兵的升变:任何一个兵直进达到对方底线时,即可升变为除"王"和"兵"以外的任何一种棋子,不能不升变。一般情况下升变成为“后”因为“后”威力最大;在特殊情况下也可升变为“车”、“马”、“象” 。

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

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

王或车已经移动过;

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

王正被对方"将军";

王经过或达到的位置受对方棋子的攻击。

胜、负、和:

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

·一方轮走时,提议作和,对方同意;

·双方都无法将死对方王时,判和;

· 一方连续不断将军,对方王却无法避开将军时,成为“长将和”;

·轮到一方走棋,王没有被将军,但却无路可走,成为“逼和”;

· 对局中同一局面出现三次,而且每次都是同一方走的,并且没有任何可走棋步的差别,判为和局。

·双方在连续50回合内都没有吃掉对方任何一子的,判为和局。

(说明:“没有任何可走棋步的差别”主要指过路兵和易位,我记得见过一个NB的排局有一方就是在3次重复但对方车、王有移动后赢的~~~)

多下慢棋,最快也要50+20的慢棋。长期慢棋且复盘能提升棋感,很多棋你可以一眼看去就知道不是好棋,从而思考的时候能把这些奇怪的方向排除掉,专注于几个看似不错的选择,再分别计算。下的慢棋越多,每一步的方向就越少,这样计算深度就有了。

长期下去,尽管这样深度足够,但往往复盘的时候会发现思维盲点,有时候类似的情况下某种手段往往不成立,但特定的局面恰好成立。记住这样的手段组合,并且在类似的局面下计算该手段是否成立。

举个栗子:

黑的少俩卒子,如果出车红的炮八平七,黑方底象被红方瞄着,多少有点难受,如果黑方再补象,红方从容的走到车六进三的话,战线漫长,红方维持先手。以上是一般的行棋思路。

但如果你的思维扩展开来,黑方双炮位置相当不错,这时候就要有动刀子的觉悟了。

………… 车1平2

炮八平七 马4进5

车六进三 车2进9

仕五退六 炮4进7!

这一步代表的就是思维的广度:洞察对方的弱点,在看似不可能的地方果断出击一搏。此时红方如果选择交换,无论何种交换方式,红方都会落入下风残局。私以为此时车六平五吃马交换,红方虽然缺双士,但位置尚佳,仍可一战。但如果退车吃炮,红方简单落入下风残棋,显然不满。在他把网上的步时限制用完后,他果然选择了最强硬的招法:

5. 炮七退二 炮7进7!

这也在我计算之内,所以我毫不犹豫砸了出去。立时红方阵型千疮百孔。我和他比赛上只下过一盘,那盘我是靠循序渐进然后靠残局一点点赢下来的,他可能没感受过我进攻时的力量,难免不大适应。这几手他都把步时用完,也没想出好办法。

6. 相五退三 炮4平6

7. 相三进五 炮6平3

8. 相五退七 车2平3

9. 帅五进一 马5退6

至此黑方以一大子的代价,换取红方全部士相,且红方的2路弱马难以处理。最终在一系列顿挫下,二路马被抓死,红方被绝杀。

如果说打士这种棋靠的是思考广度,那么保证这个计划能实行则靠的是强大的计算能力。如果黑无法保证打士成立,那么恐怕出车就是一步很糟糕的棋了,例如黑出车后红炮八平七,黑如果走个车2进7,红方有马七退六的招法,轻而易举就能立于不败,黑方只能苦苦求和了。又比如说黑方没有计算清楚,打相时红方补士黑方的应手,黑方也仍然会血本无归。

慢棋的作用就是让你习惯于长考,练得多了自然计算深度就有了。而行棋的时候则要洞察对方的弱点,然后大胆出手。有时对方的弱点并不好找,这也是需要多下多练才能找到的。

这真的没有捷径,我所能提供的,只是在你盘数上去之后,有这样的思考方式能提升计算深度和广度。至于速度和精度,这完全是靠盘数堆叠才能得到的。

对于中国象棋,每一个字都有自己的规则,正所谓无规矩不成方圆。

棋盘先设定好,a:array[1..10][1..9] of MapStruct

是个二维数组,每个单元符全自定义的棋盘结构

不要定义一个棋字结构

int StepJudge(int oldx,int oldy,int nowx,int nowy)

/* oldx,oldy 棋字原来位置 */

/* oldx,oldy 棋字新位置 */

/* 判断从原位置到新位置的合法性 */

{

int index,count=0

int nox,noy

int x,y,x1,x2,y1,y2

BYTE ChessId /* 棋字是哪一方的,有RED,BLUE,NONE三种值 */

ChessId=map[oldx][oldy].Id

if(ChessId==NONE) return 0

if(oldx==nowx&&oldy==nowy) return 0

if(nowx>8||nowx<0||nowy<0||nowy>9) return 0

nox=nowx-oldxnoy=nowy-oldy

switch(map[oldx][oldy].num)

{

case 0:/*HeaderCapital*/将或帅

{

if(map[nowx][nowy].num==0&&map[nowx][nowy].Id!=NONE&&oldx==nowx)

{

/*Face to Face*/

y1=oldyy2=nowy

if(nowy<oldy) Swap(&y1,&y2)

for(y=y1+1y<y2y++) if(map[nowx][y].Id!=NONE) count++

if(count==0) return 1

}

if(abs(nox)>1||abs(noy)>1||abs(nox)==1&&abs(noy)==1) return 0

if(nowy>2&&nowy<7||nowx<3||nowx>5) return 0

break

}

case 14: case 15:/*Genaral*/车

{

if(abs(nox)!=0&&abs(noy)!=0) return 0

if(abs(nox)>1&&noy==0)

{

x1=oldxx2=nowx

if(nowx<oldx) Swap(&x1,&x2)

for(x=x1+1x<x2x++) if(map[x][nowy].Id!=NONE) return 0

}

if(nox==0&&abs(noy)>1)

{

y1=oldyy2=nowy

if(nowy<oldy) Swap(&y1,&y2)

for(y=y1+1y<y2y++) if(map[nowx][y].Id!=NONE) return 0

}

break

}

case 10: case 11:/*Horse*/马

{

if(abs(nox)==2&&abs(noy)==1||abs(nox)==1&&abs(noy)==2)

{

if(abs(nox)==1&&map[oldx][oldy+noy/2].Id!=NONE) return 0

if(abs(nox)==2&&map[oldx+nox/2][oldy].Id!=NONE) return 0

break

}

else return 0

}

case 12: case 13:/*Gun*/炮

{

if(abs(nox)>0&&abs(noy)>0) return 0

if(abs(nox)>0&&noy==0)

{

x1=oldxx2=nowx

if(nowx<oldx) Swap(&x1,&x2)

for(x=x1+1x<x2x++) if(map[x][nowy].Id!=NONE) count++

}

else if(nox==0&&abs(noy)>0)

{

y1=oldyy2=nowy

if(nowy<oldy) Swap(&y1,&y2)

for(y=y1+1y<y2y++) if(map[nowx][y].Id!=NONE) count++

}

if(count==0&&map[nowx][nowy].Id!=NONE) return 0

if(count==1&&map[nowx][nowy].Id==NONE) return 0

if(count>1) return 0

break

}

case 3: case 4:/*Minister*/象或相

{

if(abs(nox)!=2||abs(noy)!=2) return 0

else if(map[oldx+nox/2][oldy+noy/2].Id!=NONE) return 0

if(nowy==0||nowy==4||nowy==5||nowy==9)

if(nowx==2||nowx==6) break

if(nowy==2||nowy==7)

if(nowx==0||nowx==4||nowx==8) break

}

case 1: case 2:/*Shi*/士或仕

{

if(abs(nox)!=1||abs(noy)!=1) return 0

if(nowy>2&&nowy<7||nowx<3||nowx>5) return 0

break

}

case 5: case 6: case 7: case 8: case 9: /*Soldier*/兵或卒

{

if(abs(nox)>0&&abs(noy)>0) return 0

if(ChessId==GREEN&&GreenChess[0].y<3||ChessId==RED&&RedChess[0].y<3)

{

if(oldy>4)

{

if(nox==0&&noy!=1) return 0

if(abs(nox)!=1&&noy==0) return 0

}

if(oldy<5) if(nox!=0||noy!=1) return 0

}

if(ChessId==GREEN&&GreenChess[0].y>6||ChessId==RED&&RedChess[0].y>6)

{

if(oldy<5)

{

if(nox==0&&noy!=-1) return 0

if(abs(nox)!=1&&noy==0) return 0

}

if(oldy>4) if(nox!=0||noy!=-1) return 0

}

index=map[oldx][oldy].num

if(ChessId==GREEN)

if(GreenChess[0].y<3&&GreenChess[index].y>4||GreenChess[0].y>6&&GreenChess[index].y<5)

GreenChess[index].FixLevel=ADVANCED_SOLDIER_LEVEL

if(ChessId==RED)

if(RedChess[0].y<3&&RedChess[index].y>4||RedChess[0].y>6&&RedChess[index].y<5)

RedChess[index].FixLevel=ADVANCED_SOLDIER_LEVEL//兵过河后等级值加1

break

}

}

if(ChessId==map[nowx][nowy].Id) return 2

else return 1

}

用c语言写的


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/11376614.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-15
下一篇2023-05-15

发表评论

登录后才能评论

评论列表(0条)

    保存