forked from freudenreichan/info2Praktikum-Wortsalat
Kommentare game.c
This commit is contained in:
1 parent
f6ee05cd0e
commit
c96e95db7a
1 file changed
+18
-18
+18
-18
@@ -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)
|
||||||
|
|||||||
Reference in new issue
Block a user