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

📄 searchengine.cpp

📁 一个人工智能下象棋的小游戏 含电子书 包含了alph-beta 深度优先 极大极小值算法
💻 CPP
字号:
// SearchEngine.cpp: implementation of the CSearchEngine class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "Chess.h"
#include "SearchEngine.h"

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

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

CSearchEngine::CSearchEngine()
{

}

CSearchEngine::~CSearchEngine()
{
	delete m_pMG;//删去挂在搜索引擎上的走法产生器
	delete m_pEval;//删去挂在搜索引擎上的估值核心
}

BYTE CSearchEngine::MakeMove(CHESSMOVE* move)
{
	BYTE nChessID;
	nChessID = CurPosition[move->To.y][move->To.x];        //取目标位置棋子
	CurPosition[move->To.y][move->To.x] = CurPosition[move->From.y][move->From.x];//把棋子移动到目标位置
	CurPosition[move->From.y][move->From.x] = NOCHESS; //将原位置清空
	return nChessID;//返回被吃掉的棋子
}

void CSearchEngine::UnMakeMove(CHESSMOVE* move,BYTE nChessID)
{                                                               //nChessID是原棋盘上move目标位置的棋子类型
	CurPosition[move->From.y][move->From.x] = CurPosition[move->To.y][move->To.x];//将目标位置阿和棋子拷回原位
	CurPosition[move->To.y][move->To.x] = nChessID;//恢复目标位置的棋子
}

//用以检查给定局面游戏是否结束
//如未结束,返回0,否则返回极大/极小值
int CSearchEngine::IsGameOver(BYTE position[10][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] == B_KING)
				BlackLive = TRUE;
			if (position[i][j] == R_KING)
				RedLive  = TRUE;
		}
		
		for (i = 0; i < 3; i++)
			for (j = 3; j < 6; j++)
			{
				if (position[i][j] == B_KING)
					BlackLive = TRUE;
				if (position[i][j] == R_KING)
					RedLive  = TRUE;
			}
			
			i = (m_nMaxDepth - nDepth + 1) % 2;//取当前是奇偶标志  ndepth从上往下1开始记层数?
			
			if (!RedLive)   //红方输,最后一步是黑方下的,奇数返回极大值(在副极大值算法中,红方返回极小值,黑方返回极大值)
				if (i)
					return 19990 + nDepth;//奇数层返回极大值
				else
					return -19990 - nDepth;//偶数层返回极小值
			if (!BlackLive)   //黑方输,最后一步红方下的,奇数层返回极小值
				if (i)
					return -19990 - nDepth;//奇数层返回极小值
				else
					return 19990 + nDepth;//偶数层返回极大值

			return 0;//两个将都在,返回零
}

⌨️ 快捷键说明

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