From b55d0a22e6dce0f4d675520717c44d1260327d1d Mon Sep 17 00:00:00 2001 From: Vorname Nachname Date: Wed, 28 Oct 2026 15:58:37 +0100 Subject: [PATCH] Implement game.c --- Startcode/game.c | 85 +++++++++++++++++++++++++++++++++- Startcode/input.c | 2 +- Startcode/main.c | 2 + Startcode/testwords_delims.txt | 1 + Startcode/testwords_empty.txt | 0 Startcode/testwords_simple.txt | 3 ++ 6 files changed, 91 insertions(+), 2 deletions(-) create mode 100644 Startcode/testwords_delims.txt create mode 100644 Startcode/testwords_empty.txt create mode 100644 Startcode/testwords_simple.txt diff --git a/Startcode/game.c b/Startcode/game.c index 42e0e5d..f55b805 100644 --- a/Startcode/game.c +++ b/Startcode/game.c @@ -5,13 +5,96 @@ #define MAX_RAND_TRIES_PER_WORD 10 #define EMPTY_CHAR 0 +#define MAX_ATTEMPTS 42 //Die Antwort auf das Leben, das Universum, alles +#define FEHLER_LAENGE_WORT -1 +#define FEHLER_SETZEN -2 +#define ERFOLG 1 //TODO: Spiellogik implementieren: /* * Wörter aus der Wortliste zufällig horizontal oder vertikal platzieren * restliche Felder mit zufälligen Buchstaben füllen */ -// Creates the word salad by placing words randomly and filling empty spaces int createWordSalad(char salad[MAX_SEARCH_FIELD_LEN][MAX_SEARCH_FIELD_LEN], unsigned int searchFieldLen, const char words[][MAX_WORD_LEN], unsigned int wordCount) { + //befüllen des Arrays mit '\0' + for(unsigned int i = 0; i < searchFieldLen; i++) + { + for(unsigned int j = 0; j < searchFieldLen; i++) + { + salad[i][j] = '\0'; + } + } + //erstellen von Richtungsvektoren + int dx[] = {1, 0}; + int dy[] = {0, 1}; + //befüllen mit den Wörtern + for(unsigned int w = 0; w < wordCount; w++) + { + int laenge = strlen(words[w]); + //test ob Wort theoretisch reinpasst; was machen wir aber wenn ein Wort fast genauso lang ist wie das Feld? Wenn am Ende noch ein riesiges Wort eingesetzt werden soll, wird es nie reinpassen + if(laenge > searchFieldLen) + { + return FEHLER_LAENGE_WORT; + } + + int placed = 0; + int attempts = 0; + + while(!placed && attempts < MAX_ATTEMPTS) + { + attempts =+ 1; + int dir = rand() % 2; //Richtung: 0 = vertikal; 1 = horizontal + int zeile = rand() % searchFieldLen; + int spalte = rand() % searchFieldLen; + + if(dir == 0 && (zeile + laenge > searchFieldLen)) + if(dir == 1 && (spalte + laenge > searchFieldLen)) + { + continue; + } + + int kollision = 0; + for(int i = 0; i < laenge; i++) //Kollision mit anderen Wörtern vermeiden + { + int z = zeile + dy[dir] * i; + int s = spalte + dx[dir] * i; + if(salad[z][s] != '\0' && salad[z][s] != words[w][i]) + { + kollision = 1; + break; + } + } + + if(!kollision) // keine kollision, also setzten der buchstaben + { + for(int i = 0; i < laenge; i++) + { + int z = zeile + dy[dir] * i; + int s = spalte + dx[dir] * i; + salad[z][s] = words[w][i]; + } + placed = 1; + } + } + + if(!placed) //überprüft ob das Wort gesetzt wurde, wenn nicht Fehlerausgabe + { + return FEHLER_SETZEN; + } + } + + //befüllen mit zufälligen Buchstaben + for(unsigned int i = 0; i < searchFieldLen; i++) + { + for(unsigned int j = 0; j < searchFieldLen; j++) + { + if(salad[i][j] == '\n') + { + salad[i][j] = 'A' + rand() % 26; + } + } + } + + return ERFOLG; } diff --git a/Startcode/input.c b/Startcode/input.c index ed77805..b4ea2ec 100644 --- a/Startcode/input.c +++ b/Startcode/input.c @@ -8,5 +8,5 @@ // Read words from file and store in 'words' array int readWords(FILE *file, char words[][MAX_WORD_LEN], unsigned int maxWordCount) { - + } \ No newline at end of file diff --git a/Startcode/main.c b/Startcode/main.c index 03da755..065b5a4 100644 --- a/Startcode/main.c +++ b/Startcode/main.c @@ -11,6 +11,8 @@ int main(int argc, char *argv[]) { int exitCode = EXIT_SUCCESS; + srand(time(NULL)); //Seed für Zufallszahlen + // Check if the correct number of arguments is provided if(argc != 2) { diff --git a/Startcode/testwords_delims.txt b/Startcode/testwords_delims.txt new file mode 100644 index 0000000..e721fce --- /dev/null +++ b/Startcode/testwords_delims.txt @@ -0,0 +1 @@ +Hund,Katze; Maus diff --git a/Startcode/testwords_empty.txt b/Startcode/testwords_empty.txt new file mode 100644 index 0000000..e69de29 diff --git a/Startcode/testwords_simple.txt b/Startcode/testwords_simple.txt new file mode 100644 index 0000000..37d7524 --- /dev/null +++ b/Startcode/testwords_simple.txt @@ -0,0 +1,3 @@ +Apfel +Banane +Kiwi \ No newline at end of file