diff --git a/Startcode/game.c b/Startcode/game.c index 4d5baef..b9d2e9c 100644 --- a/Startcode/game.c +++ b/Startcode/game.c @@ -1,101 +1,132 @@ #include "game.h" -#include + +#include "game.h" #include #include -#include +#include -#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 +#define MAX_ATTEMPTS 100 +#define EMPTY_CHAR '\0' -//TODO: Spiellogik implementieren: -/* * Wörter aus der Wortliste zufällig horizontal oder vertikal platzieren - * restliche Felder mit zufälligen Buchstaben füllen */ - -int createWordSalad(char salad[MAX_SEARCH_FIELD_LEN][MAX_SEARCH_FIELD_LEN], unsigned int searchFieldLen, const char words[][MAX_WORD_LEN], unsigned int wordCount) +typedef enum { - //befüllen des Arrays mit '\0' - for(unsigned int i = 0; i < searchFieldLen; i++) - { - for(unsigned int j = 0; j < searchFieldLen; j++) - { - salad[i][j] = '\0'; - } - } + HORIZONTAL, + VERTICAL +} Direction; - //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; +int createWordSalad( + char salad[MAX_SEARCH_FIELD_LEN][MAX_SEARCH_FIELD_LEN], + unsigned int searchFieldLen, + const char words[][MAX_WORD_LEN], + unsigned int wordCount) +{ + /* Spielfeldgroesse pruefen */ + if (searchFieldLen == 0 || + searchFieldLen > MAX_SEARCH_FIELD_LEN) + { + return 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; + int placedWords = 0; - if ((dir == 0 && (zeile + laenge > searchFieldLen)) || - (dir == 1 && (spalte + laenge > searchFieldLen))) - { + /* Alle Felder initialisieren */ + for (unsigned int i = 0; i < searchFieldLen; i++) + { + for (unsigned int j = 0; j < searchFieldLen; j++) + { + salad[i][j] = EMPTY_CHAR; + } + } + + /* Richtungsvektoren */ + int dx[] = {1, 0}; + int dy[] = {0, 1}; + + /* Alle Woerter durchlaufen */ + for (unsigned int w = 0; w < wordCount; w++) + { + size_t wordLen = strlen(words[w]); + + /* Leere oder zu lange Woerter ueberspringen */ + if (wordLen == 0 || wordLen > 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]) + int placed = 0; + int attempts = 0; + + while (!placed && attempts < MAX_ATTEMPTS) + { + attempts++; + + /* Zufallsrichtung bestimmen */ + Direction dir = rand() % 2; + + unsigned int row; + unsigned int col; + + /* Zufallsposition so waehlen, dass das Wort hineinpasst */ + if (dir == HORIZONTAL) { - kollision = 1; - break; + row = rand() % searchFieldLen; + col = rand() % (searchFieldLen - wordLen + 1); } - } - - if(!kollision) // keine kollision, also setzten der buchstaben - { - for(int i = 0; i < laenge; i++) + else { - int z = zeile + dy[dir] * i; - int s = spalte + dx[dir] * i; - salad[z][s] = words[w][i]; + row = rand() % (searchFieldLen - wordLen + 1); + col = rand() % searchFieldLen; } - placed = 1; - } - } - if(!placed) //überprüft ob das Wort gesetzt wurde, wenn nicht Fehlerausgabe - { - return FEHLER_SETZEN; - } - } + int collision = 0; - //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] == '\0') - { - salad[i][j] = 'A' + rand() % 26; - } - } - } + /* Pruefen, ob die Position geeignet ist */ + for (size_t i = 0; i < wordLen; i++) + { + unsigned int z = row + dy[dir] * i; + unsigned int s = col + dx[dir] * i; - return (int)wordCount; + char letter = + (char)toupper((unsigned char)words[w][i]); + + if (salad[z][s] != EMPTY_CHAR && + salad[z][s] != letter) + { + collision = 1; + break; + } + } + + /* Wenn keine Kollision besteht, Wort eintragen */ + if (!collision) + { + for (size_t i = 0; i < wordLen; i++) + { + unsigned int z = row + dy[dir] * i; + unsigned int s = col + dx[dir] * i; + + salad[z][s] = + (char)toupper((unsigned char)words[w][i]); + } + + placed = 1; + placedWords++; + } + } + } + + /* Leere Felder mit zufaelligen Buchstaben fuellen */ + for (unsigned int i = 0; i < searchFieldLen; i++) + { + for (unsigned int j = 0; j < searchFieldLen; j++) + { + if (salad[i][j] == EMPTY_CHAR) + { + salad[i][j] = (char)('A' + rand() % 26); + } + } + } + + return placedWords; } diff --git a/Startcode/testwords_delims.txt b/Startcode/testwords_delims.txt deleted file mode 100644 index e721fce..0000000 --- a/Startcode/testwords_delims.txt +++ /dev/null @@ -1 +0,0 @@ -Hund,Katze; Maus diff --git a/Startcode/testwords_empty.txt b/Startcode/testwords_empty.txt deleted file mode 100644 index e69de29..0000000 diff --git a/Startcode/testwords_simple.txt b/Startcode/testwords_simple.txt deleted file mode 100644 index 37d7524..0000000 --- a/Startcode/testwords_simple.txt +++ /dev/null @@ -1,3 +0,0 @@ -Apfel -Banane -Kiwi \ No newline at end of file