📄 mainnode.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 + -