Räume und Objekte bei Adventure in C verknüpfen

Hallo hilfsbereiter, in C versierter Programmierer/in,

ich gedenke, ein klassisches Textadventure im Infocom-Style zu programmieren. Dies soll in C passieren. An dieser Stelle mag nun der oder die ein oder andere sagen, dass sich ein solches Vorhaben in einer Programmiersprache mit einem eher objektorientierten Ansatz viel besser realisieren ließe, jedoch, genau das will ich eben nicht. Nun habe ich mich aber wärend des codens wohl ein wenig verfranzt und weiss nun nicht mehr, wie ich weiter verfahren soll. Ich benötige Somit einmal einige Tips, wie ich mein Vorhaben eventuell besser strukturieren könnte. Bitte nehmt keinen Anstoß an schlechter Code-Einrückung, ich bin blind und nutze ein Sprachsyntheseprogramm fürs coden. Die Funktion HandleKeyBoardInput() wird später noch verwendet, da das Spiel nicht über einen Textparser gesteuert, sondern die Nutzerinteraktion menügeführt sein soll. Beispielsweise soll man sich durch die Räume mit den Pfeiltasten rechts und links bewegen können, um von Objekt zu Objekt zu gelangen, welches mit diesem Raum an der entsprechenden Position verknüpft ist. Nun also der Code, der mir bisher hierzu eingefallen ist. Jedwede konstruktive Hilfe ist höchstens wilkommen. WEventuell findet sich ja sogar jemand, der mit mir gemeinsam an dem Projekt arbeiten möchte?

#include <conio.h>
#include <stdio.h>
#include <string.h>

typedef struct { // structure for storing room atributes
char name[32];
char longdesc[4096];
}room;

typedef struct { // Connections between rooms, put numbers in there wich represent the rooms position in the rooms array.
char name[32]; // name of the connection
int dest1;
int dest2;
int locked;
}connection;

typedef struct { // Items
char name[32];
int sice;
int weight;
}item;
     
typedef struct { // Object<->location  list, storing int handles telling wich Object of wich type resides where and at wich position
int type; // Door, Item, …
int number; // A number from the object arrays.
int pos; //Position in the room.
}objectLocation;

room rooms[4]; // Array for all rooms
connection connections[2]; // Array storing connections between rooms
objectLocation objectLocations[3];
item items[1];
int currentRoom = 2; // The room player is currently in
int focusedObject; // Object with focus and ready for interaction (Door, item …)
  int connectionCounter;
  connectionCounter = sizeof(connections)/44; // size of one data set in bytes, needed vor sequenciell processing
  int objectCounter;
  objectCounter = sizeof(objectLocations)/12; // Same as above
  int itemCounter;
  itemCounter = sizeof(items)/40; // Same as above
int running = 1; // used in loop
int HandleKeyboardInput(); // Wich key has been pressed?
void setupRooms(); // as the name states :smile:
void setupConnections();
void displayRoom(); //debug function to display room information in main loop
void displayConnections(); // same as above
void setupObjects();
void displayObjects();
void setupItems();
void setFocus(int dir);

int main(int argc, char *argv[])
{
    setupRooms();
    setupConnections();
setupItems();
    setupObjects();
    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“);
strcpy(rooms[3].name, „Badezimmer“);
strcpy(rooms[3].longdesc, „Ein wundervolles Badezimmer“);
}void displayRoom() {
printf(„currentRoom = %s\n longDesc = %s\n“, rooms[currentRoom].name, rooms[currentRoom].longdesc);
displayObjects();
}

void setupConnections() {
     strcpy(connections[0].name, „Schiebetür“);
connections[0].dest1 = 1;    
connections[0].dest2 = 2;    
connections[0].locked = 0;
     strcpy(connections[1].name, „Falttür“);
connections[1].dest1 = 3;    
connections[1].dest2 = 2;    
connections[1].locked = 0;
     }

void setupObjects() { // Put all items in thair initial positions
objectLocations[0].type = 1;
// objectLocations[0].number = 1;
objectLocations[0].pos = 1;
objectLocations[1].type = 1;
// objectLocations[1].number = 2;
objectLocations[1].pos = 1;
}

void displayObjects() {
 int i; // Iterator for all objects
 int j; // Iterator for the connections
 int k; // iterator for the items
 for (i=0;i<objectCounter;i++) {
  printf("%d.objekt\n",i);
  switch(objectLocations[i].type) {
   case 1:
    for(j=0;j<connectionCounter;j++) {
     if (connections[j].dest1 == currentRoom || connections[j].dest2 == currentRoom) {
     printf("%s.verbindung\n",connections[j].name);
    }
   }
   case 2: break;
  }
 }
}

void setupItems() {
strcpy(items[0].name, „kleiderschrank“);
}void setFocus(int dir) {
switch(dir) {
            case 0: focusedObject–;break;
            case 1: focusedObject++;break;
                        }    
}

Und nun bin ich gespannt auf Antworten.

Freundlichen Gruß

Richard

Tach,

erstmal großen Respekt davor blind zu programmieren. Hätte nicht gedacht, dass das möglich ist, aber man wird ja gern eines besseren belehrt.

Ich muss zugeben, komplett angesehen habe ich mir deinen code nicht, aber einen vorschlag, wie ich das ganze realisieren würde.

Ich würde eine einfach verkettete Liste erstellen und dort alle Räume speichern. Die Räume können dann von mir aus eine ID, einen Namen, etc haben. Jeder Raum hat dann noch eine Liste innne, welche die Objekte mit positionsnummern im Raum innehaben.

So könntest du jetzt, statt als verlinkung IDs zu verwenden, das ganze via Pointer verlinken. Das ist zwar etwas frickelig im aufbau, aber beim spiel selbst wird es damit meiner meinung nach leichter gehen, generell alles direkt via Pointer zur verfügung zu haben. So musst du anfangs nur einmal die „map“ aufbauen und dannach kannst du dich navigationstechnisch an den pointern langhangeln und musst dir da keine gedanken mehr machen.

Beste Grüßen und noch viel Erfolg!