Files

118 lines
4.0 KiB
C

#include "game.h"
#include <time.h>
#include <stdlib.h>
#include <string.h>
#define MAX_RAND_TRIES_PER_WORD 10
#define EMPTY_CHAR 0
// Funktion die eine zufällige Zahl von 0-range zurückgibt
int randomNumberInRange(unsigned int range);
//TODO: Spiellogik implementieren:
/* * 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)
{
//Rückgabewert ist die Anzahl an platzierten Wörtern
srand(time(NULL));
int placedWordsSuccess = 0;
//Array auf Spielfläche initialisieren mit leerem Char
for (int i = 0; i < searchFieldLen; i++) {
for (int u = 0; u < searchFieldLen; u++) {
salad[i][u] = EMPTY_CHAR;
}
}
// Schleife bis alle Wörter durchlaufen
for (int wordToBePlaced = 0; wordToBePlaced < wordCount; wordToBePlaced++) {
int triesPerWord = 1;
while (triesPerWord <= MAX_RAND_TRIES_PER_WORD) {
unsigned int xPosition = randomNumberInRange(searchFieldLen-1);
unsigned int yPosition = randomNumberInRange(searchFieldLen-1);
if (salad[yPosition][xPosition] != EMPTY_CHAR) {
triesPerWord++;
continue;
}
int putWordHorizontal = randomNumberInRange(1);
//Horizontal einsetzen
if (putWordHorizontal) {
int writePossible = 1;
//Schleife um alle Stellen auf EMPTY_SPACE zu prüfen
for (int t = 0; t < MAX_WORD_LEN; t++) {
if (words[wordToBePlaced][t] == EMPTY_CHAR) break;
if (xPosition + t >= searchFieldLen) {
triesPerWord++;
writePossible = 0;
break;
}
if (salad[yPosition][xPosition + t] != EMPTY_CHAR) {
triesPerWord++;
writePossible = 0;
break;
}
}
// Nach Prüfung Wort einsetzen
if (writePossible) {
for (int t = 0; t < MAX_WORD_LEN; t++) {
if (words[wordToBePlaced][t] == EMPTY_CHAR) break;
salad[yPosition][xPosition + t] = words[wordToBePlaced][t];
}
placedWordsSuccess++;
break;
}
}
// Sonst vertikal einsetzen
else {
int writePossible = 1;
//Auf EMPTY_SPACE prüfen
for (int t = 0; t < MAX_WORD_LEN; t++) {
if (words[wordToBePlaced][t] == EMPTY_CHAR) break;
if (yPosition + t >= searchFieldLen) {
triesPerWord++;
writePossible = 0;
break;
}
if (salad[yPosition + t][xPosition] != EMPTY_CHAR) {
triesPerWord++;
writePossible = 0;
break;
}
}
//Einsetzen, wenn Felder frei
if (writePossible) {
for (int t = 0; t < MAX_WORD_LEN; t++) {
if (words[wordToBePlaced][t] == EMPTY_CHAR) break;
salad[yPosition + t][xPosition] = words[wordToBePlaced][t];
}
placedWordsSuccess++;
break;
}
}
}
}
//Restliche Felder mit Random-Buchstaben füllen
for (int zeile = 0; zeile < searchFieldLen; zeile++) {
for (int spalte = 0; spalte < searchFieldLen; spalte++) {
if (salad[zeile][spalte] == EMPTY_CHAR) {
salad[zeile][spalte] = (char)(randomNumberInRange(25)+65); //Buchstabe (ASCII) 65 - 90
}
}
}
return placedWordsSuccess; //Anzahl eingeschriebener Wörter zurückgeben
}
int randomNumberInRange(unsigned int range) {
int number = (rand() % (range+1));
return number;
}