Итак, я создаю грубую текстовую приключенческую игру и работаю над созданием комнаты и пытаюсь соединить комнаты друг с другом.
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;
}
}
}