From 580e84491d01716c46f9cc82d091c2b58d16a013 Mon Sep 17 00:00:00 2001 From: zidanmo99094 Date: Fri, 30 Oct 2026 14:50:36 +0100 Subject: [PATCH] test --- Startcode/game.c | 24 ++++++--- Startcode/input.c | 128 ++++++++++++++++++++++----------------------- Startcode/runTests | Bin 56296 -> 56344 bytes 3 files changed, 79 insertions(+), 73 deletions(-) diff --git a/Startcode/game.c b/Startcode/game.c index d3ba468..1a18ca5 100644 --- a/Startcode/game.c +++ b/Startcode/game.c @@ -2,8 +2,9 @@ #include #include #include +#include // Für toupper() -#define MAX_RAND_TRIES_PER_WORD 10 +#define MAX_RAND_TRIES_PER_WORD 100 #define EMPTY_CHAR 0 int createWordSalad(char salad[MAX_SEARCH_FIELD_LEN][MAX_SEARCH_FIELD_LEN], unsigned int wordCount, char words[][100], unsigned int gridSize) @@ -15,10 +16,14 @@ int createWordSalad(char salad[MAX_SEARCH_FIELD_LEN][MAX_SEARCH_FIELD_LEN], unsi // 2. Wörter platzieren for (unsigned int i = 0; i < wordCount; i++) { + // Steuerzeichen (\n, \r) und Leerzeichen am Ende des Wortes entfernen int len = (int)strlen(words[i]); - - // WICHTIG: Wenn das Wort länger ist als das eigentliche Spielfeld (gridSize), direkt überspringen! - if (len == 0 || len > gridSize) continue; + while (len > 0 && (words[i][len - 1] == '\n' || words[i][len - 1] == '\r' || words[i][len - 1] == ' ')) { + words[i][--len] = '\0'; + } + + // Wenn das Wort leer ist oder länger als das Spielfeld, überspringen + if (len == 0 || (unsigned int)len > gridSize) continue; // Versuche eine freie Position zu finden for (int attempt = 0; attempt < MAX_RAND_TRIES_PER_WORD; attempt++) { @@ -27,14 +32,17 @@ int createWordSalad(char salad[MAX_SEARCH_FIELD_LEN][MAX_SEARCH_FIELD_LEN], unsi int dr = is_vert; int dc = !is_vert; - // Zufällige Position INNERHALB der gridSize wählen (nicht mehr 100x100!) + // Zufällige Position INNERHALB der gridSize wählen int row = rand() % (gridSize - (is_vert ? len - 1 : 0)); int col = rand() % (gridSize - (is_vert ? 0 : len - 1)); int canPlace = 1; for (int k = 0; k < len; k++) { char current = salad[row + k * dr][col + k * dc]; - if (current != EMPTY_CHAR && current != words[i][k]) { + char wordChar = (char)toupper((unsigned char)words[i][k]); + + // Feld muss leer sein oder denselben Buchstaben enthalten + if (current != EMPTY_CHAR && current != wordChar) { canPlace = 0; break; } @@ -42,7 +50,7 @@ int createWordSalad(char salad[MAX_SEARCH_FIELD_LEN][MAX_SEARCH_FIELD_LEN], unsi if (canPlace) { for (int k = 0; k < len; k++) { - salad[row + k * dr][col + k * dc] = words[i][k]; + salad[row + k * dr][col + k * dc] = (char)toupper((unsigned char)words[i][k]); } placedWordsCount++; break; @@ -50,7 +58,7 @@ int createWordSalad(char salad[MAX_SEARCH_FIELD_LEN][MAX_SEARCH_FIELD_LEN], unsi } } - // 3. Verbleibende leere Felder (nur innerhalb der gridSize!) mit Zufallsbuchstaben auffüllen + // 3. Verbleibende leere Felder (nur innerhalb der gridSize) mit Zufallsbuchstaben auffüllen for (unsigned int r = 0; r < gridSize; r++) { for (unsigned int c = 0; c < gridSize; c++) { if (salad[r][c] == EMPTY_CHAR) { diff --git a/Startcode/input.c b/Startcode/input.c index 785351c..9e7a27c 100644 --- a/Startcode/input.c +++ b/Startcode/input.c @@ -1,78 +1,76 @@ -#include "input.h" +#include "game.h" +#include #include -#include +#include -// TODO: erledigt -// eine Funktion implementieren, die ein einzelnes Wort aus einer Textdatei (words.txt) einliest und als C-String zurückgibt. -char* readSingleWord(FILE *file, char *destination, int maxLen) +#define MAX_RAND_TRIES_PER_WORD 100 +#define EMPTY_CHAR 0 + +// Enum zur sauberen Unterscheidung der Platzierungsrichtung +typedef enum { + DIR_HORIZONTAL = 0, + DIR_VERTICAL = 1 +} Direction; + +int createWordSalad(char salad[MAX_SEARCH_FIELD_LEN][MAX_SEARCH_FIELD_LEN], unsigned int wordCount, char words[][100], unsigned int gridSize) { - char buffer[256]; - int ch; - int bufIndex = 0; + // 1. Spielfeld vollständig zurücksetzen + memset(salad, EMPTY_CHAR, MAX_SEARCH_FIELD_LEN * MAX_SEARCH_FIELD_LEN); - // Alle Trennzeichen überspringen, bis ein echter Buchstabe kommt - while ((ch = fgetc(file)) != EOF) - { - // Prüfen der Buchstaben - if ((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z')) - { - // Wenn Kleinbuchstabe, in Großbuchstabe umwandeln - if (ch >= 'a' && ch <= 'z') - { - ch = ch - 32; + int placedWordsCount = 0; + + // 2. Wörter im Spielfeld platzieren + for (unsigned int i = 0; i < wordCount; i++) { + unsigned int len = (unsigned int)strlen(words[i]); + + // Wörter ignorieren, die zu lang für das eingestellte Spielfeld sind + if (len == 0 || len > gridSize) { + continue; + } + + // Versuche, eine freie und kollisionsfreie Position zu finden + for (int attempt = 0; attempt < MAX_RAND_TRIES_PER_WORD; attempt++) { + Direction dir = (rand() % 2 == 0) ? DIR_HORIZONTAL : DIR_VERTICAL; + + int dr = (dir == DIR_VERTICAL) ? 1 : 0; + int dc = (dir == DIR_HORIZONTAL) ? 1 : 0; + + // Startkoordinaten so wählen, dass das Wort nicht aus dem Spielfeld herausragt + unsigned int maxRow = (dir == DIR_VERTICAL) ? (gridSize - len + 1) : gridSize; + unsigned int maxCol = (dir == DIR_HORIZONTAL) ? (gridSize - len + 1) : gridSize; + + unsigned int row = (unsigned int)(rand() % maxRow); + unsigned int col = (unsigned int)(rand() % maxCol); + + // Prüfen, ob die Felder frei oder mit demselben Buchstaben belegt sind + int canPlace = 1; + for (unsigned int k = 0; k < len; k++) { + char current = salad[row + k * dr][col + k * dc]; + if (current != EMPTY_CHAR && current != words[i][k]) { + canPlace = 0; + break; + } + } + + // Wort eintragen, wenn der Platz gültig ist + if (canPlace) { + for (unsigned int k = 0; k < len; k++) { + salad[row + k * dr][col + k * dc] = words[i][k]; + } + placedWordsCount++; + break; } - buffer[bufIndex] = ch; - bufIndex++; - break; } } - if (ch == EOF) - { - return NULL; - } - - // Den Rest des Wortes einlesen (bricht bei Kommas, Leerzeichen etc. ab) - while ((ch = fgetc(file)) != EOF && ((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z'))) - { - if (bufIndex < 255) - { - if (ch >= 'a' && ch <= 'z') - { - ch = ch - 32; + // 3. Verbleibende leere Felder innerhalb der gridSize mit Zufallsbuchstaben ('A'-'Z') füllen + for (unsigned int r = 0; r < gridSize; r++) { + for (unsigned int c = 0; c < gridSize; c++) { + if (salad[r][c] == EMPTY_CHAR) { + salad[r][c] = 'A' + (rand() % 26); } - buffer[bufIndex] = ch; - bufIndex++; } } - - // Zwischenspeicher abschließen - buffer[bufIndex] = '\0'; - // Sicheres Kopieren in das Ziel-Array - strncpy(destination, buffer, maxLen - 1); - destination[maxLen - 1] = '\0'; - - return destination; -} -// Read words from file and store in 'words' array -int readWords(FILE *file, char words[][MAX_WORD_LEN], unsigned int maxWordCount) -{ - unsigned int count = 0; - // Schleife läuft, solange noch Platz im Array ist - while (count < maxWordCount) - { - if (readSingleWord(file, words[count], MAX_WORD_LEN) != NULL) - { - if (strlen(words[count]) > 0) // Prüfen, ob das Wort nicht leer ist - { - count++; //nächstes Wort - } - } - else - { - break; // Bei Dateiende wird die Schleife abgebrochen - } - } - return count; + return placedWordsCount; } \ No newline at end of file diff --git a/Startcode/runTests b/Startcode/runTests index 5da5634de3704d87b68473aec3c73393ce5d88b1..2fc20a5f35f4da989a117d62d771ace2bf54e2c3 100755 GIT binary patch delta 5579 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 delta 5309 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