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

📄 movegenerator.cpp

📁 用c++ 开发的中国象棋
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// MoveGenerator.cpp: implementation of the CMoveGenerator class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "ChineseChess.h"
#include "MoveGenerator.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CMoveGenerator::CMoveGenerator()
{

}

CMoveGenerator::~CMoveGenerator()
{

}
int CMoveGenerator::AddMove(int nFromX,int nFromY,int nToX,int nToY,int nDeep,int ChessID)
{
	m_MoveList[nDeep][m_nMoveCount].pFrom.x=nFromX;
	m_MoveList[nDeep][m_nMoveCount].pFrom.y=nFromY;
	m_MoveList[nDeep][m_nMoveCount].pTo.x=nToX;
	m_MoveList[nDeep][m_nMoveCount].pTo.y=nToY;
	m_MoveList[nDeep][m_nMoveCount].ChessID=ChessID;
	m_nMoveCount++;

	return m_nMoveCount;
}

//nDeep指明当前搜索的层数,每层将走法存在不同的位置,以免覆盖
//nSide指明产生哪一方的走法,TRUE为红方,FALSE是黑方
int CMoveGenerator::CreatePossibleMove(BYTE position[][9],int nDeep,int nSide,int nUserChessColor)
{
	int ChessID;
	int i,j;

	m_nMoveCount=0;
	m_nUserChessColor=nUserChessColor;

	for(j=0;j<9;j++)
		for(i=0;i<10;i++)
		{
			if(position[i][j]!=NoChessMan)
			{
				ChessID=position[i][j];

				if(nUserChessColor==REDCHESS)
				{
					if(!nSide && IsRed(ChessID))
						continue;//如要产生黑棋走法,跳过红棋
					
					if(nSide && IsBlack(ChessID))
						continue;//如要产生红棋走法,跳过黑棋
				}
				else
				{
					if(nSide && IsRed(ChessID))
						continue;//如要产生黑棋走法,跳过红棋
					
					if(!nSide && IsBlack(ChessID))
						continue;//如要产生红棋走法,跳过黑棋
				}

				switch(ChessID)
				{
				case RedKing://红帅
					GenRedKingMove(position,i,j,nDeep);
					break;
				case BlackKing://黑将
					GenBlackKingMove(position,i,j,nDeep);
					break;

				case RedAssist://红士
					GenRedAssistMove(position,i,j,nDeep);
					break;
				
				case BlackAssist://黑士
					GenBlackAssistMove(position,i,j,nDeep);
					break;
				
				case RedBishop://红相
				case BlackBishop://黑象
					GenBishopMove(position,i,j,nDeep);
					break;
				
				case RedHouse://红马
				case BlackHouse://黑马
					GenHourseMove(position,i,j,nDeep);
					break;
				
				case RedRook://红车
				case BlackRook://黑车
					GenRookMove(position,i,j,nDeep);
					break;

				case RedSoldier://红兵
					GenRedSoldierMove(position,i,j,nDeep);
					break;
				
				case BlackSoldier://黑卒
					GenBlackSoldierMove(position,i,j,nDeep);
					break;
				
				case BlackGunner://黑炮
				case RedGunner://红炮
					GenGunnerMove(position,i,j,nDeep);
					break;
				
				default:
					break;
				}
			}
		}

	return m_nMoveCount;
}

void CMoveGenerator::GenRedKingMove(BYTE position[10][9],int i,int j,int nDeep)
{
	int x,y;	
	for(y=0;y<3;y++)
		for(x=3;x<6;x++)
			if(IsValidMove(position,j,i,x,y,m_nUserChessColor))
				AddMove(j,i,x,y,nDeep,position[i][j]);
}
void CMoveGenerator::GenBlackKingMove(BYTE position[10][9],int i,int j,int nDeep)
{
	int x,y;
	for(y=7;y<10;y++)
		for(x=3;x<6;x++)
			if(IsValidMove(position,j,i,x,y,m_nUserChessColor))
				AddMove(j,i,x,y,nDeep,position[i][j]);
}

//红士
void CMoveGenerator::GenRedAssistMove(BYTE position[10][9],int i,int j,int nDeep)
{
	int x,y;
	
	for(y=7;y<10;y++)
		for(x=3;x<6;x++)
			if(IsValidMove(position,j,i,x,y,m_nUserChessColor))
				AddMove(j,i,x,y,nDeep,position[i][j]);
}

//黑士
void CMoveGenerator::GenBlackAssistMove(BYTE position[10][9],int i,int j,int nDeep)
{
	int x,y;

	for(y=0;y<3;y++)
		for(x=3;x<6;x++)
			if(IsValidMove(position,j,i,x,y,m_nUserChessColor))
				AddMove(j,i,x,y,nDeep,position[i][j]);
}

