diff --git a/Start_Linux/linux/libraylib.a b/Start_Linux/linux/libraylib.a index bdc65fc..1f20160 100644 Binary files a/Start_Linux/linux/libraylib.a and b/Start_Linux/linux/libraylib.a differ diff --git a/Start_Linux/makefile b/Start_Linux/makefile index 096695a..a8d8f59 100644 --- a/Start_Linux/makefile +++ b/Start_Linux/makefile @@ -1,9 +1,9 @@ CC = gcc -CFLAGS = -g -Wall -I$(raylibfolder) +CFLAGS = -g -Wall LDFLAGS = -lGL -lX11 -lm BINARIES = ./linux -raylib_folder = ./raylib +raylibfolder = ./raylib unityfolder = ./unity # -------------------------- @@ -28,7 +28,7 @@ game.o: game.c $(CC) $(CFLAGS) -c game.c graphicalGame.o: graphicalGame.c - $(CC) $(CFLAGS) -c graphicalGame.c + $(CC) $(CFLAGS) -I$(raylibfolder) -c graphicalGame.c # -------------------------- # Unit Tests diff --git a/Start_Linux/unit_tests.c b/Start_Linux/unit_tests.c index d1a15f5..34b07ed 100644 --- a/Start_Linux/unit_tests.c +++ b/Start_Linux/unit_tests.c @@ -101,7 +101,37 @@ void test_createWordSalad_too_small(void) { } } +void test_createWordSalad_allWordsPlaced() { + char words[3][MAX_WORD_LEN] = {"CAT", "DOG", "MOUSE"}; + char saladHoriz[MAX_SEARCH_FIELD_LEN][MAX_SEARCH_FIELD_LEN]; + char saladVert[MAX_SEARCH_FIELD_LEN][MAX_SEARCH_FIELD_LEN]; + + int placed = createWordSalad(saladHoriz, 20, words, 3); + for(int i = 0; i < MAX_SEARCH_FIELD_LEN; i++) + { + for(int j = 0; j < MAX_SEARCH_FIELD_LEN; j++) + { + saladVert[j][i] = saladHoriz[i][j]; + } + } + + for(int i = 0; i < 3; i++) { + const char* word = words[i]; + int wordFound = 0; + for(int j = 0; j < MAX_SEARCH_FIELD_LEN; j++) + { + const char* row = saladHoriz[j]; + const char* col = saladVert[j]; + wordFound |= strstr(row, word) || strstr(col, word); + } + TEST_ASSERT_TRUE_MESSAGE(wordFound, "Not all words were placed."); + } + + TEST_ASSERT_EQUAL_INT(3, placed); +} + // ---------- Test Setup und TearDown Funktionen ---------- + // Hier Setup- und TearDown-Funktionen definieren, // falls Vor- und Nachbereitungen für die Tests benötigt. @@ -134,9 +164,10 @@ int main(void) { RUN_TEST(test_readWords_empty_file); RUN_TEST(test_createWordSalad_all_fit); RUN_TEST(test_createWordSalad_too_small); + RUN_TEST(test_createWordSalad_allWordsPlaced); int result = UNITY_END(); // Test-Ergebnisse print_test_result(result); return result; -} \ No newline at end of file +} diff --git a/Start_Mac/macos-x86_64/libraylib.a b/Start_Mac/macos-x86_64/libraylib.a new file mode 100644 index 0000000..bdc65fc Binary files /dev/null and b/Start_Mac/macos-x86_64/libraylib.a differ diff --git a/Start_Mac/macos-x86_64/libunity.a b/Start_Mac/macos-x86_64/libunity.a new file mode 100644 index 0000000..5d6a7b9 Binary files /dev/null and b/Start_Mac/macos-x86_64/libunity.a differ diff --git a/Start_Mac/macos-x86_64/libwordsalad.a b/Start_Mac/macos-x86_64/libwordsalad.a new file mode 100644 index 0000000..1328ebb Binary files /dev/null and b/Start_Mac/macos-x86_64/libwordsalad.a differ diff --git a/Start_Mac/macos-x86_64/libwordsalad_complete.a b/Start_Mac/macos-x86_64/libwordsalad_complete.a new file mode 100644 index 0000000..8e56353 Binary files /dev/null and b/Start_Mac/macos-x86_64/libwordsalad_complete.a differ diff --git a/Start_Mac/makefile b/Start_Mac/makefile index 49654ae..1d3b4a6 100644 --- a/Start_Mac/makefile +++ b/Start_Mac/makefile @@ -4,7 +4,7 @@ LDFLAGS = -framework OpenGL -framework CoreFoundation -framework CoreGraphics -f ARCH := $(shell uname -m) BINARIES = ./macos-$(ARCH) -raylib_folder = ./raylib +raylibfolder = ./raylib unityfolder = ./unity # -------------------------- @@ -43,4 +43,4 @@ test: input.o game.o unit_tests.c $(BINARIES)/libunity.a # Clean # -------------------------- clean: - rm -f *.o wordsalad + rm -f *.o wordsalad $(TEST_BIN) diff --git a/Start_Mac/unit_tests.c b/Start_Mac/unit_tests.c index 50a62cf..34b07ed 100644 --- a/Start_Mac/unit_tests.c +++ b/Start_Mac/unit_tests.c @@ -101,6 +101,35 @@ void test_createWordSalad_too_small(void) { } } +void test_createWordSalad_allWordsPlaced() { + char words[3][MAX_WORD_LEN] = {"CAT", "DOG", "MOUSE"}; + char saladHoriz[MAX_SEARCH_FIELD_LEN][MAX_SEARCH_FIELD_LEN]; + char saladVert[MAX_SEARCH_FIELD_LEN][MAX_SEARCH_FIELD_LEN]; + + int placed = createWordSalad(saladHoriz, 20, words, 3); + for(int i = 0; i < MAX_SEARCH_FIELD_LEN; i++) + { + for(int j = 0; j < MAX_SEARCH_FIELD_LEN; j++) + { + saladVert[j][i] = saladHoriz[i][j]; + } + } + + for(int i = 0; i < 3; i++) { + const char* word = words[i]; + int wordFound = 0; + for(int j = 0; j < MAX_SEARCH_FIELD_LEN; j++) + { + const char* row = saladHoriz[j]; + const char* col = saladVert[j]; + wordFound |= strstr(row, word) || strstr(col, word); + } + TEST_ASSERT_TRUE_MESSAGE(wordFound, "Not all words were placed."); + } + + TEST_ASSERT_EQUAL_INT(3, placed); +} + // ---------- Test Setup und TearDown Funktionen ---------- // Hier Setup- und TearDown-Funktionen definieren, @@ -135,6 +164,7 @@ int main(void) { RUN_TEST(test_readWords_empty_file); RUN_TEST(test_createWordSalad_all_fit); RUN_TEST(test_createWordSalad_too_small); + RUN_TEST(test_createWordSalad_allWordsPlaced); int result = UNITY_END(); // Test-Ergebnisse print_test_result(result); diff --git a/Start_Windows/game.c b/Start_Windows/game.c index d8cc133..313b082 100644 --- a/Start_Windows/game.c +++ b/Start_Windows/game.c @@ -6,18 +6,116 @@ #define MAX_RAND_TRIES_PER_WORD 10 #define EMPTY_CHAR 0 -//TODO: Spiellogik implementieren: +// TODO: Spiellogik implementieren: /* * Wörter aus der Wortliste zufällig horizontal oder vertikal platzieren - * restliche Felder mit zufälligen Buchstaben füllen */ + * 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) { + srand(time(NULL)); + // wipe field + int placedWords = 0; + for (int i = 0; i < searchFieldLen; i++) + { + for (int j = 0; j < searchFieldLen ; j++) + salad[i][j] = EMPTY_CHAR; + } + // place Words + for (int wordNumber = 0; wordNumber < wordCount; wordNumber++) + { + int wordlength = strlen(words[wordNumber]); + int placed = 0; + + for (int try = 0; (try < MAX_RAND_TRIES_PER_WORD) && !placed; try++) + { + int horizontal = rand() % 2; // 0 vertikal --> 1 horizontal + + int x = rand() % searchFieldLen; + int y = rand() % searchFieldLen; + + if (horizontal) + { + if (x + wordlength > searchFieldLen) // word does not fit + { + continue; + } + + int fits = 1; + + for (int i = 0; i < wordlength; i++) // position already occupied by other word + { + if (salad[y][x + i] != EMPTY_CHAR) + { + fits = 0; + break; + } + } + + if (fits) + { + for (int i = 0; i < wordlength; i++) + { + salad[y][x + i] = words[wordNumber][i]; + } + placed = 1; + placedWords++; + } + } + else + { + if ((y + wordlength) > searchFieldLen) + { + continue; + } + + int fits = 1; + + for (int i = 0; i < wordlength; i++) // position already occupied by other word + { + if (salad[y + i][x] != EMPTY_CHAR) + { + fits = 0; + break; + } + } + + if (fits) + { + for (int i = 0; i < wordlength; i++) + { + salad[y + i][x] = words[wordNumber][i]; + } + placed = 1; + placedWords++; + } + } + } + } + // fill rest with random characters + + for (int i = 0; i < searchFieldLen; i++) + { + for (int j = 0; j < searchFieldLen; j++) + { + if (salad[i][j] == EMPTY_CHAR) + { + salad[i][j] = rand() % ('Z' - 'A' + 1) + 'A'; // 90 ist Z in ASCII und A ist 65 + } + } + } + return placedWords; } // Prints the word salad to console void showWordSalad(const char salad[MAX_SEARCH_FIELD_LEN][MAX_SEARCH_FIELD_LEN], unsigned int searchFieldLen) { - + for (int i = 0; i < searchFieldLen; i++) + { + for (int j = 0; j < searchFieldLen; j++) + { + printf("%c", salad[i][j]); + } + } } diff --git a/Start_Windows/game.o b/Start_Windows/game.o new file mode 100644 index 0000000..285fca0 Binary files /dev/null and b/Start_Windows/game.o differ diff --git a/Start_Windows/graphicalGame.o b/Start_Windows/graphicalGame.o new file mode 100644 index 0000000..0995f14 Binary files /dev/null and b/Start_Windows/graphicalGame.o differ diff --git a/Start_Windows/input.c b/Start_Windows/input.c index ed77805..2763eea 100644 --- a/Start_Windows/input.c +++ b/Start_Windows/input.c @@ -8,5 +8,35 @@ // Read words from file and store in 'words' array int readWords(FILE *file, char words[][MAX_WORD_LEN], unsigned int maxWordCount) { + //kein fopen und fclose nötig, weil dies schon in der main passiert und mit *file übergeben wird// -} \ No newline at end of file + +if (file == NULL) +{ + perror("Error invalid pointer to file"); + return -1; +} + +char line[1024]; +unsigned int count = 0; + +while (fgets(line, sizeof(line), file) && (count < maxWordCount)) +{ + line[strcspn(line, "\n")] = '\0'; + + char *token = strtok(line, " ;,"); +while (token && (count < maxWordCount)) +{ + for (int i = 0; token[i] != '\0'; i++) + { + token[i] = toupper(token[i]); + } + + strcpy(words[count], token); + count++; + token = strtok(NULL, " ;,"); +} + +} +return count; +} diff --git a/Start_Windows/input.o b/Start_Windows/input.o new file mode 100644 index 0000000..eef1273 Binary files /dev/null and b/Start_Windows/input.o differ diff --git a/Start_Windows/main.c b/Start_Windows/main.c index 03da755..dfbf11f 100644 --- a/Start_Windows/main.c +++ b/Start_Windows/main.c @@ -12,7 +12,7 @@ int main(int argc, char *argv[]) int exitCode = EXIT_SUCCESS; // Check if the correct number of arguments is provided - if(argc != 2) + if (argc != 2) { fprintf(stderr, "Usage: %s \n", argv[0]); exitCode = EXIT_FAILURE; @@ -24,7 +24,7 @@ int main(int argc, char *argv[]) FILE *file = fopen(argv[1], "r"); - if(file != NULL) + if (file != NULL) { unsigned int placedWords = 0; char wordSalad[MAX_SEARCH_FIELD_LEN][MAX_SEARCH_FIELD_LEN]; // 2D array to store the word salad @@ -40,7 +40,14 @@ int main(int argc, char *argv[]) // Check if all words were successfully placed // Start the game if successful // error message if some words couldn't be placed - + if (wordCount != placedWords) + { + fprintf(stderr, "Error: %u out of %u were placed\n", placedWords, wordCount); + } + else + { + startGame(wordSalad, SALAD_SIZE, words, placedWords, 1024); + } } else { diff --git a/Start_Windows/main.o b/Start_Windows/main.o new file mode 100644 index 0000000..d7fc6ad Binary files /dev/null and b/Start_Windows/main.o differ diff --git a/Start_Windows/makefile b/Start_Windows/makefile index 146a8c6..4cfefa4 100644 --- a/Start_Windows/makefile +++ b/Start_Windows/makefile @@ -1,35 +1,40 @@ CC = gcc -CFLAGS = -g -Wall -I$(raylibfolder) +CFLAGS = -g -Wall LDFLAGS = -lopengl32 -lgdi32 -lwinmm BINARIES = ./windows -raylib_folder = ./raylib +raylibfolder = ./raylib unityfolder = ./unity +# -------------------------- +# my version +# -------------------------- +wordsalad_myversion: main.o graphicalGame.o + $(CC) main.o graphicalGame.o -o wordsalad_myversion $(BINARIES)/libwordsalad.a $(BINARIES)/libraylib.a $(LDFLAGS) + # -------------------------- # initiales Spiel bauen # -------------------------- wordsalad_initial: $(CC) -o wordsalad_initial $(BINARIES)/libwordsalad_complete.a $(BINARIES)/libraylib.a $(LDFLAGS) - # -------------------------- # Normales Spiel bauen # -------------------------- all: main.o input.o game.o graphicalGame.o $(BINARIES)/libraylib.a $(CC) $(CFLAGS) -o wordsalad main.o input.o game.o graphicalGame.o $(BINARIES)/libraylib.a $(LDFLAGS) - + main.o: main.c $(CC) -c $(CFLAGS) main.c input.o: input.c - $(CC) -c $(CFLAGS)input.c + $(CC) -c $(CFLAGS) input.c game.o: game.c $(CC) -c $(CFLAGS) game.c graphicalGame.o: graphicalGame.c - $(CC) -I$(raylib_folder) -c $(CFLAGS) graphicalGame.c + $(CC) -I$(raylibfolder) -c $(CFLAGS) graphicalGame.c # -------------------------- # Unit Tests diff --git a/Start_Windows/runTests.exe b/Start_Windows/runTests.exe new file mode 100644 index 0000000..d4e22da Binary files /dev/null and b/Start_Windows/runTests.exe differ diff --git a/Start_Windows/unit_tests.c b/Start_Windows/unit_tests.c index 50a62cf..34b07ed 100644 --- a/Start_Windows/unit_tests.c +++ b/Start_Windows/unit_tests.c @@ -101,6 +101,35 @@ void test_createWordSalad_too_small(void) { } } +void test_createWordSalad_allWordsPlaced() { + char words[3][MAX_WORD_LEN] = {"CAT", "DOG", "MOUSE"}; + char saladHoriz[MAX_SEARCH_FIELD_LEN][MAX_SEARCH_FIELD_LEN]; + char saladVert[MAX_SEARCH_FIELD_LEN][MAX_SEARCH_FIELD_LEN]; + + int placed = createWordSalad(saladHoriz, 20, words, 3); + for(int i = 0; i < MAX_SEARCH_FIELD_LEN; i++) + { + for(int j = 0; j < MAX_SEARCH_FIELD_LEN; j++) + { + saladVert[j][i] = saladHoriz[i][j]; + } + } + + for(int i = 0; i < 3; i++) { + const char* word = words[i]; + int wordFound = 0; + for(int j = 0; j < MAX_SEARCH_FIELD_LEN; j++) + { + const char* row = saladHoriz[j]; + const char* col = saladVert[j]; + wordFound |= strstr(row, word) || strstr(col, word); + } + TEST_ASSERT_TRUE_MESSAGE(wordFound, "Not all words were placed."); + } + + TEST_ASSERT_EQUAL_INT(3, placed); +} + // ---------- Test Setup und TearDown Funktionen ---------- // Hier Setup- und TearDown-Funktionen definieren, @@ -135,6 +164,7 @@ int main(void) { RUN_TEST(test_readWords_empty_file); RUN_TEST(test_createWordSalad_all_fit); RUN_TEST(test_createWordSalad_too_small); + RUN_TEST(test_createWordSalad_allWordsPlaced); int result = UNITY_END(); // Test-Ergebnisse print_test_result(result); diff --git a/Start_Windows/words.txt b/Start_Windows/words.txt index 31ee099..679b4d0 100644 --- a/Start_Windows/words.txt +++ b/Start_Windows/words.txt @@ -1,5 +1,3 @@ -Yeti,Nessie Werwolf; Vampir -Monster -Hydra;Frankenstein -Dracula;KingKong;Gremlin;Kobold,Hexe;Poltergeist -Gespenst, Oger \ No newline at end of file +Multiplikation, Division, Addition, Subtraktion, Term +Bruch +Nenner, Zaehler, Daten, Saeulendiagramm \ No newline at end of file diff --git a/Start_Windows/wordsalad_myversion.exe b/Start_Windows/wordsalad_myversion.exe new file mode 100644 index 0000000..d5ab28e Binary files /dev/null and b/Start_Windows/wordsalad_myversion.exe differ