【问题标题】:Building tree in Nim game在 Nim 游戏中建造树
【发布时间】:2015-05-18 14:27:50
【问题描述】:

我想创建一个像 Nim 这样的游戏。

玩家可以拿走 1 个或 M(已定义)立方体,赢家是拿走最后一个立方体的玩家。我还将创建一个 minimax 函数,因此 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();

谁能帮我实现这个功能?

【问题讨论】:

  • 首先你的buildGameTree 必须返回一些东西,我猜:创建/分配的节点。你能发布错误吗?
  • buildGameTree() 中的cube 指针后面没有内存,因此设置numCubes 将导致未定义的行为。再加上你在同一个函数中有无限的recusion,因为没有终止条件。
  • IntelliSense:“struct Node”类型的值不能分配给“struct Node *”类型的实体
  • 我还在函数末尾添加了if(cube->numCubes == 0){return cube;}return cube;,但我收到了我在之前评论中写的消息
  • “我在这些行出现错误...” 那会是什么错误?也许实际的错误消息可能有用...

标签: c tree artificial-intelligence minimax


【解决方案1】:

您的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)上会有一个无限递归。

【讨论】:

  • 我改变了我的函数,现在有一个int ncube 参数,所以我调用buildGameTree(ncubes - 1)buildGameTree(ncubes - M)。所以现在我认为递归将停止。我会试试这个,我会告诉你它是否有效。
【解决方案2】:

我更改了代码,现在是:

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);
}

编译代码我没有遇到错误问题。当我完成我的程序时,我会对此进行测试。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-16
    • 1970-01-01
    • 2017-05-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多