//象
void CMoveGenerator::GenBishopMove(BYTE position[10][9],int i,int j,int nDeep)
{
	int x,y;
	
	//插入右下方的有效走法
	x=j+2;
	y=i+2;
	if(x<9 && y<10 && IsValidMove(position,j,i,x,y,m_nUserChessColor))
		AddMove(j,i,x,y,nDeep,position[i][j]);
	
	//插入右上方的有效走法
	x=j+2;
	y=i-2;
	if(x<9 && y>=0 && IsValidMove(position,j,i,x,y,m_nUserChessColor))
		AddMove(j,i,x,y,nDeep,position[i][j]);
	
	//插入左下方的有效走法
	x=j-2;
	y=i+2;
	if(x>=0 && y<10 && IsValidMove(position,j,i,x,y,m_nUserChessColor))
		AddMove(j,i,x,y,nDeep,position[i][j]);
	
	//插入左上方的有效走法
	x=j-2;
	y=i-2;
	if(x>=0 && y>=0 && IsValidMove(position,j,i,x,y,m_nUserChessColor))
		AddMove(j,i,x,y,nDeep,position[i][j]);
}

//马
void CMoveGenerator::GenHourseMove(BYTE position[10][9], int i, int j, int nDeep)
{
	int x, y;
	
	//插入右下方的有效走法
	x=j+2;//右2
	y=i+1;//下1
	if((x<9 && y<10) && IsValidMove(position,j,i,x,y,m_nUserChessColor))
		AddMove(j,i,x,y,nDeep,position[i][j]);
	
	//插入右上方的有效走法
	x=j+2;//右2
	y=i-1;//上1
	if((x<9 && y>=0) && IsValidMove(position,j,i,x,y,m_nUserChessColor))
		AddMove(j,i,x,y,nDeep,position[i][j]);
	
	//插入左下方的有效走法
	x=j-2;//左2
	y=i+1;//下1
	if((x>=0 && y<10) && IsValidMove(position,j,i,x,y,m_nUserChessColor))
		AddMove(j,i,x,y,nDeep,position[i][j]);

	//插入左上方的有效走法
	x=j-2;//左2
	y=i-1;//上1
	if((x>=0 && y>=0) && IsValidMove(position,j,i,x,y,m_nUserChessColor))
		AddMove(j,i,x,y,nDeep,position[i][j]);
	
	//插入右下方的有效走法
	x=j+1;//右1
	y=i+2;//下2 
	if((x<9 && y<10) && IsValidMove(position,j,i,x,y,m_nUserChessColor))
		AddMove(j,i,x,y,nDeep,position[i][j]);

	//插入左下方的有效走法
	x=j-1;//左1
	y=i+2;//下2
	if((x>=0 && y<10) && IsValidMove(position,j,i,x,y,m_nUserChessColor))
		AddMove(j,i,x,y,nDeep,position[i][j]);    
	
	//插入右上方的有效走法
	x=j+1;//右1
	y=i-2;//上2
	if((x<9 && y >=0) && IsValidMove(position,j,i,x,y,m_nUserChessColor))
		AddMove(j,i,x,y,nDeep,position[i][j]);

	//插入左上方的有效走法
	x=j-1;//左1
	y=i-2;//上2
	if((x>=0 && y>=0) && IsValidMove(position,j,i,x,y,m_nUserChessColor))
		AddMove(j,i,x,y,nDeep,position[i][j]);
}

//红兵
void CMoveGenerator::GenRedSoldierMove(BYTE position[10][9], int i, int j, int nDeep)
{
	int x,y;
	int ChessID;
	
	ChessID=position[i][j];

	if(m_nUserChessColor==REDCHESS)
	{
		y=i-1;//向前
		x=j;
		if(y>0 && !IsSameSide(ChessID,position[y][x]))
			AddMove(j,i,x,y,nDeep,position[i][j]);//前方无阻碍
		
		if(i<5)//是否已过河
		{
			y=i;
			
			x=j+1;//右边
			if(x<9 && !IsSameSide(ChessID,position[y][x]))
				AddMove(j,i,x,y,nDeep,position[i][j]);
			
			x=j-1;//左边
			if(x>=0 && !IsSameSide(ChessID,position[y][x]))
				AddMove(j,i,x,y,nDeep,position[i][j]);
		}
	}
	else
	{
		y=i+1;//向前
		x=j;
		if(y>0 && !IsSameSide(ChessID,position[y][x]))
			AddMove(j,i,x,y,nDeep,position[i][j]);//前方无阻碍
		
		if(i>4)//是否已过河
		{
			y=i;
			
			x=j+1;//右边
			if(x<9 && !IsSameSide(ChessID,position[y][x]))
				AddMove(j,i,x,y,nDeep,position[i][j]);
			
			x=j-1;//左边
			if(x>=0 && !IsSameSide(ChessID,position[y][x]))
				AddMove(j,i,x,y,nDeep,position[i][j]);
		}
	}
}

