⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 eveluation.cpp

📁 一个简单的象棋游戏
💻 CPP
📖 第 1 页 / 共 2 页
字号:
				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 + -