我想创建一个类似Nim的游戏。
玩家可以拿走1个或M个(预定义的)立方体,最后拿走立方体的玩家获胜。我还会创建一个极小极大函数,以便MAX玩家(总是先手)做出最佳移动。我已经开始编写我的程序,但在创建游戏树时遇到了问题。这里是我的代码:
#define M 30#define K 4char 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();
有谁能帮我解决这个函数的问题吗?
回答:
你的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分配内存;
- 在函数末尾返回分配的cube。
关于这个函数的作用还有一些疑问,因为它没有接收任何参数。由于cube->numCubes
始终是M
,在if (cube->numCubes >= 1)
处会导致无限递归。