棋盘先设定好,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 、各棋子的走法说明
将或帅
移动范围:它只能在王宫内移动。
移动规则:它每一步只可以水平或垂直移动一点。
士
移动范围:它只能在王宫内移动。
移动规则:它每一步只可以沿对角线方向移动一点。
象
移动范围:河界的一侧。
移动规则:它每一步只可以沿对角线方向移动两点,另外,在移动的过程中不能够穿越障碍。
马
移动范围:任何位置
移动规则:每一步只可以水平或垂直移动一点,再按对角线方面向左或者右移动。另外,在移动的过程中不能够穿越障碍。
车
移动范围:任何位置
移动规则:可以水平或垂直方向移动任意个无阻碍的点。
炮
移动范围:任何位置
移动规则:移动起来和车很相似,但它必须跳过一个颂氏棋子来吃掉对方的一个棋子。
兵
移动范围:任何位置
移动规则:每步只能向前移动一点。过河以后,它便增加了向左右移动的能力,兵不允许向后移动。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)