【问题标题】:C++ - How to create an instance of a class with changing nameC ++ - 如何创建具有更改名称的类的实例
【发布时间】:2013-07-24 18:18:41
【问题描述】:

一点背景...我正在做一个简单的迷宫游戏。本质上,该程序是采用以下形式的文本文件:

A * B * * B * C * A C G D * B D * * * C E I F * * F J G * E G * H C F H * * * G IE * J * K F * K * L * J L * * * K

其中第一个字符是当前节点,第二个字符是其北边的节点,下一个是东边的节点,然后是南边,然后是西边。每条线代表一个节点和它可以连接的 4 个节点。

游戏是基于文本的,玩家从节点 A 开始,并且可以沿四个方向之一 (N/E/S/W) 移动。对于节点 A,唯一合法的移动是向东移动到节点 B,然后玩家可以从那里向东移动到节点 C 或向西移动回到节点 D。在节点 C,用户可以向北移动到节点 G,并且等等等等。任何有 * 的地方都没有那个方向的节点(所以我将设置为 NULL)

我仍处于编程的相对早期阶段,这是我需要使用节点甚至类的第一个任务,所以我想确保我能很好地掌握如何解决在我进入编程内容之前玩游戏。

我认为实际玩游戏会很简单。我的问题是设置游戏板。我了解如何创建文件流和读取字符。

int BuildGraph()
{
    ifstream build;
    build.open("file.txt");
    char tempChar;

build >> tempChar;

while(tempChar != '\n')
{
    for(int a = 0; a <= 4; a++)
    {
        switch (a)
        {
            case 0:
                Node tempChar; // NEED HELP HERE
                                    build >> tempChar; // Grabs the next character
                break;
            case 1:
                // set Node.north to tempChar
                break;
            case 2:
                // set Node.east to tempChar
                break;
            case 3:
                // set Node.south to tempChar
                break;
            case 4:
                // set Node.west to tempChar
                break;
        }
    }
}
}

我的问题是,如果不在正在读取的字符,我如何创建节点和名称?在这种情况下,第一个节点应该是 A,a.east 应该设置为 B,a.south、a.north 和 a.west 都应该设置为 NULL。

我如何以这种格式完成此操作?我应该采取不同、更简单或更好的方法吗?

我还应该注意,我正在使用一个名为 Node 的类,它当前的设置如下:

类节点() { 上市: 字符 *node_north = ; 字符 *node_east = ; 字符 *node_south = ; 字符 *node_west = ; };

【问题讨论】:

    标签: c++ pointers graph nodes


    【解决方案1】:

    你可以像这样制作一个节点:

    struct Node {
        char name;
        char north;
        char east;
        char south;
        char west;
    };
    

    还有一个向量来保存节点

    std::vector<Node> nodes;
    

    然后这样读:

    Node node;
    build >> node.name >> node.north >> node.east >> node.south >> node.west;
    nodes.push_back(node);
    

    或者你可以有一个这样的节点:

    struct Node {
        char north;
        char east;
        char south;
        char west;
    };
    

    和节点图

    std::map<char,Node> nodes;
    

    然后这样读:

    char name;
    Node node;
    build >> name >> node.north >> node.east >> node.south >> node.west;
    nodes[name] = node;
    

    【讨论】:

    • @sakau2007:读取节点后,您需要将其存储——可能存储到 std::vector
    • 我知道您是如何添加名称字段的,但我不确定这对我有什么帮助。不会只保存最后一个节点的信息吗?我将如何引用成员?我的想法是 node.A.north (将返回 NULL) node.A.east (将返回节点 B 或 char B 取决于我如何设置它;我认为返回整个节点,因此返回方向指针最好)
    • @sakau2007:你可以有一个函数遍历节点并找到一个具有特定名称的节点,或者使用std::map&lt;char,Node&gt;
    • @sakau2007:我在回答中添加了一些细节
    • 我想我的下一个问题是这行代码到底是什么:std::map nodes;它在程序中的什么位置,它在功能上做了什么?此外,除了 iostream 和 fstream 之外,我需要插入任何特殊的包含语句才能使其正常工作?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-13
    • 1970-01-01
    • 2011-10-08
    • 1970-01-01
    • 2016-09-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多