Как создать связь между комнатными конструкциями в C? - PullRequest
0 голосов
/ 05 февраля 2020

Итак, я создаю грубую текстовую приключенческую игру и работаю над созданием комнаты и пытаюсь соединить комнаты друг с другом.

struct room
{
    int id;
    char* name;
    char* type;
    int numOutboundConnections;
    struct room* outboundConnections[6];
};

У меня есть указатель на мою переменную соединения, которую я хочу передать другим структурам комнаты, и я хочу, чтобы соединения были рандомизированы от 3 мин до 6 макс. Как бы я go добавлял соединения по два за раз (вперед и назад) к случайно выбранным конечным точкам комнаты, пока график не удовлетворяет требованиям?

По сути, то, что я хочу, было бы в таком формате :

ROOM NAME: <room name>
CONNECTION 1: <room name>
…
ROOM TYPE: <room type>

Где это может быть диапазон от 3 подключений из одной комнаты или до 6 возможных подключений из одной комнаты. Кроме того, я пытаюсь использовать предоставленную мне структуру псевдокода, поскольку мне сказали, что это может быть простая структура для работы, я просто очень запутался в том, как начать.

typedef int bool;
#define true 0
#define false 1
    // Create all connections in the graph
    while (IsGraphFull() == false)
    {
        AddRandomConnection();
    }

    // Returns true if all rooms have 3 to 6 outbound connections, false otherwise
    bool IsGraphFull()
    {
        return true;
    }

    // Adds a random outbound connection between two rooms
    void AddRandomConnection(struct room *A, struct room *B)
    {
        Room A ; // Can be a struct, or a global array of ints
        Room B;
        while(true)
        {
            A = GetRandomRoom();

            if (CanAddConnectionFrom(A) == true)
                break;
        }
        do
        {
            B = GetRandomRoom();
        }
        while(CanAddConnectionFrom(B) == false || IsSameRoom(A, B) == true || ConnectionAlreadyExists(A, B) == true);

        ConnectRoom(A, B); // TODO: Add this connection to the real variables,
        ConnectRoom(B, A); // because this A and B will be destroyed when this function terminates
    }

    // Returns a random Room, does NOT validate if connection can be added
    Room GetRandomRoom()
    {
        return rand(Room);
    }
    // Returns true if a connection can be added from Room x (< 6 outbound connections), false otherwise
    bool CanAddConnectionFrom(Room x)
    {
        if (Room x < outboundConnections[6])
        {
            return true;
        }
        else{
            return false;
        }
    }
    // Returns true if a connection from Room x and Room y already exists, false otherwise
    bool ConnectionAlreadyExists(x, y)
    {
        if (Room x == ConnectionAlreadyExists(x, y) || Room y == ConnectionAlreadyExists(x, y))
        {
            return true;
        }
        else{
            return false;
        }
    }
    // Connects Rooms x and y together, does not check if this connection is valid
    void ConnectRoom(Room x, Room y)
    {
        ConnectRoom(A, B);
        ConnectRoom(B, A);
    }
    // Returns true if Rooms x and y are the same Room, false otherwise
    bool IsSameRoom(Room x, Room y)
    {
        if (Room x == Room y)
        {
            return true;
        }
        else{
            return false;
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...