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

📄 eveluation.cpp

📁 中国象棋源程序,该程序采用多种搜索算法实现了人机对弈的功能
💻 CPP
📖 第 1 页 / 共 2 页
字号:
			}

			//检查向下能否到达/保护
			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 + -