diff --git a/Start_Windows/game.c b/Start_Windows/game.c index d8cc133..847ff47 100644 --- a/Start_Windows/game.c +++ b/Start_Windows/game.c @@ -6,18 +6,187 @@ #define MAX_RAND_TRIES_PER_WORD 10 #define EMPTY_CHAR 0 -//TODO: Spiellogik implementieren: + +//DONE: Spiellogik implementieren: /* * 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"); + } } + diff --git a/Start_Windows/main.c b/Start_Windows/main.c index c591f9c..69016d5 100644 --- a/Start_Windows/main.c +++ b/Start_Windows/main.c @@ -8,9 +8,9 @@ #define SALAD_SIZE 20 // selbstgeschriebene Definitionen: -// annahmen ist das windowWidth in pixeln gegeben -// werden muss, da auch andere funktionen wie -// createCharSquarePanel in Pixeln arbeiten +// annahmen ist das windowWidth in pixeln gegeben +// werden muss, da auch andere funktionen wie +// createCharSquarePanel in Pixeln arbeiten #define WINDOW_WIDTH 540 @@ -57,8 +57,8 @@ int main(int argc, char *argv[]) else { // annahme: windowWidth wird in Pixeln gesucht, - // da auch andere funktionen, wie createCharSquarePanel - // in Pixeln arbeiten + // da auch andere funktionen, wie createCharSquarePanel + // in Pixeln arbeiten startGame(wordSalad, MAX_SEARCH_FIELD_LEN, words, placedWords, WINDOW_WIDTH); }