0

我正在尝试为决赛周构建一个简单的文本冒险。这是很标准的东西。使用“n”、“e”、“s”和“w”遍历房子,并尝试到达迷宫的尽头。有一段时间一切都很顺利,但是当我尝试检索可用门的列表时遇到了问题。

这是我的基本设置

class Node
{
public:
    //...
    Node* getNLink() {return northLink;}
    Node* getELink() {return eastLink;}
    Node* getSLink() {return southLink;}
    Node* getWLink() {return westLink;}
    //...
    void printAllPossibleMoves();
    //checks all four links and tells the user which ones are not set to NULL
private:
    //...
    Node* northLink;
    Node* eastLink;
    Node* southLink;
    Node* westLink;
    const string dirNodeToStr(Node* dirNode);
    //Takes a node pointer and returns whether that link is n/e/s/w, no spaces
};

我已经剪掉了所有多余的成员。我的问题来自 Node 类中的两个成员函数。首先, printAllPossibleMoves() 获取所有未设置为 NULL 的指针的列表,并将这些指针逐个提供给 dirNodeToStr()

void Node::printAllPossibleMoves()
{
    Node* allDoors[4] = {getNLink(), getELink(), getSLink(), getWLink()};
    //gets a list of all four pointers
    Node* availableDoors[4];
    int allDoorsLen(4), availableDoorsLen(0);

    for(int i=0; i<allDoorsLen; i++)
    {
        if(allDoors[i] != NULL)
        {
        //filters out any NULL pointers and keeps track of the # of non-NULL pointers
            availableDoors[i] = allDoors[i];
            availableDoorsLen++;
        }
    }

    if(availableDoorsLen == 0)
        cout << "You don't see any doors in this room. Odd" << endl;
    else if(availableDoorsLen == 1)
        cout << "You see a door to the " << dirNodeToStr(availableDoors[0]) << endl; //CALL 1
    else if(availableDoorsLen > 1 )
    {
        cout << "You see doors to the ";
        for(int j=0; j<availableDoorsLen; j++)
        {//make sure to put an 'and' in there before the last direction is printed
            if(j == (availableDoorsLen-1))
                cout << " and " << dirNodeToStr(availableDoors[j]) << endl; //CALL 2
            else
                cout << " " << dirNodeToStr(availableDoors[j]); //CALL 3
        }
    }
}

在三个标记的行上,printAllPossibleMoves() 将 Node 指针之一传递给 dirNodeToStr(),这是错误出现的地方。

const string Node::dirNodeToStr(Node* dirNode)
{
    if(dirNode == dirNode->getNLink())
        return "north";
    else if(dirNode == dirNode->getELink())
        return "east";
    else if(dirNode == dirNode->getSLink())
        return "south";
    else if(dirNode == dirNode->getWLink())
        return "west";
    else
    {
        cout << "Error at Node::dirNodeToStr: Function was fed an invalid parameter" << endl;
        //whenever this function is called, it falls through to this case
        system("PAUSE");
        exit(0);
    }
}

和输出:

This is the guest bedroom.
n
WEST HALL
This is a hallway.
You see doors to the Error at Node::dirNodeToStr: Function was fed an invalid pa
rameter
Press any key to continue . . .

如果它很重要,这是原始函数调用

void Node::movePlayer(Node*& pos, string direction)
{
    if(direction == "north")
    {
        if(northLink == NULL)
            cout << "You can't go north.\n";
        else
        {
            pos = getNLink();
            cout << pos->getRoomName() << endl << pos->getRoomInfo() << endl;
            pos->printAllPossibleMoves();
        }
    }
//...
}

所以你怎么看?为什么指针不匹配?我收集了所有指针,将它们输入另一个函数,然后将其中一个与所有相同指针的列表进行比较。这不应该是一个不费吹灰之力的吗?

4

1 回答 1

1

这段代码

for(int i=0; i<allDoorsLen; i++)
{
    if(allDoors[i] != NULL)
    {
    //filters out any NULL pointers and keeps track of the # of non-NULL pointers
        availableDoors[i] = allDoors[i];
        availableDoorsLen++;
    }
}

导致 NULL 被放置在您的 availableDoors 中,我认为您可以通过更改行来解决此问题

availableDoors[i] = allDoors[i]

availableDoors[availableDoorsLen] = allDoors[i]
于 2013-05-02T05:02:09.050 回答