From bcc2fc3883a22aa4043e784b38fa422327f621fb Mon Sep 17 00:00:00 2001 From: poppni99154 Date: Sun, 9 Nov 2025 17:51:45 +0100 Subject: [PATCH] =?UTF-8?q?habe=20game=20und=20main=20eingef=C3=BCgt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Start_Windows/game.c | 120 +++++++++++++++++++++++++++++++++++++++++-- Start_Windows/main.c | 13 +++++ 2 files changed, 128 insertions(+), 5 deletions(-) diff --git a/Start_Windows/game.c b/Start_Windows/game.c index d8cc133..5ebb2e9 100644 --- a/Start_Windows/game.c +++ b/Start_Windows/game.c @@ -2,6 +2,7 @@ #include #include #include +#include #define MAX_RAND_TRIES_PER_WORD 10 #define EMPTY_CHAR 0 @@ -10,14 +11,123 @@ /* * 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) +// einmalige Initialisierung des RNG +static void initRandom(void) { - + static int seeded = 0; + if (!seeded) + { + srand((unsigned int)time(NULL)); + seeded = 1; + } } -// Prints the word salad to console -void showWordSalad(const char salad[MAX_SEARCH_FIELD_LEN][MAX_SEARCH_FIELD_LEN], unsigned int searchFieldLen) +static int placeWordHorizontal(char salad[MAX_SEARCH_FIELD_LEN][MAX_SEARCH_FIELD_LEN], + unsigned int fieldLen, + const char *word) { + unsigned int wordLen = (unsigned int)strlen(word); + if (wordLen > fieldLen) + return 0; + // zufällige Zeile, passende Startspalte + unsigned int row = (unsigned int)(rand() % fieldLen); + unsigned int maxStartCol = fieldLen - wordLen; + unsigned int col = (unsigned int)(rand() % (maxStartCol + 1)); + + // Kollisionen prüfen + for (unsigned int i = 0; i < wordLen; i++) + { + if (salad[row][col + i] != EMPTY_CHAR) + return 0; + } + + // setzen + for (unsigned int i = 0; i < wordLen; i++) + salad[row][col + i] = word[i]; + + return 1; +} + +static int placeWordVertical(char salad[MAX_SEARCH_FIELD_LEN][MAX_SEARCH_FIELD_LEN], + unsigned int fieldLen, + const char *word) +{ + unsigned int wordLen = (unsigned int)strlen(word); + if (wordLen > fieldLen) + return 0; + + // zufällige Spalte, passende Startzeile + unsigned int col = (unsigned int)(rand() % fieldLen); + unsigned int maxStartRow = fieldLen - wordLen; + unsigned int row = (unsigned int)(rand() % (maxStartRow + 1)); + + // Kollisionen prüfen + for (unsigned int i = 0; i < wordLen; i++) + { + if (salad[row + i][col] != EMPTY_CHAR) + return 0; + } + + // setzen + for (unsigned int i = 0; i < wordLen; i++) + salad[row + i][col] = word[i]; + + return 1; +} + +int createWordSalad(char salad[MAX_SEARCH_FIELD_LEN][MAX_SEARCH_FIELD_LEN], + unsigned int searchFieldLen, + const char words[][MAX_WORD_LEN], + unsigned int wordCount) +{ + initRandom(); + + // 1) Feld leeren + for (unsigned int r = 0; r < searchFieldLen; r++) + for (unsigned int c = 0; c < searchFieldLen; c++) + salad[r][c] = EMPTY_CHAR; + + unsigned int placedWords = 0; + + // 2) Wörter platzieren (horizontal oder vertikal, max. 10 Versuche/Wort) + for (unsigned int w = 0; w < wordCount; w++) + { + const char *word = words[w]; + int placed = 0; + + for (int tries = 0; tries < MAX_RAND_TRIES_PER_WORD && !placed; tries++) + { + int dir = rand() % 2; // 0: horizontal, 1: vertikal + if (dir == 0) + placed = placeWordHorizontal(salad, searchFieldLen, word); + else + placed = placeWordVertical(salad, searchFieldLen, word); + } + + if (placed) + placedWords++; + } + + // 3) restliche Felder mit A–Z füllen + for (unsigned int r = 0; r < searchFieldLen; r++) + for (unsigned int c = 0; c < searchFieldLen; c++) + if (salad[r][c] == EMPTY_CHAR) + salad[r][c] = (char)('A' + (rand() % 26)); + + return (int)placedWords; +} + +void showWordSalad(const char salad[MAX_SEARCH_FIELD_LEN][MAX_SEARCH_FIELD_LEN], + unsigned int searchFieldLen) +{ + for (unsigned int r = 0; r < searchFieldLen; r++) + { + for (unsigned int c = 0; c < searchFieldLen; c++) + { + putchar(salad[r][c]); + putchar(' '); + } + putchar('\n'); + } } diff --git a/Start_Windows/main.c b/Start_Windows/main.c index 03da755..93cb129 100644 --- a/Start_Windows/main.c +++ b/Start_Windows/main.c @@ -6,6 +6,7 @@ #define MAX_NUMBER_OF_WORDS 100 #define SALAD_SIZE 20 +#define WINDOW_SIZE 800 // Fenstergröße int main(int argc, char *argv[]) { @@ -41,6 +42,18 @@ int main(int argc, char *argv[]) // Start the game if successful // error message if some words couldn't be placed + if (placedWords == wordCount && wordCount > 0) + { + startGame(wordSalad, SALAD_SIZE, words, wordCount, WINDOW_SIZE); + } + else + { + // error message if some words couldn't be placed + fprintf(stderr, + "Es konnten nicht alle Worter plaziert werden (%u von %u placed).\n", + placedWords, wordCount); + exitCode = EXIT_FAILURE; + } } else {