search.cpp

来自「用c++ 开发的中国象棋」· C++ 代码 · 共 107 行

CPP
107
字号
// Search.cpp: implementation of the CSearch class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "chinesechess.h"
#include "Search.h"

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

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

CSearch::CSearch()
{

}

CSearch::~CSearch()
{
	delete m_pEval;
	delete m_pMG;
}

BYTE CSearch::MakeMove(ChessMove* move)
{
	BYTE nChessID;

	nChessID=CurPosition[move->pTo.y][move->pTo.x];   //取目标位置棋子
    CurPosition[move->pTo.y][move->pTo.x]=CurPosition[move->pFrom.y][move->pFrom.x];
													//把棋子移动到目标位置	
	CurPosition[move->pFrom.y][move->pFrom.x]=NoChessMan;//将原位置清空
	
	return nChessID;//返回被吃掉的棋子
}

void CSearch::RedoChessMove(BYTE position[][9],ChessMove* move)
{
    position[move->pTo.y][move->pTo.x]=position[move->pFrom.y][move->pFrom.x];
	position[move->pFrom.y][move->pFrom.x]=NoChessMan;
}

void CSearch::UnMakeMove(ChessMove* move, BYTE nChessID)
{
	CurPosition[move->pFrom.y][move->pFrom.x]=CurPosition[move->pTo.y][move->pTo.x];
	//将目标位置棋子拷回原位  	
	CurPosition[move->pTo.y][move->pTo.x]=nChessID;							
	//恢复目标位置的棋子
}

void CSearch::UndoChessMove(BYTE position[][9],ChessMove* move, BYTE nChessID)
{
	position[move->pFrom.y][move->pFrom.x]=position[move->pTo.y][move->pTo.x];
	//将目标位置棋子拷回原位  	
	position[move->pTo.y][move->pTo.x]=nChessID;							
	//恢复目标位置的棋子
}

int CSearch::IsGameOver(BYTE position[][9], int nDepth)
{
	int i,j;
	BOOL RedLive=FALSE,BlackLive=FALSE;

	//检查红方九宫是否有帅
	for(i=7;i<10;i++)
		for(j=3;j<6;j++)
		{
			if(position[i][j]==BlackKing)
				BlackLive=TRUE;
			if(position[i][j]==RedKing)
				RedLive=TRUE;
		}

	//检查黑方九宫是否有将
	for(i=0;i<3;i++)
		for(j=3;j<6;j++)
		{
			if(position[i][j]==BlackKing)
				BlackLive=TRUE;
			if(position[i][j]==RedKing)
				RedLive=TRUE;
		}

		int tag;
	tag=(m_nMaxDepth-nDepth+1)%2;//取当前奇偶标志,奇数层为电脑方,偶数层为用户方
	//红方不在
	if(!RedLive)
		if(tag)
			return 19990+nDepth; //奇数层返回极大值
		else
			return -19990-nDepth;//偶数层返回极小值

	//黑方不在
	if(!BlackLive)
		if(tag)
			return -19990-nDepth;//奇数层返回极小值
		else
			return 19990+nDepth; //偶数层返回极大值
		
	return 0;//将帅都在,返回0
}

⌨️ 快捷键说明

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