#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 */ int tryPlaceVertical(char salad[MAX_SEARCH_FIELD_LEN][MAX_SEARCH_FIELD_LEN], unsigned int searchFieldLen, const char word[], unsigned int x, unsigned int y); int tryPlaceHorizontal(char salad[MAX_SEARCH_FIELD_LEN][MAX_SEARCH_FIELD_LEN], unsigned int searchFieldLen, const char word[], unsigned int x, unsigned int y); // 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) { // initialise with '\0' for (int x = MAX_SEARCH_FIELD_LEN - 1; x >= 0; --x) { for (int y = MAX_SEARCH_FIELD_LEN - 1; y >= 0; --y) { salad[x][y] = '\0'; } } // place words randomly int placedWords = 0; srand((unsigned int)time(NULL)); for (int word = 0; word < wordCount; word++) { // test length: // (re-)try randomly int retries = searchFieldLen * searchFieldLen; // x*y: sehr unwahrscheinlich dass kein Treffer gefunden wird int placed = 0; if(strlen(words[word]) >= searchFieldLen) break; int vertical = rand() / (RAND_MAX / 2); // int vertical = 0; while (!placed && retries > 0) { unsigned int x = 0; unsigned int y = 0; if (vertical) { int max_x = searchFieldLen - 1; int max_y = searchFieldLen - 1 - strlen(words[word]); x = rand() / (RAND_MAX / max_x); y = rand() / (RAND_MAX / max_y); } else { int max_x = searchFieldLen - 1 - strlen(words[word]); int max_y = searchFieldLen - 1; x = rand() / (RAND_MAX / max_x); y = rand() / (RAND_MAX / max_y); } // printf("Placing %s at %d,%d\n", words[word], x, y); if (vertical) placed = tryPlaceVertical(salad, searchFieldLen, words[word], x, y); else placed = tryPlaceHorizontal(salad, searchFieldLen, words[word], x, y); // if (placed) printf("Placed %s at %d,%d!\n", words[word], x, y); if (--retries < 1) break; }; if (!placed) break; else placedWords++; } // fill empty spaces for (int x = searchFieldLen - 1; x >= 0; --x) { for (int y = searchFieldLen - 1; y >= 0; --y) { if (salad[x][y] == '\0') { salad[x][y] = 'A' + (rand() / (RAND_MAX / 26)); } } } return placedWords; } int tryPlaceVertical(char salad[MAX_SEARCH_FIELD_LEN][MAX_SEARCH_FIELD_LEN], unsigned int searchFieldLen, const char word[], unsigned int x, unsigned int y) { // search fields for letters int wordLen = strlen(word); for (int testY = y; testY < (y + wordLen); testY++) { if (salad[testY][x] != '\0') { // printf("Besetzt!\n"); return 0; } } // if ok then put my word in for (int placeChar = 0; placeChar < wordLen; placeChar++) { salad[placeChar + y][x] = word[placeChar]; } return 1; } int tryPlaceHorizontal(char salad[MAX_SEARCH_FIELD_LEN][MAX_SEARCH_FIELD_LEN], unsigned int searchFieldLen, const char word[], unsigned int x, unsigned int y) { int wordLen = strlen(word); for (int testX = x; testX < (x + wordLen); testX++) { if (salad[y][testX] != '\0') { // printf("Besetzt!\n"); return 0; } } // if ok then put my word in for (int placeChar = 0; placeChar < wordLen; placeChar++) { salad[y][x + placeChar] = word[placeChar]; } return 1; }