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
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