Räume strukturell verbinden

Guten Tag,

ich möchte in C Räume erzeugen. Dies mache ich mit einem Struct, in welches ich dann alle Raumatribute reinpacke. Räume haben zum Beispiel einen Namen, eine Raumnummer, eine Größe und so weiter. Nun soll es in Abhängigkeit der Nutzerinteraktion möglich sein, den aktuellen Raum zu verlassen und sich in den logisch nächst-angeschlossenen zu bewegen. Anschließend sollen alle Raumatribute des neu betretenen Raumes zur verfügung stehen und zum Beispiel ausgegeben werden. Bisher schwebt mir eine Funktion initRoom(struct r) vor, welche eben den neu betretenen Raum übergeben bekommt und ihn initialisiert. Nun bekomme ich es aber verstandesmäßig nicht abgebildet, wie ich die Räume untereinander verknüpfen kann. Am liebsten wäre mir eine art Tabelle, in welcher ich eintragen kann, welcher Raum mit einem anderen in Verbindung steht. Oder vielleicht etwas anders, eine Tabelle, welche die Verbindungen der Räume als separate Objekte beinhaltet. Ich dachte da an eine Konstruktion wie installDoor(int doornumber, int room1, int room2). So bastele ich quasi die Türen zwischen den Räumen. Wie gesagt, ich finde gerade keine Lösung für das Problem und könnte einen guten Rat sehr gebrauchen.

Vielen Dank im Voraus

Richard

Ich noch einmal,

dem geneigten Experten / der geneigten Expertin möchte ich auszugsweise meinen Quählcode vorlegen, damit er / sie weiss, wo hin die Reise gehen soll:

#include <conio.h>
#include <stdio.h>
#include <string.h>struct room {
int number;
char name[32];
char longdesc[4096];
};int HandleKeyboardInput();
void setupRooms();
int running = 1;int initRoom(struct room, int rnr, char name[32], char longdesc[1024]); int main(int argc, char *argv[])
{
    setupRooms();
    while(running) {
    printf(„HandleKeyBoardInput lieferte: %d\n“,HandleKeyboardInput());
}
    system(„PAUSE“);    return 1;
}int HandleKeyboardInput() {
fflush(stdin);
int key = getch();
switch(key) {
case 0: // if an f-key was pressed
key = -1 * getch();return(key);break; // Return a negative key value
     case 224: // An arrow key was pressed
key = 224 + getch();return(key);break; // add 224 to returned value
case ‚q‘: running = 0;return(key);break;
default: return(key);break;
}
}void setupRooms() {
     struct room wohnzimmer;
wohnzimmer.number = 1;
strcpy(wohnzimmer.name, „Das Wohnzimmer“);
strcpy(wohnzimmer.longdesc, „Ein wundervolles Wohnzimmer“);
struct room schlafzimmer;
schlafzimmer.number = 2;
strcpy(schlafzimmer.name, „Das schlafzimmer“);
strcpy(schlafzimmer.longdesc, „Ein wundervolles schlafzimmer“);
     }

HandleKeyboardInput ist für die User-Interaktion, wir bewegen uns mit den Pfeiltasten rechts und links durch den Raum. Später sollen da ja noch andere Dinge als Türen zu anderen Räumen rein. Wie verlinke ich die Räume nun untereinander?

Vielen Dank im Voraus

Richard

Und wieder ein Update meines Schaffens *g*: Jetzt habe ich alle Räume in ein Array gepackt, so kann ich über currentRoom ermitteln, in welchem Raum man sich gerade befindet und dessen Atribute ausgeben lassen. Nur wie verfahre ich jetzt mit den Türen dazwischen? Neuen Datentyp anlegen? Vielleicht ein Struct mit Dest1 und Dest2, wobei man ja von beiden Seiten durch eine Tür gehen kann? Nun ja, hier also dem geneigten Helfer mal wieder mein Quellcode:

#include <conio.h>
#include <stdio.h>
#include <string.h>typedef struct { // structure for storing room atributes
char name[32];
char longdesc[4096];
}room;room rooms[2]; // Array for all rooms
int currentRoom = 1; // The room player is currently in
int HandleKeyboardInput(); // Wich key has been pressed?
int running = 1; // used in while loop
void setupRooms(); // as the name states :smile:
void displayRoom(); //debug function to display room information in main loopint main(int argc, char *argv[])
{
    setupRooms();
    while(running) {
displayRoom();
    printf(„HandleKeyBoardInput lieferte: %d\n“,HandleKeyboardInput());
}
    system(„PAUSE“);    return 1;
}int HandleKeyboardInput() {
fflush(stdin);
int key = getch();
switch(key) {
case 0: // if an f-key was pressed
key = -1 * getch();return(key);break; // Return a negative key value
     case 224: // An arrow key was pressed
key = 224 + getch();return(key);break; // add 224 to returned value
case ‚q‘: running = 0;return(key);break;
default: return(key);break;
}
}void setupRooms() {
strcpy(rooms[1].name, „Wohnzimmer“);
strcpy(rooms[1].longdesc, „Ein wundervolles Wohnzimmer“);
strcpy(rooms[2].name, „schlafzimmer“);
strcpy(rooms[2].longdesc, „Ein wundervolles schlafzimmer“);
     }
void displayRoom() {
printf(„currentRoom = %s\n longDesc = %s\n“, rooms[currentRoom].name, rooms[currentRoom].longdesc);
}

Hallo Richard,

verstehe zwar nicht alles, was du da schreibst (ich spreche kein c++ :wink:), aber.

Interessant wäre zu wissen, wie du die Eigenschaften der Räume pflegen willst. aber egal.

Ich würde die Nachbarräume (ID des Nachbarraumes) als Eigenschaft des Raumes einbauen. Dann kann ich auch direkt im Raum prüfen, wohin man „gehen“ kann:

ROOM_001.Rechts = „Room_002“;

Sofern die Verbindung der Räume selber separat „gespeichert“ werden soll würde ich eine Tabelle aufsetzen, die je Raum die Nachbarn beinhaltet. Da ja auch die Richtung wichtig ist auch diese Zb:

ROOM_001; Room_002, Rechts
ROOM_001; Room_003, Links
ROOM_002; Room_001, Rechts

Tricky finde ich noch, das sicher ein Weg von A nach B möglich sein soll. Dass alle Räume verbunden sind und dass keine Wiedersprüche wie im Beispiel entstehen (oder man will das).

Sofern die Räume ein Schabrettmuster haben, auch wenn nicht alle existieren, würde ich mir in EXCEL eine „Karte“ aufbauen und die per Makro z.B. in XML umwandeln. Das dann eingelesen und fertig. (Ich glaube, so würde ich alle Eigenschaften der Räume ablegen…)

Vielleicht hat das ein bisschen geholfen…

fg

Dirk.P