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

📄 mainnode.cpp

📁 在linux下使用qt来开发的五子棋
💻 CPP
字号:

#include "myQFrame.h"
#include "board.h"
#include "chess.h"
#include "mainnode.h"
#include "node.h"
#include "decision.h"
//#include <stdlib.h> 

MainNode::MainNode( int x, int y, Chess *parentchess )
{
	for( int i=0; i<15; i++)											//数组初始化
	{	
		for( int j=0; j<15; j++)
		{    
			realgrid[i][j] = NULL;
		}
	}
	for( int i=0; i<15; i++)											//数组初始化
	{
		for( int j=0; j<15; j++)
		{    
			legalblank[i][j] = NULL;
		}
	}
	m = x;												//本节点位置
	n = y;
	nweight = 0;
	//第一个节点的父节点为chess对象
	pchess = parentchess;
	Initial();	

	/* 初始化完后,相当于已经把该节点填到棋盘,接下来计算权值 */
	MakeDecision();
	//MakeDecision1
	//MakeDecision2
	//MakeDecision3
}

//父节点为chess的初始化
void MainNode::Initial()
{
	nlevel = 1;												//本节点在树种的层数
	
	if( pchess->pboard->chessnow == 'B')					//根据父节点确定本节点颜色,第一个节点与刚下的棋子颜色相同
	{
		nodecolor = 'W';
	}
	else
	{	
		nodecolor = 'B';
	}

	for( int i=0; i<15; i++)							//把父节点中已有棋子继承过来
	{	
		for( int j=0; j<15; j++)
		{    
			realgrid[i][j] = pchess->pboard->realgrid[i][j];			
		}
	}
	realgrid[m][n] = nodecolor;							//把本节点填到棋盘中
}

char MainNode::clstab()														//类型标识
{
	return 'N';															// N 标识为节点
}

void MainNode::AddSubNode()
{
	if( nlevel > 2 )										//节点树层数大于10的节点不产生子节点,其实主节点nlevel就是1
	{
		return;
	}
	else
	{
		Decision::BlankFilter( realgrid, legalblank );			//根据现有棋子,确定合法子节点空格
 
		for( int i=0; i<15; i++)								//在合法空格处生成子节点
		{	
			for( int j=0; j<15; j++)
			{    
				if( legalblank[i][j] )
				{
					Node subnode(i, j, reinterpret_cast<Node *>(this));											////强制把Node类型或MainNode类型的都转换为Node,可能有错发生
																												//感觉处理的不好,问别人,有没有更理想的处理方式????????
					//subnode.AddSubNode();									//本程序暂时只考虑一层子节点,根据棋势计算权重(以后升级版本可将棋势计算和子节点树相结合)(不过子节点算法运算量异常大)
					//或者在构造中添加子节点AddSubNode();
					if( this->nweight< subnode.nweight )
					{	
						this->nweight = subnode.nweight;						//保存权值最大的子节点
						this->bestm = subnode.m;
						this->bestn = subnode.n;
					}
					//subnode.AddSubNode();
					//或者在构造中添加子节点AddSubNode();
				}
			}
		}
	}
}

void MainNode::MakeDecision()
{
	//主节点本身不需要计算权重,但他应该记录自己子节点种权重最大的点以及其权重
	//nweight = rand();
	//nweight = 0;
}


⌨️ 快捷键说明

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