diff --git a/I2_Wortsalat/Start_Windows/game.c b/I2_Wortsalat/Start_Windows/game.c index b9d31a9..1c8027c 100644 --- a/I2_Wortsalat/Start_Windows/game.c +++ b/I2_Wortsalat/Start_Windows/game.c @@ -10,12 +10,106 @@ /* * Wörter aus der Wortliste zufällig horizontal oder vertikal platzieren * restliche Felder mit zufälligen Buchstaben füllen */ +void fillRestWithRandom(char salad[MAX_SEARCH_FIELD_LEN][MAX_SEARCH_FIELD_LEN], unsigned int searchFieldLen) +{ + for (int i = 0; i < searchFieldLen; i++) + { + for (int j = 0; j < searchFieldLen; j++) + { + if (salad[i][j] == EMPTY_CHAR) { + salad[i][j] = rand() % ('Z' - 'A' + 1) + 'A'; + } + } + } +} + // Creates the word salad by placing words randomly and filling empty spaces +// - 2D array salad -> fertiger Wortsalat +// - searchFieldLen -> Dimension der Salatschüssel +// - 2D array words -> gegebene Wörter +// - wordCount -> anzahl an Wörtern int createWordSalad(char salad[MAX_SEARCH_FIELD_LEN][MAX_SEARCH_FIELD_LEN], unsigned int searchFieldLen, const char words[][MAX_WORD_LEN], unsigned int wordCount) { + int placedWords = 0; + //Feld komplettmit EMPTY_CHAR füllen + for (int i = 0; i < searchFieldLen; i++) + { + for (int j = 0; j < searchFieldLen; j++) + { + salad[i][j] = EMPTY_CHAR; + } + } + //Wörter plazieren + for (int wordNumber = 0; wordNumber < wordCount; wordNumber++) + { + int wordLength = strlen(words[wordNumber]); + int placed = 0; + for (int attempt = 0; attempt < MAX_RAND_TRIES_PER_WORD && !placed; attempt++) + { + int horizontal = rand() % 2; // 0 = vertikal, 1 = horizontal + + int x = rand() % searchFieldLen; + int y = rand() % searchFieldLen; + + if (horizontal) + { + if (x + wordLength > searchFieldLen) continue; // passt nicht + + //Prüfen ob kein anderes Wort im Weg + int fits = 1; + for (int i = 0; i < wordLength; i++) + { + if (salad[y][x + i] != EMPTY_CHAR) + { + fits = 0; + break; + } + } + + //Wort plazieren + if (fits) + { + for (int i = 0; i < wordLength; i++) + { + salad[y][x + i] = words[wordNumber][i]; + } + placed = 1; + placedWords++; + } + } + else //Wort vertikal plazieren + { + if (y + wordLength > searchFieldLen) continue; + + //Prüfen ob kein anderes Wort im Weg + int fits = 1; + for (int i = 0; i < wordLength; i++) + { + if (salad[y + i][x] != EMPTY_CHAR) + { + fits = 0; + break; + } + } + + //Wort plazieren + if (fits) + { + for (int i = 0; i < wordLength; i++) + { + salad[y + i][x] = words[wordNumber][i]; + } + placed = 1; + placedWords++; + } + } + } + } + fillRestWithRandom(salad, searchFieldLen); + return placedWords; } // Prints the word salad to console diff --git a/I2_Wortsalat/Start_Windows/input.c b/I2_Wortsalat/Start_Windows/input.c index 9c4ef16..43d8db7 100644 --- a/I2_Wortsalat/Start_Windows/input.c +++ b/I2_Wortsalat/Start_Windows/input.c @@ -8,17 +8,19 @@ // Read words from file and store in 'words' array int readWords(FILE *file, char words[][MAX_WORD_LEN], unsigned int maxWordCount) { - char lines [1024]; //TODO: Sinnvolle Begrenzung finden + char lines [(MAX_WORD_LEN + 2) * maxWordCount]; //Es wird davon ausgegangen, dass die Wörter nur durch eine Trennzeichen und ein Leerzeichen von einander gertrennt gespeichert werden int word_counter = 0; while (fgets(lines, sizeof(lines) , file) != NULL) { + for (int i = 0; lines[i] != '\0'; i++) //Entfernen von \n aus dem String { - if (lines[i] == '\n') + lines[i] = toupper(lines[i]); + if (lines[i] == '\n') { lines[i] = '\0'; - break; + break; } } @@ -31,7 +33,10 @@ int readWords(FILE *file, char words[][MAX_WORD_LEN], unsigned int maxWordCount) word_counter++; single_word = strtok(NULL, " ;,"); } + + } + return word_counter; } \ No newline at end of file