📄 eveluation.cpp
字号:
break;
}
y++;
}
x=i;
y=j-1;
while(y>=0)
{
if(board[y][x]==NOCHESS)
AddPoint(x,y);
else
{
//if(!lsSameSide(nChessID,board[y][x]))
AddPoint(x,y);
break;
}
y--;
}
break;
case R_PAWN:
x=i;
y=j-1;
if(y>=0)
AddPoint(x,y);
if(j<5)
{
y=j;
x=i+1;
if(x<9)
AddPoint(x,y);
y=j;
x=i-1;
if(x>=0)
AddPoint(x,y);
}
break;
case B_PAWN:
x=i;
y=j+1;
if(y<10)
AddPoint(x,y);
if(j>4)
{
y=j;
x=i+1;
if(x<9)
AddPoint(x,y);
y=j;
x=i-1;
if(x>=0)
AddPoint(x,y);
}
break;
case B_CANON:
case R_CANON:
x=i+1;
y=j;
flag=false;
while(x<9)
{
if(board[y][x]==NOCHESS)
{
if(!flag)
AddPoint(x,y);
}
else
{
if(!flag)
flag=true;
else
{
//if(!lsSameSide(nChessID,board[y][x]))
AddPoint(x,y);
break;
}
}
x++;
}
x=i-1;
y=j;
flag=false;
while(x>=0)
{
if(board[y][x]==NOCHESS)
{
if(!flag)
AddPoint(x,y);
}
else
{
if(!flag)
flag=true;
else
{
//if(!lsSameSide(nChessID,board[y][x]))
AddPoint(x,y);
break;
}
}
x--;
}
x=i;
y=j+1;
flag=false;
while(y<10)
{
if(board[y][x]==NOCHESS)
{
if(!flag)
AddPoint(x,y);
}
else
{
if(!flag)
flag=true;
else
{
//if(!lsSameSide(nChessID,board[y][x]))
AddPoint(x,y);
break;
}
}
y++;
}
x=i;
y=j-1;
flag=false;
while(y>=0)
{
if(board[y][x]==NOCHESS)
{
if(!flag)
AddPoint(x,y);
}
else
{
if(!flag)
flag=true;
else
{
//if(!lsSameSide(nChessID,board[y][x]))
AddPoint(x,y);
break;
}
}
y--;
}
break;
default:
break;
}
//CanTouch(0,4,4,1);
return nPosCount;
}
bool CEveluation::CanTouch(int FromX, int FromY, int ToX, int ToY)
{
int i,j;
//x=(s.x-10)/35;y=(s.y-10)/35;
int nMoveChessID,nTargeID,nFromY,nToY,nFromX,nToX;
//nMoveChessID=board.ChessBoard[FromX][FromY];
if(FromX==ToX&&FromY==ToY)
return false;
nToX=ToX;nToY=ToY;
nFromX=FromX;nFromY=FromY;
nMoveChessID=board.ChessBoard[nFromY][nFromX];
nTargeID=board.ChessBoard[nToY][nToX];
if(ToX<9&&ToY<10)
{
//if((nTargeID>7&&nMoveChessID>7||nTargeID<8&&nMoveChessID<8)&&nTargeID!=NOCHESS)
//return false;
switch(nMoveChessID)
{
case B_KING:
if(nTargeID==R_KING)
{
if(nFromX!=nToX)
return false;
//MessageBox(NULL,"到达!","检测",1);
for(i=nFromY+1;i<nToY;i++)
{
if(board.ChessBoard[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(nTargeID==B_KING)
{
if(nFromX!=nToX)
return false;
//MessageBox(NULL,"到达!","检测",1);
for(i=nFromY-1;i>nToY;i--)
{
if(board.ChessBoard[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(nFromY-nToY)!=1||abs(nFromX-nToX)!=1)
return false;
break;
case B_BISHOP:
if(nToY>2||nToX>5||nToX<3)
return false;
if(abs(nFromY-nToY)!=1||abs(nFromX-nToX)!=1)
return false;
break;
case R_ELEPHANT://红相
if(nToY<5)
return false;//相不能过河
if(abs(nFromY-nToY)!=2||abs(nFromX-nToX)!=2)
return false;//相走田字
if(board.ChessBoard[(nFromY+nToY)/2][(nFromX+nToX)/2]!=NOCHESS)
return false;//田中间有棋
break;
case B_ELEPHANT://红相
if(nToY>4)
return false;//相不能过河
if(abs(nFromY-nToY)!=2||abs(nFromX-nToX)!=2)
return false;//相走田字
if(board.ChessBoard[(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(abs(nFromY-nToY)+abs(nFromX-nToX)>1)
return false;//兵只走一步棋
break;
case R_PAWN://红兵
if(nToY>nFromY)
return false;//兵不回头
if(nFromY>4&&nFromY==nToY)
return false;//兵过河前只能往前走
if(abs(nFromY-nToY)+abs(nFromX-nToX)>1)
return false;//兵只走一步棋
break;
case B_CAR://车
case R_CAR:
if(nToY!=nFromY&&nFromX!=nToX)
return false;
if(nFromY==nToY)
{
if(nFromX<nToX)
{
for(i=nFromX+1;i<nToX;i++)
if(board.ChessBoard[nFromY][i]!=NOCHESS)
return false;
}
else
{
for(i=nToX+1;i<nFromX;i++)
if(board.ChessBoard[nFromY][i]!=NOCHESS)
return false;
}
}
else
{
if(nFromY<nToY)
{
for(j=nFromY+1;j<nToY;j++)
if(board.ChessBoard[j][nFromX]!=NOCHESS)
return false;
}
else
{
for(j=nToY+1;j<nFromY;j++)
if(board.ChessBoard[j][nFromX]!=NOCHESS)
return false;
}
}
break;
case B_HORSE:
case R_HORSE:
if(!((abs(nFromX-nToX)==1&&abs(nFromY-nToY)==2)||
(abs(nFromX-nToX)==2&&abs(nFromY-nToY)==1)))
return false;
//MessageBox(NULL,"到达!","检测",1);
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(board.ChessBoard[j][i]!=NOCHESS)
return false;//绊马腿
break;
case B_CANON:
case R_CANON:
if(nFromX!=nToX&&nFromY!=nToY)
return false;//炮走直线
//炮不吃子时,中间不能有棋
if(board.ChessBoard[nToY][nToX]==NOCHESS)
{
//MessageBox(NULL,"到达!","检测",1);
if(nFromY==nToY)
{
if(nFromX<nToX)
{
for(i=nFromX+1;i<nToX;i++)
if(board.ChessBoard[nFromY][i]!=NOCHESS)
return false;
}
else
{
for(i=nToX+1;i<nFromX;i++)
if(board.ChessBoard[nFromY][i]!=NOCHESS)
return false;
}
}
else
{
if(nFromY<nToY)
{
for(j=nFromY+1;j<nToY;j++)
if(board.ChessBoard[j][nFromX]!=NOCHESS)
return false;
}
else
{
for(j=nToY+1;j<nFromY;j++)
if(board.ChessBoard[j][nFromX]!=NOCHESS)
return false;
}
}
}
else//炮吃子时
{
int count=0;
if(nFromY==nToY)
{
if(nFromX<nToX)
{
for(i=nFromX+1;i<nToX;i++)
if(board.ChessBoard[nFromY][i]!=NOCHESS)
count++;
if(count!=1)
return false;
}
else
{
for(i=nToX+1;i<nFromX;i++)
if(board.ChessBoard[nFromY][i]!=NOCHESS)
count++;
if(count!=1)
return false;
}
}
else
{
if(nFromY<nToY)
{
for(j=nFromY+1;j<nToY;j++)
if(board.ChessBoard[j][nFromX]!=NOCHESS)
count++;
if(count!=1)
return false;
}
else
{
for(j=nToY+1;j<nFromY;j++)
if(board.ChessBoard[j][nFromX]!=NOCHESS)
count++;
if(count!=1)
return false;
}
}
}
}
/*if(!flag)
{
site[ChessID].x=s.x;site[ChessID].y=s.y;
board.ChessBoard[nFromY][nFromX]=0;
board.ChessBoard[nToY][nToX]=nMoveChessID;
if(nTargeID!=NOCHESS)
site[ID].flag=false;
}*/
return true;
}
return false;
}
void CEveluation::AddPoint(int x, int y)
{
RelatPos[nPosCount].x=x;
RelatPos[nPosCount].y=y;
nPosCount++;
}
int CEveluation::GetBinValue(int x, int y, int board[][9])
{
if(board[x][y]==R_PAWN)
return BA0[x][y];
if(board[x][y]==B_PAWN)
return BA1[x][y];
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -