Kommentare game.c

This commit is contained in:
David committed 2026-11-02 07:52:34 +01:00
1 parent f6ee05cd0e
commit c96e95db7a
1 file changed
+18 -18
+18 -18
View File
@@ -6,18 +6,18 @@
#define MAX_RAND_TRIES_PER_WORD 10 #define MAX_RAND_TRIES_PER_WORD 10
#define EMPTY_CHAR 0 #define EMPTY_CHAR 0
// Hilfsfunktion: Sichere Längenermittlung mit Obergrenze // Hilfsfunktion 1: Sichere Längenermittlung mit Obergrenze
static size_t safeStrnlen(const char *str, size_t maxLen) static size_t safeStrnlen(const char *str, size_t maxLen) //ermittelt die Wortlänge bis zur max. Grenze
{ {
size_t len = 0; size_t len = 0;
while (len < maxLen && str[len] != '\0') while (len < maxLen && str[len] != '\0') //ermittelt die max Länge und mit '\0' endet jedes Wort
{ {
len++; len++;
} }
return len; return len;
} }
// Hilfsfunktion: Prüft kollisionsfrei, ob ein Wort an die Position passt // Hilfsfunktion2 : Prüft kollisionsfrei, ob ein Wort an die Position passt
// Arraygrößen (fieldLen, wordLen) werden explizit als Parameter übergeben // Arraygrößen (fieldLen, wordLen) werden explizit als Parameter übergeben
static int canPlaceWord(const char salad[MAX_SEARCH_FIELD_LEN][MAX_SEARCH_FIELD_LEN], static int canPlaceWord(const char salad[MAX_SEARCH_FIELD_LEN][MAX_SEARCH_FIELD_LEN],
@@ -28,10 +28,10 @@ static int canPlaceWord(const char salad[MAX_SEARCH_FIELD_LEN][MAX_SEARCH_FIELD_
unsigned int col, unsigned int col,
int isVertical) int isVertical)
{ {
for (unsigned int k = 0; k < wordLen; k++) for (unsigned int k = 0; k < wordLen; k++) //Prüft ob das Wort in das 20x20 Feld passt
{ {
unsigned int r = isVertical ? (row + k) : row; unsigned int r = isVertical ? (row + k) : row; //jeder Buchstabe berechnet wo er landet
unsigned int c = isVertical ? col : (col + k); unsigned int c = isVertical ? col : (col + k); //Reihe = row und Zeile = col bzw. coloumn
// Überlaufschutz: Innerhalb der Arraygrenzen bleiben // Überlaufschutz: Innerhalb der Arraygrenzen bleiben
if (r >= fieldLen || c >= fieldLen) if (r >= fieldLen || c >= fieldLen)
{ {
@@ -46,7 +46,7 @@ static int canPlaceWord(const char salad[MAX_SEARCH_FIELD_LEN][MAX_SEARCH_FIELD_
return 1; return 1;
} }
// Hilfsfunktion: Schreibt das Wort in das Spielfeld // Hilfsfunktion3: Schreibt das Wort in das Spielfeld
// Arraygrößen (fieldLen, wordLen) werden explizit als Parameter übergeben // Arraygrößen (fieldLen, wordLen) werden explizit als Parameter übergeben
static void placeWord(char salad[MAX_SEARCH_FIELD_LEN][MAX_SEARCH_FIELD_LEN], static void placeWord(char salad[MAX_SEARCH_FIELD_LEN][MAX_SEARCH_FIELD_LEN],
unsigned int fieldLen, unsigned int fieldLen,
@@ -56,24 +56,24 @@ static void placeWord(char salad[MAX_SEARCH_FIELD_LEN][MAX_SEARCH_FIELD_LEN],
unsigned int col, unsigned int col,
int isVertical) int isVertical)
{ {
for (unsigned int k = 0; k < wordLen; k++) for (unsigned int k = 0; k < wordLen; k++) //im Endeffekt genau wie Hilfsfunktion 2
{ {
unsigned int r = isVertical ? (row + k) : row; unsigned int r = isVertical ? (row + k) : row;
unsigned int c = isVertical ? col : (col + k); unsigned int c = isVertical ? col : (col + k);
if (r < fieldLen && c < fieldLen) if (r < fieldLen && c < fieldLen)
{ {
salad[r][c] = word[k]; salad[r][c] = word[k]; //nur wird hier nicht überprüft sondern richtig geschrieben
} }
} }
} }
// Erzeugt Wortsalat und platziert leere Felder mit random Buchstaben // Erzeugt Wortsalat und platziert leere Felder mit random Buchstaben (Hauptfunktion)
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 createWordSalad(char salad[MAX_SEARCH_FIELD_LEN][MAX_SEARCH_FIELD_LEN], unsigned int searchFieldLen, const char words[][MAX_WORD_LEN], unsigned int wordCount)
{ {
// Sicherheitsprüfung der übergebenen Parameter // Sicherheitsprüfung der übergebenen Parameter
if (salad == NULL || words == NULL || searchFieldLen == 0 || searchFieldLen > MAX_SEARCH_FIELD_LEN) if (salad == NULL || words == NULL || searchFieldLen == 0 || searchFieldLen > MAX_SEARCH_FIELD_LEN)
{ {
return -1; return -1; //falls keine Wörter übergeben, dann bricht Spiel ab
} }
// Zufallsgenerator initialisieren // Zufallsgenerator initialisieren
static int seeded = 0; static int seeded = 0;
@@ -82,7 +82,7 @@ int createWordSalad(char salad[MAX_SEARCH_FIELD_LEN][MAX_SEARCH_FIELD_LEN], unsi
srand((unsigned int)time(NULL)); srand((unsigned int)time(NULL));
seeded = 1; seeded = 1;
} }
// 1. Spielfeld komplett mit EMPTY_CHAR leeren // 1. Spielfeld komplett mit EMPTY_CHAR leeren, es stehen überall danach nur noch '0'
for (unsigned int r = 0; r < searchFieldLen; r++) for (unsigned int r = 0; r < searchFieldLen; r++)
{ {
for (unsigned int c = 0; c < searchFieldLen; c++) for (unsigned int c = 0; c < searchFieldLen; c++)
@@ -94,12 +94,12 @@ int createWordSalad(char salad[MAX_SEARCH_FIELD_LEN][MAX_SEARCH_FIELD_LEN], unsi
char currentWord[MAX_WORD_LEN]; char currentWord[MAX_WORD_LEN];
unsigned int placedCount = 0; unsigned int placedCount = 0;
// 2. Wörter platzieren // 2. Wörter platzieren
for (unsigned int i = 0; i < wordCount; i++) for (unsigned int i = 0; i < wordCount; i++) //alle Wörter werden nacheinander eingearbeitet
{ {
// Wort sicher mit strncpy kopieren und terminieren // Wort sicher mit strncpy kopieren und terminieren, mit memset wird beim ersten Durchlauf genullt
memset(currentWord, 0, sizeof(currentWord)); memset(currentWord, 0, sizeof(currentWord));
strncpy(currentWord, words[i], MAX_WORD_LEN - 1); strncpy(currentWord, words[i], MAX_WORD_LEN - 1);
currentWord[MAX_WORD_LEN - 1] = '\0'; currentWord[MAX_WORD_LEN - 1] = '\0'; //falls Wort zulange wieder mit '\0' Beenden erzwingen
unsigned int wordLen = (unsigned int)safeStrnlen(currentWord, MAX_WORD_LEN); unsigned int wordLen = (unsigned int)safeStrnlen(currentWord, MAX_WORD_LEN);
if (wordLen == 0) if (wordLen == 0)
{ {
@@ -111,10 +111,10 @@ for (unsigned int i = 0; i < wordCount; i++)
continue; continue;
} }
int placed = 0; int placed = 0;
for (int attempt = 0; attempt < MAX_RAND_TRIES_PER_WORD; attempt++) for (int attempt = 0; attempt < MAX_RAND_TRIES_PER_WORD; attempt++) //10 Versuche das Wort zu platzieren
{ {
// Richtung würfeln: 0 = Horizontal, 1 = Vertikal // Richtung würfeln: 0 = Horizontal, 1 = Vertikal
int isVertical = rand() % 2; int isVertical = rand() % 2; //hier entscheidet der Zufall ob row oder col
unsigned int row = 0; unsigned int row = 0;
unsigned int col = 0; unsigned int col = 0;
if (isVertical) if (isVertical)