实施tictactoe树

时间:2014-12-10 15:07:01

标签: c++

我用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;
}

有一些想法。希望有人能帮助我。

2 个答案:

答案 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()应该包含什么