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

📄 search.c

📁 牛角棋的源码
💻 C
字号:

//search.c

#include <assert.h>
#include "horn.h"
#include "evaluation.h"
#include "data.h"

/*
************************************************************************
Search
******************************
功能描述:调用Search()递归地展开博弈树。其算法为固定深度的深度优先的Alpha-beta搜索。
参数:	  depth:深度;alpha:窗口下界;beta:窗口上界;wtm:轮到哪方走棋。
返回值:  局面的估值。
*************************************************************************
*/
int Search(int depth, int alpha, int beta, int wtm)
{
	int i;
	int t;
	int score;	
	int move;
	int piece;
	int from;
	int ply = maxDepth - depth;
	int *pMove = pList[ply];
	int value;

	pList[ply+1] = MoveGen(wtm, pList[ply]);

	if(INFINITEVAL == bestRootMove)
		bestRootMove = *pMove;

	value = GameOver(wtm, stoneIntersection, ply);

	//若胜负已分,或者抵达叶节点,则不再搜索,只是返回胜负分值;
	//否则,继续展开博弈树搜索。
	if ((value <= LOSE + maxDepth)||		//胜负已分
		(WIN - maxDepth <= value)		//胜负已分
		)
	{
		return value;
	}

	if((pList[ply] == pList[ply+1]) ||		//无着法可走
		(depth <= 0)				//叶节点
		)
	{
		return Evaluation(wtm, stoneIntersection, ply);
	}

	//逐一展开各子树
	for ( ; pMove < pList[ply+1]; ++pMove ) 
	{
		move = *pMove;
		piece = move>>4;

		from = MakeMove(piece, move & 15);

		if(HasRepetition(posStack, ply))	//出现循环,和棋
		{
			t = DRAW;
			UnmakeMove(piece, from);
		}
		else					//展开某子树,负极大值形式的alpha-beta搜索
		{
			t = -Search(depth-1, -beta, -alpha, !wtm);	
			UnmakeMove(piece, from); 
		}

		if (alpha < t)				//找到更好的着法
		{
			alpha = t;
			if(!ply)			//若是root move
			{
				bestRootMove = move;	//令最佳的root move更新为当前的root move
			}
		}
		if ( alpha >= beta )			//fail-high,剪枝
		{
			return alpha;
		}
	}

	return alpha;
}

⌨️ 快捷键说明

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