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