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 クラスの 2 つのメンバー関数に起因します。最初に、printAllPossibleMoves() は、NULL に設定されていないすべてのポインターのリストを取得し、それらのポインターを 1 つずつ 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
        }
    }
}

マークされた 3 行で、printAllPossibleMoves() は Node ポインターの 1 つを 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();
        }
    }
//...
}

それで、あなたはどう思いますか?ポインターが一致しないのはなぜですか? すべてのポインターを収集し、それらを別の関数に渡してから、そのうちの 1 つをすべての同じポインターのリストと比較しました。これは簡単なことではありませんか?

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

availableDoors に NULL が配置される原因となっています。行を変更することでこれを修正できると思います

availableDoors[i] = allDoors[i]

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