为跳棋实施游戏树

Implementing a Game Tree for Checkers

我想实现一个游戏树,它可以在每个级别有任意数量的节点,基本上我正在为跳棋开发 AI,我想实现一个用于 minimax 的游戏树 algorithm.This是我的代码,我正在处理第一种插入情况,即当树为空时....但是当我尝试访问根目录下的数据时,我的程序崩溃了!有帮助吗?? :/

#include <iostream>
using namespace std;

struct Node {
    Node **child;
    int data;
};

class Tree {
public:
    Node *root;
    Tree() {
        root = NULL;
    }

private:
    void add(Node *r, int data, int size) {
        if (r == NULL) {
            Node *newnode = new Node;
            newnode->child = new Node*[size];
            for (int i = 0; i < size; ++i) {
                newnode->child[i] = new Node;
                newnode->child[i]->child = 0;
            }
            newnode->data = data;
            r = newnode;
        }
    }

public:
    void add(int data, int size) {
        add(root, data, size);
    }
};

int main() {

    Tree t;
    t.add(5, 20);
    cout << t.root->data << endl;
    return 0;
}

问题出在您按值传递 r 的私有添加函数中。所以当你设置 r = newnode 时,你实际上是在为一个局部指针变量设置地址,它不会影响 root。解决方法如下:

class Tree {
public:
    Node *root;
    Tree() {
        root = NULL;
    }

private:
    void add(Node **r, int data, int size) {
        if (*r == NULL) {
            Node *newnode = new Node;
            newnode->child = new Node*[size];
            for (int i = 0; i < size; ++i) {
                newnode->child[i] = new Node;
                newnode->child[i]->child = 0;
            }
            newnode->data = data;
            *r = newnode;
        }
    }

public:
    void add(int data, int size) {
        add(&root, data, size);
    }
};

你做错的是:

r = newnode;

r是你必须做的局部变量

root = newnode;

您的代码将起作用。

希望对您有所帮助