Игра Строительство дерева в Nim

Я хочу создать такую ​​игру, как Ним.

Игрок может взять 1 или M (определенных) кубов, и победителем становится игрок, который взял последний куб. Я также создам минимаксную функцию, поэтому игрок MAX (всегда играет первым) делает лучший ход. Я начал писать свою программу, но у меня проблемы с созданием древовидной игры. Вот мой код:

#define M 30
#define K 4

char player[3] = "MAX";
int cubesCounter = M;

struct Node {
    int value;
    int numCubes;
    struct Node *left;
    struct Node *right;
};

char switchPlayer() {
    if (strcmp(player, "MAX") == 0) {
        strcpy(player, "MIN");
    } else {
        strcpy(player, "MAX");
    }
}

struct Node buildGameTree() {
    struct Node *cube;
    cube->numCubes = M;

    cube->left = NULL;
    cube->right = NULL;

    if (cube->numCubes >= 1) {
        cube->numCubes = cube->numCubes - 1;
        cube->left = buildGameTree();
    }

    if (cube->numCubes >= M) {
        cube->numCubes = cube->numCubes - M;
        cube->right = buildGameTree();
    }
}

Я получаю сообщение об ошибке в этих строках, и я не могу понять, что не так:

cube->left = buildGameTree();
cube->right = buildGameTree();

Кто-нибудь может мне помочь с этой функцией?

2 ответа

Решение

Ваш buildGameTree должно быть:

struct Node *buildGameTree(){
    struct Node *cube= calloc(1,sizeof(struct Node));
    cube->numCubes = M;

    cube->left = NULL;
    cube->right = NULL;

    if (cube->numCubes >= 1){
        cube->numCubes = cube->numCubes - 1;
        cube->left = buildGameTree();
    }
    if (cube->numCubes >= M){
        cube->numCubes = cube->numCubes - M;
        cube->right = buildGameTree();
    }
    return (cube);
}

То есть:

  • выделить память для куба;
  • вернуть выделенный куб в конце функции.

Остается ряд вопросов о том, что должна делать эта функция, поскольку она не получает параметров. поскольку cube->numCubes всегда Mбудет бесконечная рекурсия на if (cube->numCubes >= 1),

Я изменил код и теперь это:

struct Node *buildGameTree(int ncubes){
    struct Node *cube = calloc(1, sizeof(struct Node));
    cube->cubesRemaining = ncubes;

    if (cube->cubesRemaining >= 1){
        cube->left = buildGameTree(ncubes - 1);
        switchPlayer();
    }
    if (cube->cubesRemaining >= M){
        cube->right = buildGameTree(ncubes - M);
        switchPlayer();
    }

    return (cube);
}

Компиляция кода я не получаю проблему ошибки. Я проверю это, когда закончу свою программу.

Другие вопросы по тегам