中国象棋算法

中国象棋算法,第1张

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

棋盘先设定好,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语言写的

一.游戏简介

中国象棋是中国一种流传十分广泛的游戏。下棋双方根据自己对棋局形式的理解和对棋艺规律的掌握,调动车马,组织兵力,协调作战在棋盘--这块特定的战野返场上进行着象征性的军事战斗。

二、规则介绍

以下一些名词是中国象棋的一些棋盘与棋子的说明:

1 、棋盘

棋子活动的场所,叫做 " 棋盘 " ,在长方形的平面上,绘有九条平行的竖线和十条平行的横线相交组成,共九十个交叉点,棋子就摆在这些交叉点上。中间第五、第六两横线之间未画竖线的空白地带,称为 " 河界 " ,整个颂樱饥棋盘就以 " 河界 " 分为相等的两部分;两方将帅坐镇、画有 " 米 " 字方格的地方,叫做 " 九宫 " 。

2 、棋子

象棋的棋子共三十二个,分为红黑两组,各十六个,由对弈双方各执一组,每组兵种是一样的,各分为七种:

红方:帅 (1) 、仕 (2) 、相 (2) 、车 (2) 、马 (2) 、炮 (2) 、兵 (5)

黑方:将 (1) 、士 (2) 、象 (2) 、车 (2) 、马 (2) 、炮 (2) 、卒 (5)

其中帅与将、仕与士、相与象、兵与卒的作用完全相同,仅仅是为了区分红棋和黑棋。

3 、各棋子的走法说明

将或帅

移动范围:它只能在王宫内移动。

移动规则:它每一步只可以水平或垂直移动一点。

移动范围:它只能在王宫内移动。

移动规则:它每一步只可以沿对角线方向移动一点。

移动范围:河界的一侧。

移动规则:它每一步只可以沿对角线方向移动两点,另外,在移动的过程中不能够穿越障碍。

移动范围:任何位置

移动规则:每一步只可以水平或垂直移动一点,再按对角线方面向左或者右移动。另外,在移动的过程中不能够穿越障碍。

移动范围:任何位置

移动规则:可以水平或垂直方向移动任意个无阻碍的点。

移动范围:任何位置

移动规则:移动起来和车很相似,但它必须跳过一个颂氏棋子来吃掉对方的一个棋子。

移动范围:任何位置

移动规则:每步只能向前移动一点。过河以后,它便增加了向左右移动的能力,兵不允许向后移动。


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

原文地址: http://outofmemory.cn/yw/12334728.html

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

发表评论

登录后才能评论

评论列表(0条)

保存