diff --git a/Start_Mac/game.c b/Start_Mac/game.c index d8cc133..a819215 100644 --- a/Start_Mac/game.c +++ b/Start_Mac/game.c @@ -10,14 +10,182 @@ /* * Wörter aus der Wortliste zufällig horizontal oder vertikal platzieren * restliche Felder mit zufälligen Buchstaben füllen */ +// enum to make it more clear what de current orientation is +typedef enum +{ + HORIZONTAL, + VERTIKAL +} orientation; + + +// new struct for handing over the entire wordPosition +// alignment is HORIZONTAL or VERTICAL +// rowOrColumn is the int of the colum or row the word is suposed to be placed in +// startingCell is the int of where in the row/colum the first leter of the word suposed to be placed +typedef struct +{ + orientation alignment; + unsigned int rowOrColumn; + unsigned int startingCell; +} wordPosition; + + +// Choses a random Position for the current Word +wordPosition choserandomPosition(unsigned int searchFieldLen, unsigned int wordLength) +{ + wordPosition position = {0, 0, 0}; + + srand(time(NULL)); + position.alignment = rand()%(VERTIKAL - HORIZONTAL + 1) + HORIZONTAL; + position.rowOrColumn = rand()%(searchFieldLen); + position.startingCell = rand()%(searchFieldLen - wordLength); + + return position; +} + + +// Checks if the current Position is free +// returns 1 if the Position is free +// returns 0 if the Position is occupied +int checkIfPositionIsFree(char salad[MAX_SEARCH_FIELD_LEN][MAX_SEARCH_FIELD_LEN], wordPosition position,unsigned int wordLength, unsigned int serchFieldLen) +{ + int i = 0; + int letterFound = 0; + int positionfree = 0; + + if (position.alignment == HORIZONTAL) + { + // checking to see if position is free + // by scanning each column in the given row + for (i = position.startingCell; (i < serchFieldLen) && !(letterFound); i++) + { + if ((salad[position.rowOrColumn][i] >= 'A') && (salad[position.rowOrColumn][i] <= 'z')) + { + letterFound = 1; + } + } + } + else if (position.alignment == VERTIKAL) + { + // checking to see if position is free + // by scanning each row in the given column + for (i = position.startingCell; (i < serchFieldLen) && !(letterFound); i++) + { + if ((salad[i][position.rowOrColumn] >= 'A') && (salad[i][position.rowOrColumn] <= 'z')) + { + letterFound = 1; + } + } + } + + positionfree = !letterFound; + + return positionfree; +} + + +// Places the current word into the +// selected position +// returns 1 if sucessfull +int placeWord(char salad[MAX_SEARCH_FIELD_LEN][MAX_SEARCH_FIELD_LEN], wordPosition position, const char currentWord[], unsigned int currentWordLen, unsigned int serchFieldLen) +{ + int i = 0; + + + if (position.alignment == HORIZONTAL) + { + + for (i = position.startingCell; (i < serchFieldLen) && (i < currentWordLen); i++) + { + salad[position.rowOrColumn][i] = currentWord[i]; + } + salad[position.rowOrColumn][i] = '\0'; + } + else if (position.alignment == VERTIKAL) + { + for (i = position.startingCell; (i < serchFieldLen) && (i < currentWordLen); i++) + { + salad[i][position.rowOrColumn] = currentWord[i]; + } + salad[i][position.rowOrColumn] = '\0'; + } + + + return 1; +} + +// Places random letters into the +// empty fields of the wordSalad +void placeRandomLetters(char salad[MAX_SEARCH_FIELD_LEN][MAX_SEARCH_FIELD_LEN], unsigned int searchFieldLen) +{ + int i = 0; + int j = 0; + + + srand(time(NULL)); + + for (i = 0; i < searchFieldLen; i++) + { + for (j = 0; i < searchFieldLen; j++) + { + if ((salad[i][j] < 'A') && (salad[i][j] > 'z')) + { + salad[i][j] = rand()%('Z' - 'A' + 1) + 'A'; + } + } + } +} + + // Creates the word salad by placing words randomly and filling empty spaces +// returnes the number of sucessfully placed words 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 i = 0; + int j = 0; + int positionFound = 0; + int placedWords = 0; + char currentWord[MAX_WORD_LEN]; + wordPosition currentWordPosition = {0,0,0}; + + for (i = 1; i <= wordCount; i++) + { + do + { + currentWordPosition = choserandomPosition(searchFieldLen, strlen(words[i])); + positionFound = checkIfPositionIsFree(salad, currentWordPosition, strlen(words[i]), searchFieldLen); + j++; + } while ((j < MAX_RAND_TRIES_PER_WORD) && !(positionFound)); + + if (positionFound) + { + strcpy(currentWord, words[i-1]); + placedWords += placeWord(salad, currentWordPosition, currentWord, strlen(currentWord), searchFieldLen); + } + } + + placeRandomLetters(salad, searchFieldLen); + + + return placedWords; } + // Prints the word salad to console void showWordSalad(const char salad[MAX_SEARCH_FIELD_LEN][MAX_SEARCH_FIELD_LEN], unsigned int searchFieldLen) { + int i = 0; + int j = 0; + + for (i = 0; i < searchFieldLen; i++) + { + for (j = 0; i < searchFieldLen; j++) + { + printf("%c", salad[i][j]); + } + printf("\n"); + } } +