//黑卒
void CMoveGenerator::GenBlackSoldierMove(BYTE position[10][9],int i,int j,int nDeep)
{
	int x,y;
	int ChessID;
	
	ChessID=position[i][j];

	if(m_nUserChessColor==REDCHESS)
	{
		y=i+1;//向前
		x=j;
		if(y<10 && !IsSameSide(ChessID,position[y][x]))
			AddMove(j,i,x,y,nDeep,position[i][j]);//前方无阻碍
		
		if(i>4)//是否已过河
		{
			y=i;
			
			x=j+1;//右边
			if(x<9 && !IsSameSide(ChessID,position[y][x]))
				AddMove(j,i,x,y,nDeep,position[i][j]);
			
			x=j-1;//左边
			if(x>=0 && !IsSameSide(ChessID,position[y][x]))
				AddMove(j,i,x,y,nDeep,position[i][j]);
		}
	}
	else
	{
		y=i-1;//向前
		x=j;
		if(y<10 && !IsSameSide(ChessID,position[y][x]))
			AddMove(j,i,x,y,nDeep,position[i][j]);//前方无阻碍
		
		if(i<5)//是否已过河
		{
			y=i;
			
			x=j+1;//右边
			if(x<9 && !IsSameSide(ChessID,position[y][x]))
				AddMove(j,i,x,y,nDeep,position[i][j]);
			
			x=j-1;//左边
			if(x>=0 && !IsSameSide(ChessID,position[y][x]))
				AddMove(j,i,x,y,nDeep,position[i][j]);
		}
	}
}

//车
void CMoveGenerator::GenRookMove(BYTE position[10][9], int i, int j, int nDeep)
{
	int x,y;
	int ChessID;
	
	ChessID=position[i][j];

	//插入向右的有效的走法
	x=j+1;
	y=i;
	while(x<9)
	{
		if(NoChessMan==position[y][x])
			AddMove(j,i,x,y,nDeep,position[i][j]);
		else
		{
			if(!IsSameSide(ChessID,position[y][x]))
				AddMove(j,i,x,y,nDeep,position[i][j]);

			break;
		}
		x++;
	}

	//插入向左的有效的走法
	x=j-1;
	y=i;
	while(x>=0)
	{
		if(NoChessMan==position[y][x])
			AddMove(j,i,x,y,nDeep,position[i][j]);
		else
		{
			if(!IsSameSide(ChessID,position[y][x]))
				AddMove(j,i,x,y,nDeep,position[i][j]);

			break;
		}
		x--;
	}

	//插入向下的有效的走法
	x=j;
	y=i+1;
	while(y<10)
	{
		if(NoChessMan==position[y][x])
			AddMove(j,i,x,y,nDeep,position[i][j]);
		else
		{
			if(!IsSameSide(ChessID,position[y][x]))
				AddMove(j,i,x,y,nDeep,position[i][j]);

			break;
		}
		y++;
	}

	//插入向上的有效的走法
	x=j;
	y=i-1;
	while(y>=0)
	{
		if(NoChessMan==position[y][x])
			AddMove(j,i,x,y,nDeep,position[i][j]);
		else
		{
			if(!IsSameSide(ChessID,position[y][x]))
				AddMove(j,i,x,y,nDeep,position[i][j]);

			break;
		}
		y--;
	}
}

//炮
void CMoveGenerator::GenGunnerMove(BYTE position[10][9], int i, int j, int nDeep)
{
	int x,y;
	BOOL flag;
	int ChessID;
	
	ChessID=position[i][j];

	//插入向右的有效的走法
	x=j+1;
	y=i;
	flag=FALSE;
	while(x<9)
	{
		if(NoChessMan==position[y][x])
		{
			if(!flag)//隔有棋子
				AddMove(j,i,x,y,nDeep,position[i][j]);
		}
		else
		{
			if(!flag)//没有隔棋子,此棋子是第一个障碍,设置标志
				flag=TRUE;
			else     //隔有棋子,此处如为敌方棋子,则可走
			{
				if(!IsSameSide(ChessID,position[y][x]))
					AddMove(j,i,x,y,nDeep,position[i][j]);
				break;
			}
		}
		x++;//继续下一个位置
	}

	//插入向左的有效的走法
	x=j-1;
	y=i;
	flag=FALSE;
	while(x>=0)
	{
		if(NoChessMan==position[y][x])
		{
			if(!flag)//隔有棋子
				AddMove(j,i,x,y,nDeep,position[i][j]);
		}
		else
		{
			if(!flag)//没有隔棋子,此棋子是第一个障碍,设置标志
				flag=TRUE;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -