我用C ++为我的tictactoe实现了一个游戏树。
这个想法是这样的:根据游戏情况,minimax树可以有任意数量的孩子。树的水平通常被称为层。在每一层,玩的机会(“转弯”)切换到另一个玩家。
现在很重要:树以当前的董事会位置开始,因为s root node. So each tree node consists of a list. The possible moves (from the computer
的观点)是该列表的成员。
我的问题是,我怎么能建造那棵树?显然,必须以某种方式定义当前的板状态,以便评估函数知道从哪里开始搜索。
Struct node
{
Node* successors
// get available movecount
int count()
{
for (int count=0; count< free cells)
++count
}
Node* curr_board_state= root;
}
Node * root(Board b, int depth)
{
node.successorCount = int count();
node.value = board.GetValue;
if (depth > 0 && node.childCount > 0)
{
node.children = new Node * node.SuccessorCount;
for (int i = 0; i <= node.SuccessorCount; ++i)
node.Successor[i] = CreateTree(board.Move(i), depth - 1);
}
else
{
node.children = NULL;
}
return node;
}
有一些想法。希望有人能帮助我。
答案 0 :(得分:1)
对于井字游戏,游戏树中的每个节点最多可以有9个孩子,因为最多有9个可能的移动。根据我的理解,明确表示整个游戏树来评估它是一种不寻常的方法。更直接的方法是让游戏板代表。在搜索游戏树时,通过实际更改电路板状态,进行评估然后再次撤消假设移动来评估节点。您所描述的方法是Minimax algorithm的基本版本,它完全对应于假设执行要评估的移动,以递归方式继续,其中在树的每个级别上交换玩家的视角
答案 1 :(得分:0)
“通过实际更改电路板状态,进行评估然后再次撤消假设移动来评估节点”。
考虑到上述情况,我不能做像
这样的事情int availableMoves(vector<pair<unsigned int, unsigned int> >& v) const {
//clear result vector.
v.clear();
//check if the game is in progress.
int state = evaluateState();
if(state != IN_PROGRESS)
return state;
//if the game is in progress, check for empty cells.
for(unsigned int x = 0; x < 3; i++)
for(unsigned int y = 0; y < 3; j++)
if(board(x,y) = free;)
v.push_back(pair<unsigned int, unsigned int>(x, y));
return IN_PROGRESS;
}
Struct node
{
node * availalableMoves;
}
node * CreateTree(Board b, int depth)
{
vector<pair<unsigned int, unsigned int> > availableMoves;
// Allocate new space for nodes to be evaluated
unsigned int numAvailableMoves = (unsigned int)availableMoves.size();
for(unsigned int i = 0; i < numAvailableMoves; i++) {
Stack<occupiedMoves.size();>my_free_store;
void* pv1= my_free_store.get();
int* buffer = static_cast<int*>(pv1);
void* pv2= my_free_store.get(sizeof(availableMoves));
availableMoves* pconn= new(pv2) availableMoves(incoming,outcoming,buffer);
我的negamax算法如下:
int Search(int depth)
{
int score;
int x,y;
int bestScore = -2;
bool bestMove = false;
if(depth == 0) return Evaluate();
for (int turns = 0; turns < 9; ++turns) { // loop over turns
while (occupied(x,y));
make_move(x, y);
score = -Search(depth-1); // recursion
unMake();
if(score > bestScore) {
bestScore = score;
bestMove = (x,y);
}
}
return bestScore;
return bestMove;
}
问题是evaluate()应该包含什么