Игра Строительство дерева в 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);
}
Компиляция кода я не получаю проблему ошибки. Я проверю это, когда закончу свою программу.