#include "game.h" #include #include #include #define MAX_RAND_TRIES_PER_WORD 10 #define EMPTY_CHAR 0 //TODO: Spiellogik implementieren: /* * Wörter aus der Wortliste zufällig horizontal oder vertikal platzieren * restliche Felder mit zufälligen Buchstaben füllen */ //enum für richtungen typedef enum { HORIZONTAL, VERTICAL } Direction; //bestimmt zufällige richtung static Direction randomDirection(void) { return (rand() % 2 == 0) ? HORIZONTAL : VERTICAL; } // 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) { srand(time(NULL)); //damit bei jedme aufruf "neuer zufall" (seed wird immer auf aktuelle zeit gesetzt) // spielfeld initialisieren mit nullen for (int y = 0; y < searchFieldLen; y++) { for (int x = 0; x < searchFieldLen; x++) { salad[y][x] = EMPTY_CHAR; } } int placedWrdsAmnt = 0; //wörter platzieren for(int w = 0; w < wordCount; w++){ const char *word = words[w]; int len = strlen(word); if(len > searchFieldLen ) continue; int placed = 0; //versucht max 10 versch. positionen for(int tries = 0; tries < MAX_RAND_TRIES_PER_WORD && !placed; tries++){ Direction dir = randomDirection(); int startX = 0; int startY = 0; if(dir == HORIZONTAL){ startX = rand() % (searchFieldLen - len + 1); //zb zeile ist 10 breit (0-9), wort 5 lang -> start nur in 0-5 möglich -> 10 - 5 + 1 = 6 (rand() % 6 = 0 bis 5) startY = rand() % searchFieldLen; //egal wo }else{ startX = rand() % searchFieldLen; startY = rand() % (searchFieldLen - len + 1); } //passt wort rein? (komplett leer/hat einen überschneidenen buchstaben) --> geht ganze wort platz durch (vert oder horiz), 1 schleife = 1 buchstabe im wort int fits = 1; for (int i = 0; i < len; i++) { int x = startX + (dir == HORIZONTAL ? i : 0); //wenn zb horiz. dann erhöhe x um i, sonst bleibt x konst. int y = startY + (dir == VERTICAL ? i : 0); //wenn i.d. reihe/spalte ein buchstabe der sich nicht mit dem aktuellen wort überschneidet -> fitted nicht, stopt DIESE for loop if (salad[y][x] != EMPTY_CHAR && salad[y][x] != word[i]) { fits = 0; break; } } if(!fits){ continue; //wenn wort nicht fitted nächster positionsversuch } //wenn wort fitted -> setze ins spielfeld for(int i = 0; i < len; i++){ int x = startX + (dir == HORIZONTAL ? i : 0); int y = startY + (dir == VERTICAL ? i : 0); salad[y][x] = word[i]; } placed = 1; } placedWrdsAmnt++; } //leere felder mit random buchstaben füllen for(int y = 0; y < searchFieldLen; y++){ for(int x = 0; x < searchFieldLen; x++){ if(salad[y][x] == EMPTY_CHAR) salad[y][x] = (rand() % 26) + 'A'; } } return placedWrdsAmnt; } // Prints the word salad to console void showWordSalad(const char salad[MAX_SEARCH_FIELD_LEN][MAX_SEARCH_FIELD_LEN], unsigned int searchFieldLen) { for(int y = 0; y < searchFieldLen; y++){ for(int x = 0; x < searchFieldLen; x++){ printf("%c", salad[y][x]); } printf("\n"); } }