From 45a30468f70475fdf9052bf4e5df9aeb602bf581 Mon Sep 17 00:00:00 2001 From: zidanmo99094 Date: Fri, 30 Oct 2026 14:58:59 +0100 Subject: [PATCH] txt1 --- Startcode/game.c | 61 ++++++++++++++++++++++++++---------------------- 1 file changed, 33 insertions(+), 28 deletions(-) diff --git a/Startcode/game.c b/Startcode/game.c index 1a18ca5..9e7a27c 100644 --- a/Startcode/game.c +++ b/Startcode/game.c @@ -1,64 +1,69 @@ #include "game.h" -#include #include #include -#include // Für toupper() +#include #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) { - // 1. Komplettes Array sicherheitshalber mit EMPTY_CHAR leeren + // 1. Spielfeld vollständig zurücksetzen memset(salad, EMPTY_CHAR, MAX_SEARCH_FIELD_LEN * MAX_SEARCH_FIELD_LEN); int placedWordsCount = 0; - // 2. Wörter platzieren + // 2. Wörter im Spielfeld 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]); - while (len > 0 && (words[i][len - 1] == '\n' || words[i][len - 1] == '\r' || words[i][len - 1] == ' ')) { - words[i][--len] = '\0'; + 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; } - // 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 + // Versuche, eine freie und kollisionsfreie Position zu finden for (int attempt = 0; attempt < MAX_RAND_TRIES_PER_WORD; attempt++) { - - int is_vert = rand() % 2; - int dr = is_vert; - int dc = !is_vert; + Direction dir = (rand() % 2 == 0) ? DIR_HORIZONTAL : DIR_VERTICAL; - // 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 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 (int k = 0; k < len; k++) { + for (unsigned int k = 0; k < len; k++) { char current = salad[row + k * dr][col + k * dc]; - char wordChar = (char)toupper((unsigned char)words[i][k]); - - // Feld muss leer sein oder denselben Buchstaben enthalten - if (current != EMPTY_CHAR && current != wordChar) { + if (current != EMPTY_CHAR && current != words[i][k]) { canPlace = 0; break; } } + // Wort eintragen, wenn der Platz gültig ist if (canPlace) { - for (int k = 0; k < len; k++) { - salad[row + k * dr][col + k * dc] = (char)toupper((unsigned char)words[i][k]); + for (unsigned int k = 0; k < len; k++) { + salad[row + k * dr][col + k * dc] = words[i][k]; } placedWordsCount++; - break; + break; } } } - // 3. Verbleibende leere Felder (nur innerhalb der gridSize) mit Zufallsbuchstaben auffüllen + // 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) {