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

📄 node.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> 

Node::Node( int x, int y, Node *parentnode )
{
	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;
	//父节点为node,保存父节点指针
	pnode = parentnode;								
	Initial();

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

//父节点为node的初始化
void Node::Initial()
{
	nlevel = pnode->nlevel + 1;							//本节点在树种的层数

	if( pnode->nodecolor == 'B' )						//根据父节点确定本节点颜色
	{
		nodecolor = 'W';
	}
	else
	{	
		nodecolor = 'B';
	}

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

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

void Node::AddSubNode()
{
	if( nlevel > 2 )										//节点树层数大于10的节点不产生子节点(!!!later运算量太大)
	{	
		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, this);
					subnode.AddSubNode();
					//或者在构造中添加子节点AddSubNode();
					if( this->nweight < subnode.nweight )
					{	
						this->nweight = subnode.nweight;						//保存权值最大的子节点(多层节点树中,本身的权重会被覆盖!!!later)
						this->bestm = subnode.m;
						this->bestn = subnode.n;
					}
					//subnode.AddSubNode();
					//或者在构造中添加子节点AddSubNode();
				}
			}
		}
	}
}

void Node::MakeDecision()
{

//遇到禁手或对方必胜,权为0时,直接返回,
/////////////////////////
	//nweight = rand();
	//计算realgrid[m][n]点作为自己棋子的权重
	nweight = Decision::MyChance( realgrid, m, n );

	//计算realgrid[m][n]点作为自己棋子的权重
	char realgrid2[15][15];
	for( int i=0; i<15; i++)							//把父节点中已有棋子继承过来
	{	
		for( int j=0; j<15; j++)
		{    
			realgrid2[i][j] = realgrid[i][j];			
		}
	}
	if( realgrid2[m][n] == 'B')
	{
		 realgrid2[m][n] = 'W';
	}
	else if( realgrid2[m][n] == 'W')
	{
		 realgrid2[m][n] = 'B';
	}
	nweight = nweight + Decision::RivalChance( realgrid2, m, n );

	if( nweight == 0 )
	{
		//nweight = rand();
	}
	nweight = nweight + ((double(rand()) / double(RAND_MAX)) - 0.5)*0.001;				//制造一个 - 0.0005 到 0.0005 之间的随机数,防止权重相同,(随机选出一个最大)
}


⌨️ 快捷键说明

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