📄 eveluation.cpp
字号:
}
//检查向下能否到达/保护
x=j;
y=i+1;
while(y<10)
{
if(NOCHESS==position[y][x])//空白
AddPoint(x,y);
else{
//碰到第一个棋子
AddPoint(x,y);
break;//后面的位置不能走了
}
y++;
}
//检查向上能否到达/保护
x=j;
y=i-1;
while(y>=0)
{
if(NOCHESS==position[y][x])//空白
AddPoint(x,y);
else{
//碰到第一个棋子
AddPoint(x,y);
break;//后面的位置不能走了
}
y--;
}
break;
case R_PAWN://红兵
//观看向前是否到底
y=i-1;
x=j;
if(y>=0)
AddPoint(x,y);//没到底,可走
if(i<5)
{
//如已过河
y=i;
x=j+1;//向右
if(x<9)
AddPoint(x,y);//未到右边,可走
x=j-1;//向左
if(x>=0)
AddPoint(x,y);//未到左边,可走
}
break;
case B_PAWN://黑卒
//观看向前是否到底
y=i+1;
x=j;
if(y<10)
AddPoint(x,y);//没到底,可走
if(i>4)
{
//如已过河
y=i;
x=j+1;//向右
if(x<9)
AddPoint(x,y);//未到右边,可走
x=j-1;//向左
if(x>=0)
AddPoint(x,y);//未到左边,可走
}
break;
case B_CANON://黑炮
case R_CANON://红炮
//检查向右能否到达/保护的位置
x=j+1;
y=i;
flag=FALSE;
while(x<9)
{
if(NOCHESS==position[y][x])
{
//空白位置
if(!flag)
AddPoint(x,y);
}
else
{
if(!flag)
flag=TRUE;//是第一个棋子
else
{
//是第二个棋子
AddPoint(x,y);
break;
}
}
x++;//继续向右
}
//检查向左能否到达/保护的位置
x=j-1;
y=i;
flag=FALSE;
while(x>=0)
{
if(NOCHESS==position[y][x])
{
//空白位置
if(!flag)
AddPoint(x,y);
}
else
{
if(!flag)
flag=TRUE;//是第一个棋子
else
{
//是第二个棋子
AddPoint(x,y);
break;
}
}
x--;//继续向左
}
//检查向下能否到达/保护的位置
x=j;
y=i+1;
flag=FALSE;
while(y<10)
{
if(NOCHESS==position[y][x])
{
//空白位置
if(!flag)
AddPoint(x,y);
}
else
{
if(!flag)
flag=TRUE;//是第一个棋子
else
{
//是第二个棋子
AddPoint(x,y);
break;
}
}
y++;//继续向下
}
//检查向上能否到达/保护的位置
x=j;
y=i-1;
flag=FALSE;
while(y>=0)
{
if(NOCHESS==position[y][x])
{
//空白位置
if(!flag)
AddPoint(x,y);
}
else
{
if(!flag)
flag=TRUE;//是第一个棋子
else
{
//是第二个棋子
AddPoint(x,y);
break;
}
}
y--;//继续向上
}
break;
default:
break;
}
return nPosCount;
}
bool CEveluation::CanTouch(BYTE position[][9], int nFromX, int nFromY, int nToX, int nToY)
{
int i,j;
int nMoveChessID,nTargetID;
if(nFromX==nToX && nFromY==nToY)
return false;//目的与源相同,非法
nMoveChessID=position[nFromX][nFromY];
nTargetID=position[nToX][nToY];
if(IsSameSide(nMoveChessID,nTargetID))
return false;//吃自己的棋,非法
switch(nMoveChessID)
{
case B_KING://黑将
if(nTargetID==R_KING)//判断是否将帅见面
{
if(nFromX!=nToX)//横坐标不相等
return false;//将帅不在同一列
for(i=nFromY+1;i<nToY;i++)
if(position[i][nFromX]!=NOCHESS)
return false;//中间隔有棋子
}
else
{
if(nToY>2 || nToX>5 || nToX<3)
return false;//目标点在九宫之外
if(abs(nFromY-nToY)+abs(nFromX-nToX)>1)
return false;//将帅只走一步直线
}
break;
case R_KING://红帅
if(nTargetID==B_KING)//判断是否将帅见面
{
if(nFromX!=nToX)//横坐标不相等
return false;//将帅不在同一列
for(i=nFromY-1;i>nToY;i--)
if(position[i][nFromX]!=NOCHESS)
return false;//中间隔有棋子
}
else
{
if(nToY<7 || nToX>5 || nToX<3)
return false;//目标点在九宫之外
if(abs(nFromY-nToY)+abs(nFromX-nToX)>1)
return false;//将帅只走一步直线
}
break;
case R_BISHOP://红士
if(nToY<7 || nToX>5 || nToX<3)
return false;//士出九宫
if(abs(nFromX-nToX)!=1 || abs(nFromY-nToY)!=1)
return false;//士走斜线
break;
case B_BISHOP://黑士
if(nToY>2 || nToX>5 || nToX<3)
return false;//士出九宫
if(abs(nFromX-nToX)!=1 || abs(nFromY-nToY)!=1)
return false;//士走斜线
break;
case R_ELEPHANT://红相
if(nToY<5)
return false;//相不能过河
if(abs(nFromX-nToX)!=2 || abs(nFromY-nToY)!=2)
return false;//相走田字
if(position[(nFromY +nToY)/2][(nFromX +nToX)/2]!=NOCHESS)
return FALSE;//相眼被塞
break;
case B_ELEPHANT://黑象
if(nToY>4)
return false;//象不能过河
if(abs(nFromX-nToX)!=2 || abs(nFromY-nToY)!=2)
return false;//象走田字
if(position[(nFromY +nToY)/2][(nFromX +nToX)/2]!=NOCHESS)
return FALSE;//象眼被塞
break;
case B_PAWN://黑卒
if(nToY<nFromY)
return false;//卒不能回头
if(nFromY<5 && nFromY==nToY)
return FALSE;//卒过河前只能直走
if(nToY-nFromY+abs(nToX -nFromX)>1)
return FALSE;//卒只走一步直线
break;
case R_PAWN://红兵
if(nToY<nFromY)
return false;//兵不能回头
if(nFromY>4 && nFromY==nToY)
return FALSE;//兵过河前只能直走
if(nToY-nFromY+abs(nToX -nFromX)>1)
return FALSE;//兵只走一步直线
break;
case B_CAR://黑车
case R_CAR://红车
if(nFromY!=nToY && nFromX!=nToX)
return FALSE;//车走直线
if(nFromY==nToY)
{
if(nFromX<nToX)
{
for(i=nFromX+1;i<nToX;i++)
if(position[nFromY][i]!=NOCHESS)
return FALSE;
}
else
{
for(i=nToX+1;i<nFromX;i++)
if(position[nFromY][i]!=NOCHESS)
return FALSE;
}
}
else
{
if(nFromY<nToY)
{
for(j=nFromY+1;j<nToY;j++)
if(position[j][nFromX]!=NOCHESS)
return FALSE;
}
else
{
for(j=nToY+1;j<nFromY;j++)
if(position[j][nFromX]!=NOCHESS)
return FALSE;
}
}
break;
case B_HORSE://黑马
case R_HORSE://红马
if(!((abs(nToX-nFromX)==1 && abs(nToY -nFromY)==2) || (abs(nToX-nFromX)==2&&abs(nToY -nFromY)==1)))
return FALSE;//马走日字
if(nToX-nFromX==2)
{
i=nFromX+1;
j=nFromY;
}
else
if(nFromX-nToX==2)
{
i=nFromX-1;
j=nFromY;
}
else
if(nToY-nFromY==2)
{
i=nFromX;
j=nFromY+1;
}
else
if(nFromY-nToY==2)
{
i=nFromX;
j=nFromY-1;
}
if(position[j][i]!=NOCHESS)
return FALSE;//绊马腿
break;
case B_CANON://黑炮
case R_CANON://红炮
if(nFromY!=nToY && nFromX!=nToX)
return FALSE;//炮走直线
//炮吃子时经过的路线中不能有棋子
if(position[nToY][nToX]==NOCHESS)
{
if(nFromY==nToY)
{
if(nFromX<nToX)
{
for(i=nFromX+1;i<nToX;i++)
if(position[nFromY][i]!=NOCHESS)
return FALSE;
}
else
{
for(i=nToX+1;i<nFromX;i++)
if(position[nFromY][i]!=NOCHESS)
return FALSE;
}
}
else
{
if(nFromY<nToY)
{
for(j=nFromY+1;j<nToY;j++)
if(position[j][nFromX]!=NOCHESS)
return FALSE;
}
else
{
for(j=nToY+1;j<nFromY;j++)
if(position[j][nFromX]!=NOCHESS)
return FALSE;
}
}
}
else//炮吃子时
{
int j=0;
if(nFromY==nToY)
{
if(nFromX<nToX)
{
for(i=nFromX+1;i<nToX;i++)
if(position[nFromY][i]!=NOCHESS)
j++;
if(j!=1)
return FALSE;
}
else
{
for(i=nToX+1;i<nFromX;i++)
if(position[nFromY][i]!=NOCHESS)
j++;
if(j!=1)
return FALSE;
}
}
else
{
if(nFromY<nToY)
{
for(j=nFromY+1;j<nToY;j++)
if(position[j][nFromX]!=NOCHESS)
j++;
if(j!=1)
return FALSE;
}
else
{
for(j=nToY+1;j<nFromY;j++)
if(position[j][nFromX]!=NOCHESS)
j++;
if(j!=1)
return FALSE;
}
}
}
break;
default:
return false;
}
return true;
}
void CEveluation::AddPoint(int x, int y)
{
RelatePos[nPosCount].x=x;
RelatePos[nPosCount].y=y;
nPosCount++;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -