From 42fe495bb67854732ec98e4a82cd80c7252943b7 Mon Sep 17 00:00:00 2001 From: David Moeller Date: Sun, 21 Jan 2024 12:21:17 +0100 Subject: [PATCH 001/245] Snake rough structure --- src/main/c/Snake/snake_start.c | 28 ++++++++++++++++++++++++++++ src/main/c/Snake/snake_start.h | 0 src/main/c/main.c | 5 +++-- 3 files changed, 31 insertions(+), 2 deletions(-) create mode 100644 src/main/c/Snake/snake_start.c create mode 100644 src/main/c/Snake/snake_start.h diff --git a/src/main/c/Snake/snake_start.c b/src/main/c/Snake/snake_start.c new file mode 100644 index 0000000..186f773 --- /dev/null +++ b/src/main/c/Snake/snake_start.c @@ -0,0 +1,28 @@ +#include + + +#define HEIGHT 16 +#define WIDTH 16 +#define AREA HEIGHT * WIDTH + + +typedef struct +{ + char direction; + char segments[AREA]; +}Snake; + + +void main_menu(); + + +void snake_start(){ + system("clear"); + printf("Playing Snake"); + getchar(); + main_menu(); +} + +void main_menu(){ + +} \ No newline at end of file diff --git a/src/main/c/Snake/snake_start.h b/src/main/c/Snake/snake_start.h new file mode 100644 index 0000000..e69de29 diff --git a/src/main/c/main.c b/src/main/c/main.c index eaf0b17..27cfcae 100644 --- a/src/main/c/main.c +++ b/src/main/c/main.c @@ -3,6 +3,7 @@ #include #include "Template/game100.h" +#include "Snake/snake_start.h" int main(){ bool running = true; @@ -13,7 +14,7 @@ int main(){ system("clear"); printf("Waehlen Sie eine Option:\n"); - printf("\t1.Spiel1 starten\n"); + printf("\t1.Snake starten\n"); printf("\t2.Spiel2 starten\n"); printf("\t3.Spiel3 starten\n"); printf("\t4.Spiel4 starten\n"); @@ -25,7 +26,7 @@ int main(){ switch (option){ case 1: - //start_game1(); + snake_start(); break; case 2: //start_game2(); From 37820a27b28cef00a97f02420205cda31c8ccda6 Mon Sep 17 00:00:00 2001 From: David Moeller Date: Sun, 21 Jan 2024 13:03:36 +0100 Subject: [PATCH 002/245] Initializing Game --- src/main/c/Snake/snake_start.c | 77 ++++++++++++++++++++++++++++++---- 1 file changed, 69 insertions(+), 8 deletions(-) diff --git a/src/main/c/Snake/snake_start.c b/src/main/c/Snake/snake_start.c index 186f773..4e21045 100644 --- a/src/main/c/Snake/snake_start.c +++ b/src/main/c/Snake/snake_start.c @@ -1,28 +1,89 @@ #include +#include -#define HEIGHT 16 -#define WIDTH 16 +#define HEIGHT 15 +#define WIDTH 15 #define AREA HEIGHT * WIDTH - -typedef struct -{ - char direction; +typedef struct{ + signed char direction[2]; + char length; char segments[AREA]; }Snake; void main_menu(); +void game(); +Snake initialize_game(); +void draw(Snake *snake); void snake_start(){ system("clear"); - printf("Playing Snake"); - getchar(); main_menu(); } void main_menu(){ + bool running = true; + while (running){ + int option = 0; + + system("clear"); + printf("Waehlen Sie eine Option:\n"); + printf("\t1.Start\n"); + printf("\t2.Exit\n"); + + scanf("%d", &option); + getchar(); + + system("clear"); + + switch (option){ + case 1: + game(); + break; + case 2: + running = false; + break; + + default: + break; + } + } +} + +void game(){ + Snake snake = initialize_game(); + bool running = true; + while (running) + { + draw(&snake); + } + +} + +Snake initialize_game(){ + Snake snake = {{0, 1}, 3}; + for(int i = 0; i < AREA; i++){ + snake.segments[i] = 0; + } + snake.segments[0] = 8 + 16 * 8; + snake.segments[1] = 7 + 16 * 8; + snake.segments[2] = 6 + 16 * 8; + return snake; +} + +void draw(Snake *snake){ + printf("+"); + for(int i = 0; i < WIDTH; i++){printf("-");} + printf("+\n"); + for(int i = 0; i < HEIGHT; i++){ + for(int j = 0; j < WIDTH; j++){ + } + } + printf("+"); + for(int i = 0; i < WIDTH; i++){printf("_");} + printf("\n"); } \ No newline at end of file From 189eb9570481baba1b7013139167647bc854634d Mon Sep 17 00:00:00 2001 From: David Moeller Date: Sun, 21 Jan 2024 13:22:57 +0100 Subject: [PATCH 003/245] draw Funktion --- src/main/c/Snake/snake_start.c | 31 ++++++++++++++++++++++++------- 1 file changed, 24 insertions(+), 7 deletions(-) diff --git a/src/main/c/Snake/snake_start.c b/src/main/c/Snake/snake_start.c index 4e21045..57d332f 100644 --- a/src/main/c/Snake/snake_start.c +++ b/src/main/c/Snake/snake_start.c @@ -9,7 +9,7 @@ typedef struct{ signed char direction[2]; char length; - char segments[AREA]; + unsigned char segments[AREA]; }Snake; @@ -58,9 +58,11 @@ void game(){ bool running = true; while (running) { + system("clear"); draw(&snake); + running = false; } - + getchar(); } Snake initialize_game(){ @@ -78,12 +80,27 @@ void draw(Snake *snake){ printf("+"); for(int i = 0; i < WIDTH; i++){printf("-");} printf("+\n"); - for(int i = 0; i < HEIGHT; i++){ - for(int j = 0; j < WIDTH; j++){ - + for(int i = 1; i <= HEIGHT; i++){ + printf("|"); + for(int j = 1; j <= WIDTH; j++){ + //printf("%d:", i * 16 + j); + for(int pos = 0; pos < snake->length; pos++){ + //printf(" %d", snake->segments[pos]); + if(i * 16 + j == snake->segments[pos]){ + if(pos == 0){ + printf("0"); + }else{ + printf("O"); + } + break; + }else if(pos == snake->length - 1){ + printf(" "); + } + } } + printf("|\n"); } printf("+"); - for(int i = 0; i < WIDTH; i++){printf("_");} - printf("\n"); + for(int i = 0; i < WIDTH; i++){printf("-");} + printf("+\n"); } \ No newline at end of file From d1418a1344a3cb955d9a4bd7922e666b65ee7b92 Mon Sep 17 00:00:00 2001 From: David Moeller Date: Sun, 21 Jan 2024 13:33:27 +0100 Subject: [PATCH 004/245] refactoring: drawing snake --- src/main/c/Snake/snake_start.c | 29 +++++++++++++++-------------- src/main/c/Snake/snake_start.h | 6 ++++++ 2 files changed, 21 insertions(+), 14 deletions(-) diff --git a/src/main/c/Snake/snake_start.c b/src/main/c/Snake/snake_start.c index 57d332f..efcd08b 100644 --- a/src/main/c/Snake/snake_start.c +++ b/src/main/c/Snake/snake_start.c @@ -17,6 +17,7 @@ void main_menu(); void game(); Snake initialize_game(); void draw(Snake *snake); +int part_of_snake(Snake *snake, unsigned char tile); void snake_start(){ @@ -83,24 +84,24 @@ void draw(Snake *snake){ for(int i = 1; i <= HEIGHT; i++){ printf("|"); for(int j = 1; j <= WIDTH; j++){ - //printf("%d:", i * 16 + j); - for(int pos = 0; pos < snake->length; pos++){ - //printf(" %d", snake->segments[pos]); - if(i * 16 + j == snake->segments[pos]){ - if(pos == 0){ - printf("0"); - }else{ - printf("O"); - } - break; - }else if(pos == snake->length - 1){ - printf(" "); - } - } + int index = part_of_snake(snake, i * 16 + j); + if(index == 0){printf("0");} + else if(index > 0){printf("O");} + else{printf(" ");} } printf("|\n"); } printf("+"); for(int i = 0; i < WIDTH; i++){printf("-");} printf("+\n"); +} + +//returns index of segments which is identical to tile; -1 if not found +int part_of_snake(Snake *snake, unsigned char tile){ + for(int i = 0; i < snake->length; i++){ + if(snake->segments[i] == tile){ + return i; + } + } + return -1; } \ No newline at end of file diff --git a/src/main/c/Snake/snake_start.h b/src/main/c/Snake/snake_start.h index e69de29..423f324 100644 --- a/src/main/c/Snake/snake_start.h +++ b/src/main/c/Snake/snake_start.h @@ -0,0 +1,6 @@ +#ifndef SNAKE_START_H +#define SNAKE_START_H + +void snake_start(); + +#endif // SNAKE_START_H \ No newline at end of file From d285bcc4135350edbcaa31a3674fef23e04ce4f3 Mon Sep 17 00:00:00 2001 From: David Moeller Date: Sun, 21 Jan 2024 13:48:58 +0100 Subject: [PATCH 005/245] Test part_of_snake --- src/main/c/Snake/snake_start.c | 18 ++++------------ src/main/c/Snake/snake_start.h | 14 ++++++++++++ test/Snake/test_part_of_snake.c | 38 +++++++++++++++++++++++++++++++++ 3 files changed, 56 insertions(+), 14 deletions(-) create mode 100644 test/Snake/test_part_of_snake.c diff --git a/src/main/c/Snake/snake_start.c b/src/main/c/Snake/snake_start.c index efcd08b..86f0204 100644 --- a/src/main/c/Snake/snake_start.c +++ b/src/main/c/Snake/snake_start.c @@ -1,21 +1,11 @@ #include #include - - -#define HEIGHT 15 -#define WIDTH 15 -#define AREA HEIGHT * WIDTH - -typedef struct{ - signed char direction[2]; - char length; - unsigned char segments[AREA]; -}Snake; +#include "snake_start.h" void main_menu(); void game(); -Snake initialize_game(); +Snake initialize_snake(); void draw(Snake *snake); int part_of_snake(Snake *snake, unsigned char tile); @@ -55,7 +45,7 @@ void main_menu(){ } void game(){ - Snake snake = initialize_game(); + Snake snake = initialize_snake(); bool running = true; while (running) { @@ -66,7 +56,7 @@ void game(){ getchar(); } -Snake initialize_game(){ +Snake initialize_snake(){ Snake snake = {{0, 1}, 3}; for(int i = 0; i < AREA; i++){ snake.segments[i] = 0; diff --git a/src/main/c/Snake/snake_start.h b/src/main/c/Snake/snake_start.h index 423f324..87a4e1c 100644 --- a/src/main/c/Snake/snake_start.h +++ b/src/main/c/Snake/snake_start.h @@ -1,6 +1,20 @@ #ifndef SNAKE_START_H #define SNAKE_START_H +#define HEIGHT 15 +#define WIDTH 15 +#define AREA HEIGHT * WIDTH + +typedef struct{ + signed char direction[2]; + char length; + unsigned char segments[AREA]; +}Snake; + + void snake_start(); +Snake initialize_snake(); +int part_of_snake(Snake *snake, unsigned char tile); + #endif // SNAKE_START_H \ No newline at end of file diff --git a/test/Snake/test_part_of_snake.c b/test/Snake/test_part_of_snake.c new file mode 100644 index 0000000..5dfad8b --- /dev/null +++ b/test/Snake/test_part_of_snake.c @@ -0,0 +1,38 @@ +#ifdef TEST +#include "unity.h" +#include "../../src/main/c/Snake/snake_start.h" + + +void setUp(void){ + //Wenn Funktion Vorraussetzungen braucht +} +void tearDown(void){ +} + + +void test_find_head(void){ + /* arrange */ + int result; + Snake snake = initialize_snake(); + + /* act */ + result = part_of_snake(&snake, 8 * 16 + 8); + + /* assert */ + TEST_ASSERT_EQUAL_INT(0, result);//head is at 8/8 +} + + +void test_get_correct_index(void){ + /* arrange */ + int result; + Snake snake = initialize_snake(); + + /* act */ + result = part_of_snake(&snake, 8 * 16 + 6); + + /* assert */ + TEST_ASSERT_EQUAL_INT(2, result);//2. part ist at 6/8 +} + +#endif // TEST \ No newline at end of file From af57eab9d66875554fdf4459f344d3e653efcdb3 Mon Sep 17 00:00:00 2001 From: David Moeller Date: Tue, 23 Jan 2024 12:53:46 +0100 Subject: [PATCH 006/245] added get_Chara --- src/main/c/Snake/get_character.c | 59 ++++++++++++++++++++++++++++++++ src/main/c/Snake/get_character.h | 6 ++++ src/main/c/Snake/snake_start.c | 54 +++++++++++++++++++++++++++++ test/Snake/test_part_of_snake.c | 13 +++++++ 4 files changed, 132 insertions(+) create mode 100644 src/main/c/Snake/get_character.c create mode 100644 src/main/c/Snake/get_character.h diff --git a/src/main/c/Snake/get_character.c b/src/main/c/Snake/get_character.c new file mode 100644 index 0000000..a800c01 --- /dev/null +++ b/src/main/c/Snake/get_character.c @@ -0,0 +1,59 @@ +#include +#include +#include +#include +#include +#include +#include + +struct termios orig_termios; + +void reset_terminal_mode(){ + tcsetattr(0, TCSANOW, &orig_termios); +} + +void set_conio_terminal_mode(){ + struct termios new_termios; + + /* take two copies - one for now, one for later */ + tcgetattr(0, &orig_termios); + memcpy(&new_termios, &orig_termios, sizeof(new_termios)); + + /* register cleanup handler, and set the new terminal mode */ + atexit(reset_terminal_mode); + cfmakeraw(&new_termios); + tcsetattr(0, TCSANOW, &new_termios); +} + +int kbhit(){ + struct timeval tv = { 0L, 0L }; + fd_set fds; + FD_ZERO(&fds); + FD_SET(0, &fds); + return select(1, &fds, NULL, NULL, &tv) > 0; +} + +int getch(){ + int r; + unsigned char c; + if ((r = read(0, &c, sizeof(c))) < 0) { + return r; + } else { + return c; + } +} + +char get_character(double limit){ + set_conio_terminal_mode(); + + clock_t t = clock(); + char c = 0; + + while ((double)(clock() - t) / CLOCKS_PER_SEC < limit){ + if(kbhit()){c = getch();} + } + + reset_terminal_mode(); + + return c; +} \ No newline at end of file diff --git a/src/main/c/Snake/get_character.h b/src/main/c/Snake/get_character.h new file mode 100644 index 0000000..a955266 --- /dev/null +++ b/src/main/c/Snake/get_character.h @@ -0,0 +1,6 @@ +#ifndef GET_CHARACTER_H +#define GET_CHARACTER_H + +char get_character(double limit); + +#endif // GET_CHARACTER_H \ No newline at end of file diff --git a/src/main/c/Snake/snake_start.c b/src/main/c/Snake/snake_start.c index 86f0204..18d92e8 100644 --- a/src/main/c/Snake/snake_start.c +++ b/src/main/c/Snake/snake_start.c @@ -1,11 +1,18 @@ #include #include +#include +#include +#include #include "snake_start.h" +#include "get_character.h" +#define TIME_TURN 0.5; void main_menu(); void game(); Snake initialize_snake(); +int *get_next_move(double limit); +void move_snake(Snake *snake); void draw(Snake *snake); int part_of_snake(Snake *snake, unsigned char tile); @@ -47,13 +54,23 @@ void main_menu(){ void game(){ Snake snake = initialize_snake(); bool running = true; + clock_t t = clock(); + while (running) { system("clear"); + + t = clock() - t; + int *mv = get_next_move((double)t / CLOCKS_PER_SEC); + t = clock(); + + move_snake(&snake); draw(&snake); running = false; + } getchar(); + getchar(); } Snake initialize_snake(){ @@ -67,6 +84,43 @@ Snake initialize_snake(){ return snake; } +int *get_next_move(double limit){ + limit = TIME_TURN - limit; + int *ptr = (int*) malloc(2 * sizeof(int)); + clock_t t = clock(); + char c; + + c = get_character(limit); + + switch (c){ + case 'w': + case 'A': + printf("Hoch\n"); + break; + case 'a': + case 'D': + printf("Links\n"); + break; + case 's': + case 'B': + printf("Runter\n"); + break; + case 'd': + case 'C': + printf("Rechts\n"); + break; + + default: + break; + } + + return ptr; +} + +void move_snake(Snake *snake){ + +} + void draw(Snake *snake){ printf("+"); for(int i = 0; i < WIDTH; i++){printf("-");} diff --git a/test/Snake/test_part_of_snake.c b/test/Snake/test_part_of_snake.c index 5dfad8b..fcc45e9 100644 --- a/test/Snake/test_part_of_snake.c +++ b/test/Snake/test_part_of_snake.c @@ -35,4 +35,17 @@ void test_get_correct_index(void){ TEST_ASSERT_EQUAL_INT(2, result);//2. part ist at 6/8 } + +void test_snake_not_on_tile(void){ + /* arrange */ + int result; + Snake snake = initialize_snake(); + + /* act */ + result = part_of_snake(&snake, 6 * 16 + 6); + + /* assert */ + TEST_ASSERT_EQUAL_INT(-1, result);//-1 snake is not on 6/6 +} + #endif // TEST \ No newline at end of file From 1c7dfb82378e0d4d863bb7c4b30f511e871f53c1 Mon Sep 17 00:00:00 2001 From: David Moeller Date: Tue, 23 Jan 2024 13:29:33 +0100 Subject: [PATCH 007/245] refactoring: get_next_move --- src/main/c/Snake/snake_start.c | 36 +++++++++++++++++---------------- test/Snake/test_part_of_snake.c | 1 + 2 files changed, 20 insertions(+), 17 deletions(-) diff --git a/src/main/c/Snake/snake_start.c b/src/main/c/Snake/snake_start.c index 18d92e8..e4c826b 100644 --- a/src/main/c/Snake/snake_start.c +++ b/src/main/c/Snake/snake_start.c @@ -5,13 +5,13 @@ #include #include "snake_start.h" #include "get_character.h" -#define TIME_TURN 0.5; +#define TIME_TURN 0.5 void main_menu(); void game(); Snake initialize_snake(); -int *get_next_move(double limit); +void get_next_move(double limit, Snake *snake); void move_snake(Snake *snake); void draw(Snake *snake); int part_of_snake(Snake *snake, unsigned char tile); @@ -56,16 +56,16 @@ void game(){ bool running = true; clock_t t = clock(); - while (running) - { + //while (running){ + for(int i = 0; i < 100; i++){ system("clear"); + draw(&snake); t = clock() - t; - int *mv = get_next_move((double)t / CLOCKS_PER_SEC); + get_next_move(TIME_TURN - (double)t / CLOCKS_PER_SEC, &snake); t = clock(); - move_snake(&snake); - draw(&snake); + running = false; } @@ -81,13 +81,13 @@ Snake initialize_snake(){ snake.segments[0] = 8 + 16 * 8; snake.segments[1] = 7 + 16 * 8; snake.segments[2] = 6 + 16 * 8; + + snake.direction[0] = 1; + snake.direction[1] = 0; return snake; } -int *get_next_move(double limit){ - limit = TIME_TURN - limit; - int *ptr = (int*) malloc(2 * sizeof(int)); - clock_t t = clock(); +void get_next_move(double limit, Snake *snake){ char c; c = get_character(limit); @@ -95,26 +95,28 @@ int *get_next_move(double limit){ switch (c){ case 'w': case 'A': - printf("Hoch\n"); + snake->direction[0] = 0; + snake->direction[1] = -1; break; case 'a': case 'D': - printf("Links\n"); + snake->direction[0] = -1; + snake->direction[1] = 0; break; case 's': case 'B': - printf("Runter\n"); + snake->direction[0] = 0; + snake->direction[1] = 1; break; case 'd': case 'C': - printf("Rechts\n"); + snake->direction[0] = 1; + snake->direction[1] = 0; break; default: break; } - - return ptr; } void move_snake(Snake *snake){ diff --git a/test/Snake/test_part_of_snake.c b/test/Snake/test_part_of_snake.c index fcc45e9..c349867 100644 --- a/test/Snake/test_part_of_snake.c +++ b/test/Snake/test_part_of_snake.c @@ -1,6 +1,7 @@ #ifdef TEST #include "unity.h" #include "../../src/main/c/Snake/snake_start.h" +#include "../../src/main/c/Snake/get_character.h" void setUp(void){ From 60076577cc7913fcc36b69942b530b1f9473fd78 Mon Sep 17 00:00:00 2001 From: David Moeller Date: Tue, 23 Jan 2024 13:47:17 +0100 Subject: [PATCH 008/245] moving snake --- src/main/c/Snake/snake_start.c | 25 +++++++++++-------------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/src/main/c/Snake/snake_start.c b/src/main/c/Snake/snake_start.c index e4c826b..23418cf 100644 --- a/src/main/c/Snake/snake_start.c +++ b/src/main/c/Snake/snake_start.c @@ -11,7 +11,7 @@ void main_menu(); void game(); Snake initialize_snake(); -void get_next_move(double limit, Snake *snake); +void get_next_move(double limit, Snake *snake, bool *running); void move_snake(Snake *snake); void draw(Snake *snake); int part_of_snake(Snake *snake, unsigned char tile); @@ -56,25 +56,19 @@ void game(){ bool running = true; clock_t t = clock(); - //while (running){ - for(int i = 0; i < 100; i++){ + while (running){ system("clear"); draw(&snake); t = clock() - t; - get_next_move(TIME_TURN - (double)t / CLOCKS_PER_SEC, &snake); + get_next_move(TIME_TURN - (double)t / CLOCKS_PER_SEC, &snake, &running); t = clock(); move_snake(&snake); - - running = false; - } - getchar(); - getchar(); } Snake initialize_snake(){ - Snake snake = {{0, 1}, 3}; + Snake snake = {{1, 0}, 3}; for(int i = 0; i < AREA; i++){ snake.segments[i] = 0; } @@ -82,12 +76,10 @@ Snake initialize_snake(){ snake.segments[1] = 7 + 16 * 8; snake.segments[2] = 6 + 16 * 8; - snake.direction[0] = 1; - snake.direction[1] = 0; return snake; } -void get_next_move(double limit, Snake *snake){ +void get_next_move(double limit, Snake *snake, bool *running){ char c; c = get_character(limit); @@ -113,6 +105,8 @@ void get_next_move(double limit, Snake *snake){ snake->direction[0] = 1; snake->direction[1] = 0; break; + case 'q': + *running = false; default: break; @@ -120,7 +114,10 @@ void get_next_move(double limit, Snake *snake){ } void move_snake(Snake *snake){ - + for(int i = snake->length - 1; i > 0; i--){ + snake->segments[i] = snake->segments[i - 1]; + } + snake->segments[0] += snake->direction[0] + snake->direction[1] * 16; } void draw(Snake *snake){ From d96d6594cdf5029867c8754f8dfe3b301912700f Mon Sep 17 00:00:00 2001 From: David Moeller Date: Tue, 23 Jan 2024 14:01:43 +0100 Subject: [PATCH 009/245] killing snake if collision --- src/main/c/Snake/snake_start.c | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/src/main/c/Snake/snake_start.c b/src/main/c/Snake/snake_start.c index 23418cf..ce54919 100644 --- a/src/main/c/Snake/snake_start.c +++ b/src/main/c/Snake/snake_start.c @@ -15,6 +15,7 @@ void get_next_move(double limit, Snake *snake, bool *running); void move_snake(Snake *snake); void draw(Snake *snake); int part_of_snake(Snake *snake, unsigned char tile); +bool check_if_dead(Snake *snake); void snake_start(){ @@ -59,7 +60,11 @@ void game(){ while (running){ system("clear"); draw(&snake); - + + if(check_if_dead(&snake)){ + break; + } + t = clock() - t; get_next_move(TIME_TURN - (double)t / CLOCKS_PER_SEC, &snake, &running); t = clock(); @@ -147,4 +152,21 @@ int part_of_snake(Snake *snake, unsigned char tile){ } } return -1; +} + +bool check_if_dead(Snake *snake){ + //Self + for(int i = 0; i < snake->length; i++){ + int part = part_of_snake(snake, snake->segments[i]); + if(part != -1 && part != i){ + return true; + } + } + + //Wall + if(snake->segments[0] % 16 == 0 || (snake->segments[0] / 16) % 16 == 0){ + return true; + } + + return false; } \ No newline at end of file From ca67976e794d7906d2d3721dd097f1b1e27a8d85 Mon Sep 17 00:00:00 2001 From: David Moeller Date: Tue, 23 Jan 2024 14:49:21 +0100 Subject: [PATCH 010/245] Added fruit --- src/main/c/Snake/snake_start.c | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/src/main/c/Snake/snake_start.c b/src/main/c/Snake/snake_start.c index ce54919..0584deb 100644 --- a/src/main/c/Snake/snake_start.c +++ b/src/main/c/Snake/snake_start.c @@ -13,9 +13,10 @@ void game(); Snake initialize_snake(); void get_next_move(double limit, Snake *snake, bool *running); void move_snake(Snake *snake); -void draw(Snake *snake); +void draw(Snake *snake, unsigned char fruit); int part_of_snake(Snake *snake, unsigned char tile); bool check_if_dead(Snake *snake); +unsigned char spawn_fruit(Snake *snake); void snake_start(){ @@ -56,10 +57,11 @@ void game(){ Snake snake = initialize_snake(); bool running = true; clock_t t = clock(); + unsigned char fruit = spawn_fruit(&snake); while (running){ system("clear"); - draw(&snake); + draw(&snake, fruit); if(check_if_dead(&snake)){ break; @@ -125,7 +127,8 @@ void move_snake(Snake *snake){ snake->segments[0] += snake->direction[0] + snake->direction[1] * 16; } -void draw(Snake *snake){ +void draw(Snake *snake, unsigned char fruit){ + printf("%d\n", fruit); printf("+"); for(int i = 0; i < WIDTH; i++){printf("-");} printf("+\n"); @@ -135,6 +138,7 @@ void draw(Snake *snake){ int index = part_of_snake(snake, i * 16 + j); if(index == 0){printf("0");} else if(index > 0){printf("O");} + else if(i * 16 + j == fruit){printf("X");} else{printf(" ");} } printf("|\n"); @@ -169,4 +173,14 @@ bool check_if_dead(Snake *snake){ } return false; +} + +unsigned char spawn_fruit(Snake *snake){ + srand(time(NULL)); + int r = 0; + while (part_of_snake(snake, r) != -1 || r % 16 == 0 || (r / 16) % 16 == 0){ + r = rand() % 256; + printf("%d\n", r); + } + return r; } \ No newline at end of file From bd65725af8c62621723d926b788e13e6d6e17951 Mon Sep 17 00:00:00 2001 From: David Moeller Date: Tue, 23 Jan 2024 14:54:10 +0100 Subject: [PATCH 011/245] refactoring: check_if_dead --- src/main/c/Snake/snake_start.c | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/main/c/Snake/snake_start.c b/src/main/c/Snake/snake_start.c index 0584deb..a56e34c 100644 --- a/src/main/c/Snake/snake_start.c +++ b/src/main/c/Snake/snake_start.c @@ -150,7 +150,7 @@ void draw(Snake *snake, unsigned char fruit){ //returns index of segments which is identical to tile; -1 if not found int part_of_snake(Snake *snake, unsigned char tile){ - for(int i = 0; i < snake->length; i++){ + for(int i = snake->length - 1; i >= 0; i--){ if(snake->segments[i] == tile){ return i; } @@ -160,11 +160,8 @@ int part_of_snake(Snake *snake, unsigned char tile){ bool check_if_dead(Snake *snake){ //Self - for(int i = 0; i < snake->length; i++){ - int part = part_of_snake(snake, snake->segments[i]); - if(part != -1 && part != i){ - return true; - } + if(part_of_snake(snake, snake->segments[0]) > 0){ + return true; } //Wall From a6b6a633c6b7b72d3d071a5fd88c3866f76fc2c0 Mon Sep 17 00:00:00 2001 From: fdai7729 Date: Tue, 23 Jan 2024 15:23:39 +0000 Subject: [PATCH 012/245] Update team.md --- team.md | 1 + 1 file changed, 1 insertion(+) diff --git a/team.md b/team.md index bdce5f5..9054457 100644 --- a/team.md +++ b/team.md @@ -2,3 +2,4 @@ - Julia Selig, fdai8040 - Ariana Ginju, fdai7775 - Saba Fazlali, fdai7875 +- Nina Gärtner, fdai7729 From b9cc942a3b82de120c548bb980f1cb4abd5f01fe Mon Sep 17 00:00:00 2001 From: fdai7775 Date: Wed, 24 Jan 2024 12:36:32 +0000 Subject: [PATCH 013/245] Add new directory --- src/main/c/GameTic_Tac_Toe/.gitkeep | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/main/c/GameTic_Tac_Toe/.gitkeep diff --git a/src/main/c/GameTic_Tac_Toe/.gitkeep b/src/main/c/GameTic_Tac_Toe/.gitkeep new file mode 100644 index 0000000..e69de29 From 239329dcb0d1f96212add1daf769dda5ac7f1fe6 Mon Sep 17 00:00:00 2001 From: fdai7775 Date: Wed, 24 Jan 2024 12:44:46 +0000 Subject: [PATCH 014/245] Add new file --- src/main/c/GameTic_Tac_Toe/temp | 1 + 1 file changed, 1 insertion(+) create mode 100644 src/main/c/GameTic_Tac_Toe/temp diff --git a/src/main/c/GameTic_Tac_Toe/temp b/src/main/c/GameTic_Tac_Toe/temp new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/src/main/c/GameTic_Tac_Toe/temp @@ -0,0 +1 @@ + From ebfdb2133a457dcc45f56d980572263c0ca30a12 Mon Sep 17 00:00:00 2001 From: fdai7775 Date: Wed, 24 Jan 2024 12:45:27 +0000 Subject: [PATCH 015/245] Add new file --- src/main/c/GameTic_Tac_Toe/temp | 1 + 1 file changed, 1 insertion(+) create mode 100644 src/main/c/GameTic_Tac_Toe/temp diff --git a/src/main/c/GameTic_Tac_Toe/temp b/src/main/c/GameTic_Tac_Toe/temp new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/src/main/c/GameTic_Tac_Toe/temp @@ -0,0 +1 @@ + From 376d864b3a65658c1f6c50b5e182cbb9d365cf7a Mon Sep 17 00:00:00 2001 From: fdai7775 Date: Wed, 24 Jan 2024 13:04:28 +0000 Subject: [PATCH 016/245] Delete temp --- src/main/c/GameTic_Tac_Toe/temp | 1 - 1 file changed, 1 deletion(-) delete mode 100644 src/main/c/GameTic_Tac_Toe/temp diff --git a/src/main/c/GameTic_Tac_Toe/temp b/src/main/c/GameTic_Tac_Toe/temp deleted file mode 100644 index 8b13789..0000000 --- a/src/main/c/GameTic_Tac_Toe/temp +++ /dev/null @@ -1 +0,0 @@ - From b50761f3182096294c5a2ad328b0e5d25ac548fd Mon Sep 17 00:00:00 2001 From: Ariana Ginju Date: Wed, 24 Jan 2024 14:21:33 +0100 Subject: [PATCH 017/245] added global board --- src/main/c/GameTic_Tac_Toe/game.c | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 src/main/c/GameTic_Tac_Toe/game.c diff --git a/src/main/c/GameTic_Tac_Toe/game.c b/src/main/c/GameTic_Tac_Toe/game.c new file mode 100644 index 0000000..7d5c061 --- /dev/null +++ b/src/main/c/GameTic_Tac_Toe/game.c @@ -0,0 +1,6 @@ +#include + +char board[3][3] = {{'1', '2', '3'}, + {'4', '5', '6'}, + {'7', '8', '9'}}; +char currentPlayer = 'X'; From ce57e7533ce5a1f6485777f5d8004978086f9f4c Mon Sep 17 00:00:00 2001 From: David Moeller Date: Thu, 25 Jan 2024 10:00:07 +0100 Subject: [PATCH 018/245] Test self_collision --- src/main/c/Snake/get_character.c | 1 - test/Snake/test_collision.c | 24 ++++++++++++++++++++++++ test/Snake/test_part_of_snake.c | 7 ++----- 3 files changed, 26 insertions(+), 6 deletions(-) create mode 100644 test/Snake/test_collision.c diff --git a/src/main/c/Snake/get_character.c b/src/main/c/Snake/get_character.c index a800c01..9c180ef 100644 --- a/src/main/c/Snake/get_character.c +++ b/src/main/c/Snake/get_character.c @@ -3,7 +3,6 @@ #include #include #include -#include #include struct termios orig_termios; diff --git a/test/Snake/test_collision.c b/test/Snake/test_collision.c new file mode 100644 index 0000000..81d1a76 --- /dev/null +++ b/test/Snake/test_collision.c @@ -0,0 +1,24 @@ +#ifdef TEST +#include "unity.h" +#include +#include "../../src/main/c/Snake/snake_start.h" +#include "../../src/main/c/Snake/get_character.h" + + +void setUp(void){} +void tearDown(void){} + + +void test_self_collision(void){ + /* arrange */ + bool result; + Snake snake = {{1, 0}, 5, {6 + 16 * 6, 6 + 16 * 7, 7 + 16 * 7, 7 + 16 * 6, 6 + 16 * 6}}; + + /* act */ + result = check_if_dead(&snake); + + /* assert */ + TEST_ASSERT_TRUE(result);//head collides with body +} + +#endif // TEST \ No newline at end of file diff --git a/test/Snake/test_part_of_snake.c b/test/Snake/test_part_of_snake.c index c349867..95ce3bd 100644 --- a/test/Snake/test_part_of_snake.c +++ b/test/Snake/test_part_of_snake.c @@ -4,11 +4,8 @@ #include "../../src/main/c/Snake/get_character.h" -void setUp(void){ - //Wenn Funktion Vorraussetzungen braucht -} -void tearDown(void){ -} +void setUp(void){} +void tearDown(void){} void test_find_head(void){ From 5e744b90792d9a25be9e8bd17d115710b3d63dce Mon Sep 17 00:00:00 2001 From: David Moeller Date: Thu, 25 Jan 2024 10:01:55 +0100 Subject: [PATCH 019/245] Test no_collision --- test/Snake/test_collision.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/test/Snake/test_collision.c b/test/Snake/test_collision.c index 81d1a76..d0edd61 100644 --- a/test/Snake/test_collision.c +++ b/test/Snake/test_collision.c @@ -21,4 +21,17 @@ void test_self_collision(void){ TEST_ASSERT_TRUE(result);//head collides with body } + +void test_no_collision(void){ + /* arrange */ + bool result; + Snake snake = initialize_snake(); + + /* act */ + result = check_if_dead(&snake); + + /* assert */ + TEST_ASSERT_FALSE(result);//head collides with body +} + #endif // TEST \ No newline at end of file From 819208c1e918231b110f60009eee50262b58889e Mon Sep 17 00:00:00 2001 From: David Moeller Date: Thu, 25 Jan 2024 10:04:07 +0100 Subject: [PATCH 020/245] Test wall_collision --- test/Snake/test_collision.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/test/Snake/test_collision.c b/test/Snake/test_collision.c index d0edd61..b70676d 100644 --- a/test/Snake/test_collision.c +++ b/test/Snake/test_collision.c @@ -34,4 +34,17 @@ void test_no_collision(void){ TEST_ASSERT_FALSE(result);//head collides with body } + +void test_wall_collision(void){ + /* arrange */ + bool result; + Snake snake = {{1, 0}, 4, {0 + 16 * 6, 1 + 16 * 6, 2 + 16 * 6, 3 + 16 * 6}}; + + /* act */ + result = check_if_dead(&snake); + + /* assert */ + TEST_ASSERT_TRUE(result);//head collides with body +} + #endif // TEST \ No newline at end of file From 46d38f2857e468fdf8dd9853ca2189323cab467b Mon Sep 17 00:00:00 2001 From: David Moeller Date: Thu, 25 Jan 2024 10:16:08 +0100 Subject: [PATCH 021/245] Snake gets longer when eating fruit --- src/main/c/Snake/snake_start.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/main/c/Snake/snake_start.c b/src/main/c/Snake/snake_start.c index a56e34c..068eca7 100644 --- a/src/main/c/Snake/snake_start.c +++ b/src/main/c/Snake/snake_start.c @@ -5,7 +5,7 @@ #include #include "snake_start.h" #include "get_character.h" -#define TIME_TURN 0.5 +#define TIME_TURN 0.3 void main_menu(); @@ -17,6 +17,7 @@ void draw(Snake *snake, unsigned char fruit); int part_of_snake(Snake *snake, unsigned char tile); bool check_if_dead(Snake *snake); unsigned char spawn_fruit(Snake *snake); +unsigned char eating_fruit(Snake *snake); void snake_start(){ @@ -71,6 +72,7 @@ void game(){ get_next_move(TIME_TURN - (double)t / CLOCKS_PER_SEC, &snake, &running); t = clock(); move_snake(&snake); + if(part_of_snake(&snake, fruit) == 0){fruit = eating_fruit(&snake);} } } @@ -180,4 +182,9 @@ unsigned char spawn_fruit(Snake *snake){ printf("%d\n", r); } return r; +} + +unsigned char eating_fruit(Snake *snake){ + snake->length++; + return spawn_fruit(snake); } \ No newline at end of file From 9a3247bf684857c1cf33b4990a87e14897f62bd8 Mon Sep 17 00:00:00 2001 From: David Moeller Date: Thu, 25 Jan 2024 10:22:33 +0100 Subject: [PATCH 022/245] refactoring: movement of snake --- src/main/c/Snake/snake_start.c | 16 ++++++---------- src/main/c/Snake/snake_start.h | 2 +- 2 files changed, 7 insertions(+), 11 deletions(-) diff --git a/src/main/c/Snake/snake_start.c b/src/main/c/Snake/snake_start.c index 068eca7..70bc96e 100644 --- a/src/main/c/Snake/snake_start.c +++ b/src/main/c/Snake/snake_start.c @@ -77,7 +77,7 @@ void game(){ } Snake initialize_snake(){ - Snake snake = {{1, 0}, 3}; + Snake snake = {1, 3}; for(int i = 0; i < AREA; i++){ snake.segments[i] = 0; } @@ -96,23 +96,19 @@ void get_next_move(double limit, Snake *snake, bool *running){ switch (c){ case 'w': case 'A': - snake->direction[0] = 0; - snake->direction[1] = -1; + snake->direction = -16; break; case 'a': case 'D': - snake->direction[0] = -1; - snake->direction[1] = 0; + snake->direction = -1; break; case 's': case 'B': - snake->direction[0] = 0; - snake->direction[1] = 1; + snake->direction = 16; break; case 'd': case 'C': - snake->direction[0] = 1; - snake->direction[1] = 0; + snake->direction = 1; break; case 'q': *running = false; @@ -126,7 +122,7 @@ void move_snake(Snake *snake){ for(int i = snake->length - 1; i > 0; i--){ snake->segments[i] = snake->segments[i - 1]; } - snake->segments[0] += snake->direction[0] + snake->direction[1] * 16; + snake->segments[0] += snake->direction; } void draw(Snake *snake, unsigned char fruit){ diff --git a/src/main/c/Snake/snake_start.h b/src/main/c/Snake/snake_start.h index 87a4e1c..9240626 100644 --- a/src/main/c/Snake/snake_start.h +++ b/src/main/c/Snake/snake_start.h @@ -6,7 +6,7 @@ #define AREA HEIGHT * WIDTH typedef struct{ - signed char direction[2]; + signed char direction; char length; unsigned char segments[AREA]; }Snake; From 82360823017c7513101c9e85b4da0f04c034d83a Mon Sep 17 00:00:00 2001 From: David Moeller Date: Thu, 25 Jan 2024 10:44:08 +0100 Subject: [PATCH 023/245] Test moving right --- src/main/c/Snake/snake_start.c | 4 ++-- src/main/c/Snake/snake_start.h | 2 ++ test/Snake/test_collision.c | 4 ++-- test/Snake/test_moving_snake.c | 27 +++++++++++++++++++++++++++ 4 files changed, 33 insertions(+), 4 deletions(-) create mode 100644 test/Snake/test_moving_snake.c diff --git a/src/main/c/Snake/snake_start.c b/src/main/c/Snake/snake_start.c index 70bc96e..12fb3d5 100644 --- a/src/main/c/Snake/snake_start.c +++ b/src/main/c/Snake/snake_start.c @@ -7,7 +7,7 @@ #include "get_character.h" #define TIME_TURN 0.3 - +#pragma region Funktion_heads void main_menu(); void game(); Snake initialize_snake(); @@ -18,7 +18,7 @@ int part_of_snake(Snake *snake, unsigned char tile); bool check_if_dead(Snake *snake); unsigned char spawn_fruit(Snake *snake); unsigned char eating_fruit(Snake *snake); - +#pragma endregion void snake_start(){ system("clear"); diff --git a/src/main/c/Snake/snake_start.h b/src/main/c/Snake/snake_start.h index 9240626..1634146 100644 --- a/src/main/c/Snake/snake_start.h +++ b/src/main/c/Snake/snake_start.h @@ -15,6 +15,8 @@ typedef struct{ void snake_start(); Snake initialize_snake(); int part_of_snake(Snake *snake, unsigned char tile); +void move_snake(Snake *snake); +bool check_if_dead(Snake *snake); #endif // SNAKE_START_H \ No newline at end of file diff --git a/test/Snake/test_collision.c b/test/Snake/test_collision.c index b70676d..e5d5a63 100644 --- a/test/Snake/test_collision.c +++ b/test/Snake/test_collision.c @@ -12,7 +12,7 @@ void tearDown(void){} void test_self_collision(void){ /* arrange */ bool result; - Snake snake = {{1, 0}, 5, {6 + 16 * 6, 6 + 16 * 7, 7 + 16 * 7, 7 + 16 * 6, 6 + 16 * 6}}; + Snake snake = {1, 5, {6 + 16 * 6, 6 + 16 * 7, 7 + 16 * 7, 7 + 16 * 6, 6 + 16 * 6}}; /* act */ result = check_if_dead(&snake); @@ -38,7 +38,7 @@ void test_no_collision(void){ void test_wall_collision(void){ /* arrange */ bool result; - Snake snake = {{1, 0}, 4, {0 + 16 * 6, 1 + 16 * 6, 2 + 16 * 6, 3 + 16 * 6}}; + Snake snake = {-1, 4, {0 + 16 * 6, 1 + 16 * 6, 2 + 16 * 6, 3 + 16 * 6}}; /* act */ result = check_if_dead(&snake); diff --git a/test/Snake/test_moving_snake.c b/test/Snake/test_moving_snake.c new file mode 100644 index 0000000..b098f9e --- /dev/null +++ b/test/Snake/test_moving_snake.c @@ -0,0 +1,27 @@ +#ifdef TEST +#include "unity.h" +#include +#include +#include "../../src/main/c/Snake/snake_start.h" +#include "../../src/main/c/Snake/get_character.h" + + +void setUp(void){} +void tearDown(void){} + + +void test_moving_right(void){ + /* arrange */ + bool result; + Snake snake = {1, 3, {8 + 16 * 6, 7 + 16 * 6, 6 + 16 * 6}}; + Snake expected = {1, 3, {9 + 16 * 6, 8 + 16 * 6, 7 + 16 * 6}}; + + /* act */ + move_snake(&snake); + result = memcmp(&snake, &expected, sizeof(Snake)) == 0; + + /* assert */ + TEST_ASSERT_TRUE(result);//head collides with body +} + +#endif // TEST \ No newline at end of file From 1612d95af9c776e7c7844f69d998b09d730b051b Mon Sep 17 00:00:00 2001 From: David Moeller Date: Thu, 25 Jan 2024 10:47:13 +0100 Subject: [PATCH 024/245] Test moving down --- test/Snake/test_moving_snake.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/test/Snake/test_moving_snake.c b/test/Snake/test_moving_snake.c index b098f9e..6c400b8 100644 --- a/test/Snake/test_moving_snake.c +++ b/test/Snake/test_moving_snake.c @@ -21,7 +21,21 @@ void test_moving_right(void){ result = memcmp(&snake, &expected, sizeof(Snake)) == 0; /* assert */ - TEST_ASSERT_TRUE(result);//head collides with body + TEST_ASSERT_TRUE(result); +} + +void test_moving_down(void){ + /* arrange */ + bool result; + Snake snake = {16, 3, {8 + 16 * 6, 7 + 16 * 6, 6 + 16 * 6}}; + Snake expected = {16, 3, {8 + 16 * 7, 8 + 16 * 6, 7 + 16 * 6}}; + + /* act */ + move_snake(&snake); + result = memcmp(&snake, &expected, sizeof(Snake)) == 0; + + /* assert */ + TEST_ASSERT_TRUE(result); } #endif // TEST \ No newline at end of file From 890f363d88434969743bc3dc5c6d3f1e7bd848c4 Mon Sep 17 00:00:00 2001 From: David Moeller Date: Thu, 25 Jan 2024 10:48:18 +0100 Subject: [PATCH 025/245] Test moving left --- test/Snake/test_moving_snake.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/test/Snake/test_moving_snake.c b/test/Snake/test_moving_snake.c index 6c400b8..3bd9b6a 100644 --- a/test/Snake/test_moving_snake.c +++ b/test/Snake/test_moving_snake.c @@ -38,4 +38,18 @@ void test_moving_down(void){ TEST_ASSERT_TRUE(result); } +void test_moving_left(void){ + /* arrange */ + bool result; + Snake snake = {-1, 3, {8 + 16 * 6, 7 + 16 * 6, 6 + 16 * 6}}; + Snake expected = {-1, 3, {7 + 16 * 6, 8 + 16 * 6, 7 + 16 * 6}}; + + /* act */ + move_snake(&snake); + result = memcmp(&snake, &expected, sizeof(Snake)) == 0; + + /* assert */ + TEST_ASSERT_TRUE(result); +} + #endif // TEST \ No newline at end of file From 0a40d39849709aad2c3089c0d218a1cd67bf0079 Mon Sep 17 00:00:00 2001 From: David Moeller Date: Thu, 25 Jan 2024 10:49:00 +0100 Subject: [PATCH 026/245] Test moving up --- test/Snake/test_moving_snake.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/test/Snake/test_moving_snake.c b/test/Snake/test_moving_snake.c index 3bd9b6a..115d55f 100644 --- a/test/Snake/test_moving_snake.c +++ b/test/Snake/test_moving_snake.c @@ -52,4 +52,18 @@ void test_moving_left(void){ TEST_ASSERT_TRUE(result); } +void test_moving_up(void){ + /* arrange */ + bool result; + Snake snake = {-16, 3, {8 + 16 * 6, 7 + 16 * 6, 6 + 16 * 6}}; + Snake expected = {-16, 3, {8 + 16 * 5, 8 + 16 * 6, 7 + 16 * 6}}; + + /* act */ + move_snake(&snake); + result = memcmp(&snake, &expected, sizeof(Snake)) == 0; + + /* assert */ + TEST_ASSERT_TRUE(result); +} + #endif // TEST \ No newline at end of file From 3122822b72b2f0330e22e8482fea0a85f582cfa9 Mon Sep 17 00:00:00 2001 From: David Moeller Date: Thu, 25 Jan 2024 10:55:57 +0100 Subject: [PATCH 027/245] refactoring: initializing snake --- src/main/c/Snake/snake_start.c | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/src/main/c/Snake/snake_start.c b/src/main/c/Snake/snake_start.c index 12fb3d5..68de781 100644 --- a/src/main/c/Snake/snake_start.c +++ b/src/main/c/Snake/snake_start.c @@ -6,6 +6,9 @@ #include "snake_start.h" #include "get_character.h" #define TIME_TURN 0.3 +#define START_LENGTH 3 +#define START_DIRECTION 1 +#define START_TILE 8 * 16 + 8 #pragma region Funktion_heads void main_menu(); @@ -63,11 +66,7 @@ void game(){ while (running){ system("clear"); draw(&snake, fruit); - - if(check_if_dead(&snake)){ - break; - } - + if(check_if_dead(&snake)){break;} t = clock() - t; get_next_move(TIME_TURN - (double)t / CLOCKS_PER_SEC, &snake, &running); t = clock(); @@ -77,14 +76,12 @@ void game(){ } Snake initialize_snake(){ - Snake snake = {1, 3}; - for(int i = 0; i < AREA; i++){ - snake.segments[i] = 0; + Snake snake; + snake.direction = START_DIRECTION; + snake.length = START_LENGTH; + for(int i = 0; i < START_LENGTH; i++){ + snake.segments[i] = START_TILE - START_DIRECTION * i; } - snake.segments[0] = 8 + 16 * 8; - snake.segments[1] = 7 + 16 * 8; - snake.segments[2] = 6 + 16 * 8; - return snake; } From 5c4520f7b03a1544b186ad9e01db4c9506c8c508 Mon Sep 17 00:00:00 2001 From: David Moeller Date: Thu, 25 Jan 2024 11:38:19 +0100 Subject: [PATCH 028/245] adding difficulty options --- src/main/c/Snake/snake_start.c | 24 +++++++++++++++++++++--- src/main/c/main.c | 8 ++++---- 2 files changed, 25 insertions(+), 7 deletions(-) diff --git a/src/main/c/Snake/snake_start.c b/src/main/c/Snake/snake_start.c index 68de781..f6b7996 100644 --- a/src/main/c/Snake/snake_start.c +++ b/src/main/c/Snake/snake_start.c @@ -5,7 +5,7 @@ #include #include "snake_start.h" #include "get_character.h" -#define TIME_TURN 0.3 +#define TURN 0.5 #define START_LENGTH 3 #define START_DIRECTION 1 #define START_TILE 8 * 16 + 8 @@ -13,6 +13,7 @@ #pragma region Funktion_heads void main_menu(); void game(); +void options(); Snake initialize_snake(); void get_next_move(double limit, Snake *snake, bool *running); void move_snake(Snake *snake); @@ -23,6 +24,10 @@ unsigned char spawn_fruit(Snake *snake); unsigned char eating_fruit(Snake *snake); #pragma endregion +#pragma region Global +double TIME_TURN = 0.5; +#pragma endregion //Global + void snake_start(){ system("clear"); main_menu(); @@ -36,7 +41,8 @@ void main_menu(){ system("clear"); printf("Waehlen Sie eine Option:\n"); printf("\t1.Start\n"); - printf("\t2.Exit\n"); + printf("\t2.Options\n"); + printf("\t3.Exit\n"); scanf("%d", &option); getchar(); @@ -48,6 +54,9 @@ void main_menu(){ game(); break; case 2: + options(); + break; + case 3: running = false; break; @@ -75,6 +84,14 @@ void game(){ } } +void options(){ + int difficulty = 1; + system("clear"); + printf("Please select a difficulty(1 - 10): "); + scanf("%d", &difficulty); + TIME_TURN = TURN / difficulty;//(11 - difficulty) * TURN / 10; +} + Snake initialize_snake(){ Snake snake; snake.direction = START_DIRECTION; @@ -123,7 +140,7 @@ void move_snake(Snake *snake){ } void draw(Snake *snake, unsigned char fruit){ - printf("%d\n", fruit); + printf("Score:%d Speed:%f\n", snake->length - START_LENGTH, TIME_TURN); printf("+"); for(int i = 0; i < WIDTH; i++){printf("-");} printf("+\n"); @@ -141,6 +158,7 @@ void draw(Snake *snake, unsigned char fruit){ printf("+"); for(int i = 0; i < WIDTH; i++){printf("-");} printf("+\n"); + printf("(Press q to Quit)\n"); } //returns index of segments which is identical to tile; -1 if not found diff --git a/src/main/c/main.c b/src/main/c/main.c index 27cfcae..922c8d4 100644 --- a/src/main/c/main.c +++ b/src/main/c/main.c @@ -14,9 +14,9 @@ int main(){ system("clear"); printf("Waehlen Sie eine Option:\n"); - printf("\t1.Snake starten\n"); + printf("\t1.Spiel1 starten\n"); printf("\t2.Spiel2 starten\n"); - printf("\t3.Spiel3 starten\n"); + printf("\t3.Snake starten\n"); printf("\t4.Spiel4 starten\n"); printf("\t100.Template starten\n"); printf("\t6.Exit\n"); @@ -26,13 +26,13 @@ int main(){ switch (option){ case 1: - snake_start(); + //start_game1(); break; case 2: //start_game2(); break; case 3: - //start_game3(); + snake_start(); break; case 4: //start_game4(); From 7450135530b2079a2910e6b7a6aeba980f0fab11 Mon Sep 17 00:00:00 2001 From: David Moeller Date: Fri, 26 Jan 2024 11:42:09 +0100 Subject: [PATCH 029/245] minesweeper rough structure --- src/main/c/Minesweeper/minesweeper_start.c | 62 ++++++++++++++++++++++ src/main/c/Minesweeper/minesweeper_start.h | 16 ++++++ src/main/c/Snake/snake_start.c | 22 ++++---- src/main/c/Snake/snake_start.h | 8 +-- src/main/c/main.c | 12 ++--- 5 files changed, 98 insertions(+), 22 deletions(-) create mode 100644 src/main/c/Minesweeper/minesweeper_start.c create mode 100644 src/main/c/Minesweeper/minesweeper_start.h diff --git a/src/main/c/Minesweeper/minesweeper_start.c b/src/main/c/Minesweeper/minesweeper_start.c new file mode 100644 index 0000000..7b28bd1 --- /dev/null +++ b/src/main/c/Minesweeper/minesweeper_start.c @@ -0,0 +1,62 @@ +#include +#include +#define BLOCK 219 +#define FLAG '?' +#define EMPTY ' ' + + +#pragma region Funktion_heads +void main_menu_minesweeper(); +void game_minesweeper(); +void options_minesweeper(); +#pragma endregion + +#pragma region Global +#pragma endregion //Global + + +int minesweeper_start(){ + system("clear"); + main_menu_minesweeper(); +} + +void main_menu_minesweeper(){ + bool running = true; + while (running){ + int option = 0; + + system("clear"); + printf("Waehlen Sie eine Option:\n"); + printf("\t1.Start\n"); + printf("\t2.Options\n"); + printf("\t3.Exit\n"); + + scanf("%d", &option); + getchar(); + + system("clear"); + + switch (option){ + case 1: + game_minesweeper(); + break; + case 2: + options_minesweeper(); + break; + case 3: + running = false; + break; + + default: + break; + } + } +} + +void game_minesweeper(){ + +} + +void options_minesweeper(){ + +} \ No newline at end of file diff --git a/src/main/c/Minesweeper/minesweeper_start.h b/src/main/c/Minesweeper/minesweeper_start.h new file mode 100644 index 0000000..1bb6a7d --- /dev/null +++ b/src/main/c/Minesweeper/minesweeper_start.h @@ -0,0 +1,16 @@ +#ifndef MINESWEEPER_START_H +#define MINESWEEPER_START_H + +typedef struct Minesweeper_Board{ + unsigned int width; + unsigned int height; + char *tiles; + int num_bombs; + unsigned int bombs[]; +}Minesweeper_Board; + + +void minesweeper_start(); + + +#endif // MINESWEEPER_START_H \ No newline at end of file diff --git a/src/main/c/Snake/snake_start.c b/src/main/c/Snake/snake_start.c index f6b7996..f3ce799 100644 --- a/src/main/c/Snake/snake_start.c +++ b/src/main/c/Snake/snake_start.c @@ -5,15 +5,17 @@ #include #include "snake_start.h" #include "get_character.h" +#define WIDTH 15 +#define HEIGHT 15 #define TURN 0.5 #define START_LENGTH 3 #define START_DIRECTION 1 #define START_TILE 8 * 16 + 8 #pragma region Funktion_heads -void main_menu(); -void game(); -void options(); +void main_menu_snake(); +void game_snake(); +void options_snake(); Snake initialize_snake(); void get_next_move(double limit, Snake *snake, bool *running); void move_snake(Snake *snake); @@ -30,10 +32,10 @@ double TIME_TURN = 0.5; void snake_start(){ system("clear"); - main_menu(); + main_menu_snake(); } -void main_menu(){ +void main_menu_snake(){ bool running = true; while (running){ int option = 0; @@ -51,10 +53,10 @@ void main_menu(){ switch (option){ case 1: - game(); + game_snake(); break; case 2: - options(); + options_snake(); break; case 3: running = false; @@ -66,7 +68,7 @@ void main_menu(){ } } -void game(){ +void game_snake(){ Snake snake = initialize_snake(); bool running = true; clock_t t = clock(); @@ -84,12 +86,12 @@ void game(){ } } -void options(){ +void options_snake(){ int difficulty = 1; system("clear"); printf("Please select a difficulty(1 - 10): "); scanf("%d", &difficulty); - TIME_TURN = TURN / difficulty;//(11 - difficulty) * TURN / 10; + TIME_TURN = TURN / difficulty; } Snake initialize_snake(){ diff --git a/src/main/c/Snake/snake_start.h b/src/main/c/Snake/snake_start.h index 1634146..359f548 100644 --- a/src/main/c/Snake/snake_start.h +++ b/src/main/c/Snake/snake_start.h @@ -1,14 +1,10 @@ #ifndef SNAKE_START_H #define SNAKE_START_H -#define HEIGHT 15 -#define WIDTH 15 -#define AREA HEIGHT * WIDTH - -typedef struct{ +typedef struct Snake{ signed char direction; char length; - unsigned char segments[AREA]; + unsigned char segments[225]; }Snake; diff --git a/src/main/c/main.c b/src/main/c/main.c index 922c8d4..11be6b7 100644 --- a/src/main/c/main.c +++ b/src/main/c/main.c @@ -2,8 +2,8 @@ #include #include -#include "Template/game100.h" #include "Snake/snake_start.h" +#include "Minesweeper/minesweeper_start.h" int main(){ bool running = true; @@ -18,8 +18,8 @@ int main(){ printf("\t2.Spiel2 starten\n"); printf("\t3.Snake starten\n"); printf("\t4.Spiel4 starten\n"); - printf("\t100.Template starten\n"); - printf("\t6.Exit\n"); + printf("\t7.Minesweeper starten\n"); + printf("\t10.Exit\n"); scanf("%d", &option); getchar(); @@ -37,10 +37,10 @@ int main(){ case 4: //start_game4(); break; - case 100: - start_game100(); + case 7: + minesweeper_start(); break; - case 6: + case 10: system("clear"); running = false; break; From 7f81bd04dd2cccac2e941e44a5a8e1102681ca06 Mon Sep 17 00:00:00 2001 From: David Moeller Date: Fri, 26 Jan 2024 12:31:57 +0100 Subject: [PATCH 030/245] added game options --- src/main/c/Minesweeper/minesweeper_start.c | 60 ++++++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/src/main/c/Minesweeper/minesweeper_start.c b/src/main/c/Minesweeper/minesweeper_start.c index 7b28bd1..2737d4d 100644 --- a/src/main/c/Minesweeper/minesweeper_start.c +++ b/src/main/c/Minesweeper/minesweeper_start.c @@ -1,8 +1,16 @@ #include #include +#pragma region defines #define BLOCK 219 #define FLAG '?' #define EMPTY ' ' +#define SMALL 10 +#define MIDDLE 15 +#define LARGE 20 +#define EASY 7 +#define NORMAL 5 +#define HARD 3 +#pragma endregion #pragma region Funktion_heads @@ -12,6 +20,9 @@ void options_minesweeper(); #pragma endregion #pragma region Global +unsigned int width = MIDDLE; +unsigned int height = MIDDLE; +int num_bombs = MIDDLE * MIDDLE / NORMAL; #pragma endregion //Global @@ -58,5 +69,54 @@ void game_minesweeper(){ } void options_minesweeper(){ + bool running = true; + while (running){ + int option = 0; + + system("clear"); + printf("Waehlen Sie eine Option:\n"); + printf("\t1.Schwierigkeit\t\t%s\n", num_bombs < 2 * width * height / (NORMAL + EASY) ? "Einfach" : num_bombs < 2 * width * height / (NORMAL + HARD) ? "Normal" : "Schwer"); + printf("\t2.Groesse\t\t%s\n", width * height < MIDDLE * SMALL ? "Klein" : width * height < MIDDLE * LARGE ? "Mittel" : "Gross"); + printf("\t3.Custom\n"); + printf("\t4.Exit\n"); + + scanf("%d", &option); + getchar(); + switch (option){ + case 1: + printf("Bitte neu Schwierigkeit eingeben (1 - 3):"); + scanf("%d", &num_bombs); + getchar(); + num_bombs = num_bombs == 1 ? EASY : num_bombs == 2 ? NORMAL : HARD; + num_bombs = width * height / num_bombs; + break; + case 2: + num_bombs = num_bombs < width * height / NORMAL ? EASY : num_bombs == width * height / NORMAL ? NORMAL : HARD; + printf("Bitte neu Groesse eingeben (1 - 3):"); + scanf("%d", &width); + getchar(); + width = width == 1 ? SMALL : width == 2 ? MIDDLE : LARGE; + height = width; + num_bombs = width * height / num_bombs; + break; + case 3: + printf("Bitte Breite des Spielfeld eingeben:"); + scanf("%d", &width); + getchar(); + printf("Bitte Hoehe des Spielfeld eingeben:"); + scanf("%d", &height); + getchar(); + printf("Bitte Anzahl der Bomben eingeben:"); + scanf("%d", &num_bombs); + getchar(); + break; + case 4: + running = false; + break; + + default: + break; + } + } } \ No newline at end of file From c1e8a99e7a7b9a7895f0ea396466170a5d49947d Mon Sep 17 00:00:00 2001 From: David Moeller Date: Fri, 26 Jan 2024 12:55:28 +0100 Subject: [PATCH 031/245] initialize minesweeper --- src/main/c/Minesweeper/minesweeper_start.c | 25 ++++++++++++++++++++-- src/main/c/Minesweeper/minesweeper_start.h | 2 +- src/main/c/Snake/snake_start.c | 6 +++--- 3 files changed, 27 insertions(+), 6 deletions(-) diff --git a/src/main/c/Minesweeper/minesweeper_start.c b/src/main/c/Minesweeper/minesweeper_start.c index 2737d4d..3f46eec 100644 --- a/src/main/c/Minesweeper/minesweeper_start.c +++ b/src/main/c/Minesweeper/minesweeper_start.c @@ -1,5 +1,7 @@ #include +#include #include +#include "minesweeper_start.h" #pragma region defines #define BLOCK 219 #define FLAG '?' @@ -17,6 +19,8 @@ void main_menu_minesweeper(); void game_minesweeper(); void options_minesweeper(); +Minesweeper_Board initialize_minesweeper(); +void draw_minesweeper(); #pragma endregion #pragma region Global @@ -26,7 +30,7 @@ int num_bombs = MIDDLE * MIDDLE / NORMAL; #pragma endregion //Global -int minesweeper_start(){ +void minesweeper_start(){ system("clear"); main_menu_minesweeper(); } @@ -65,7 +69,8 @@ void main_menu_minesweeper(){ } void game_minesweeper(){ - + Minesweeper_Board board = initialize_minesweeper(); + draw_minesweeper(); } void options_minesweeper(){ @@ -119,4 +124,20 @@ void options_minesweeper(){ break; } } +} + +Minesweeper_Board initialize_minesweeper(){ + Minesweeper_Board board; + board.width = width; + board.height = height; + char *tiles = (char*) malloc(width * height * sizeof(char)); + for(int i = 0; i < width * height; i++){tiles[i] = FLAG;} + board.tiles = tiles; + board.num_bombs = num_bombs; + + return board; +} + +void draw_minesweeper(){ + } \ No newline at end of file diff --git a/src/main/c/Minesweeper/minesweeper_start.h b/src/main/c/Minesweeper/minesweeper_start.h index 1bb6a7d..bf0f21a 100644 --- a/src/main/c/Minesweeper/minesweeper_start.h +++ b/src/main/c/Minesweeper/minesweeper_start.h @@ -6,7 +6,7 @@ typedef struct Minesweeper_Board{ unsigned int height; char *tiles; int num_bombs; - unsigned int bombs[]; + int *bombs; }Minesweeper_Board; diff --git a/src/main/c/Snake/snake_start.c b/src/main/c/Snake/snake_start.c index f3ce799..26c83c4 100644 --- a/src/main/c/Snake/snake_start.c +++ b/src/main/c/Snake/snake_start.c @@ -19,7 +19,7 @@ void options_snake(); Snake initialize_snake(); void get_next_move(double limit, Snake *snake, bool *running); void move_snake(Snake *snake); -void draw(Snake *snake, unsigned char fruit); +void draw_snake(Snake *snake, unsigned char fruit); int part_of_snake(Snake *snake, unsigned char tile); bool check_if_dead(Snake *snake); unsigned char spawn_fruit(Snake *snake); @@ -76,7 +76,7 @@ void game_snake(){ while (running){ system("clear"); - draw(&snake, fruit); + draw_snake(&snake, fruit); if(check_if_dead(&snake)){break;} t = clock() - t; get_next_move(TIME_TURN - (double)t / CLOCKS_PER_SEC, &snake, &running); @@ -141,7 +141,7 @@ void move_snake(Snake *snake){ snake->segments[0] += snake->direction; } -void draw(Snake *snake, unsigned char fruit){ +void draw_snake(Snake *snake, unsigned char fruit){ printf("Score:%d Speed:%f\n", snake->length - START_LENGTH, TIME_TURN); printf("+"); for(int i = 0; i < WIDTH; i++){printf("-");} From e1afeb3974b1a2fc4b4a8a254bf091d36e6621f4 Mon Sep 17 00:00:00 2001 From: David Moeller Date: Fri, 26 Jan 2024 13:23:22 +0100 Subject: [PATCH 032/245] draw minesweeper --- src/main/c/Minesweeper/minesweeper_start.c | 46 ++++++++++++++++------ 1 file changed, 34 insertions(+), 12 deletions(-) diff --git a/src/main/c/Minesweeper/minesweeper_start.c b/src/main/c/Minesweeper/minesweeper_start.c index 3f46eec..8dcc78f 100644 --- a/src/main/c/Minesweeper/minesweeper_start.c +++ b/src/main/c/Minesweeper/minesweeper_start.c @@ -3,7 +3,7 @@ #include #include "minesweeper_start.h" #pragma region defines -#define BLOCK 219 +#define BLOCK '#' #define FLAG '?' #define EMPTY ' ' #define SMALL 10 @@ -20,7 +20,7 @@ void main_menu_minesweeper(); void game_minesweeper(); void options_minesweeper(); Minesweeper_Board initialize_minesweeper(); -void draw_minesweeper(); +void draw_minesweeper(Minesweeper_Board board); #pragma endregion #pragma region Global @@ -69,8 +69,15 @@ void main_menu_minesweeper(){ } void game_minesweeper(){ - Minesweeper_Board board = initialize_minesweeper(); - draw_minesweeper(); + bool running = true; + int q = 0; + while (running){ + Minesweeper_Board board = initialize_minesweeper(); + draw_minesweeper(board); + + scanf("%d", &q); + if (q == 1){break;} + } } void options_minesweeper(){ @@ -90,7 +97,7 @@ void options_minesweeper(){ switch (option){ case 1: - printf("Bitte neu Schwierigkeit eingeben (1 - 3):"); + printf("Bitte neu Schwierigkeit eingeben (1 - 3): "); scanf("%d", &num_bombs); getchar(); num_bombs = num_bombs == 1 ? EASY : num_bombs == 2 ? NORMAL : HARD; @@ -98,7 +105,7 @@ void options_minesweeper(){ break; case 2: num_bombs = num_bombs < width * height / NORMAL ? EASY : num_bombs == width * height / NORMAL ? NORMAL : HARD; - printf("Bitte neu Groesse eingeben (1 - 3):"); + printf("Bitte neu Groesse eingeben (1 - 3): "); scanf("%d", &width); getchar(); width = width == 1 ? SMALL : width == 2 ? MIDDLE : LARGE; @@ -106,13 +113,13 @@ void options_minesweeper(){ num_bombs = width * height / num_bombs; break; case 3: - printf("Bitte Breite des Spielfeld eingeben:"); + printf("Bitte Breite des Spielfeld eingeben: "); scanf("%d", &width); getchar(); - printf("Bitte Hoehe des Spielfeld eingeben:"); + printf("Bitte Hoehe des Spielfeld eingeben: "); scanf("%d", &height); getchar(); - printf("Bitte Anzahl der Bomben eingeben:"); + printf("Bitte Anzahl der Bomben eingeben: "); scanf("%d", &num_bombs); getchar(); break; @@ -131,13 +138,28 @@ Minesweeper_Board initialize_minesweeper(){ board.width = width; board.height = height; char *tiles = (char*) malloc(width * height * sizeof(char)); - for(int i = 0; i < width * height; i++){tiles[i] = FLAG;} + for(int i = 0; i < width * height; i++){tiles[i] = BLOCK;} board.tiles = tiles; board.num_bombs = num_bombs; return board; } -void draw_minesweeper(){ - +void draw_minesweeper(Minesweeper_Board board){ + printf(" "); + for(int i = 0; i < board.width; i++){printf("%d", i / 10);} + printf("\n "); + for(int i = 0; i < board.width; i++){printf("%d", i % 10);} + printf("\n +"); + for(int i = 0; i < board.width; i++){printf("-");} + printf("+\n"); + for(int i = 0; i < board.height; i++){ + printf("%d", i / 10); + printf("%d|", i % 10); + for(int j = 0; j < board.width; j++){printf("%c", board.tiles[i * width + j]);} + printf("|\n"); + } + printf(" +"); + for(int i = 0; i < board.width; i++){printf("-");} + printf("+\n"); } \ No newline at end of file From 50608d06187f4d860ba282586443197adcafcfa6 Mon Sep 17 00:00:00 2001 From: David Moeller Date: Fri, 26 Jan 2024 14:00:13 +0100 Subject: [PATCH 033/245] placing bombs --- src/main/c/Minesweeper/minesweeper_start.c | 38 ++++++++++++++++++---- 1 file changed, 31 insertions(+), 7 deletions(-) diff --git a/src/main/c/Minesweeper/minesweeper_start.c b/src/main/c/Minesweeper/minesweeper_start.c index 8dcc78f..298f61d 100644 --- a/src/main/c/Minesweeper/minesweeper_start.c +++ b/src/main/c/Minesweeper/minesweeper_start.c @@ -1,6 +1,7 @@ #include #include #include +#include #include "minesweeper_start.h" #pragma region defines #define BLOCK '#' @@ -20,6 +21,8 @@ void main_menu_minesweeper(); void game_minesweeper(); void options_minesweeper(); Minesweeper_Board initialize_minesweeper(); +void place_bombs(Minesweeper_Board *board); +bool bomb_in_array(int array[], int bomb, int length); void draw_minesweeper(Minesweeper_Board board); #pragma endregion @@ -70,13 +73,15 @@ void main_menu_minesweeper(){ void game_minesweeper(){ bool running = true; - int q = 0; + int x, y, t; while (running){ Minesweeper_Board board = initialize_minesweeper(); draw_minesweeper(board); - scanf("%d", &q); - if (q == 1){break;} + printf("Next turn (x, y, t(0 = open, 1 = flag)): "); + scanf("%d %d %d", &x, &y, &t); + getchar(); + if (t == 2){break;} } } @@ -137,14 +142,33 @@ Minesweeper_Board initialize_minesweeper(){ Minesweeper_Board board; board.width = width; board.height = height; - char *tiles = (char*) malloc(width * height * sizeof(char)); - for(int i = 0; i < width * height; i++){tiles[i] = BLOCK;} - board.tiles = tiles; + board.tiles = (char*) malloc(width * height * sizeof(char)); + for(int i = 0; i < width * height; i++){board.tiles[i] = BLOCK;} board.num_bombs = num_bombs; - + place_bombs(&board); return board; } +void place_bombs(Minesweeper_Board *board){ + board->bombs = (int*) malloc(board->num_bombs * sizeof(int)); + srand(time(NULL)); + int r; + for(int i = 0; i < board->num_bombs; i++){ + while (1){ + r = rand() % (board->width * board->height); + if(!bomb_in_array(board->bombs, r, board->num_bombs)){break;} + } + board->bombs[i] = r; + } +} + +bool bomb_in_array(int array[], int bomb, int length){ + for(int i = 0; i < length; i++){ + if(array[i] == bomb){return true;} + } + return false; +} + void draw_minesweeper(Minesweeper_Board board){ printf(" "); for(int i = 0; i < board.width; i++){printf("%d", i / 10);} From a910d7d7098296cac7b1db991be35a40942d672f Mon Sep 17 00:00:00 2001 From: David Moeller Date: Fri, 26 Jan 2024 14:16:10 +0100 Subject: [PATCH 034/245] marking and unmarking flags --- src/main/c/Minesweeper/minesweeper_start.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/c/Minesweeper/minesweeper_start.c b/src/main/c/Minesweeper/minesweeper_start.c index 298f61d..fd58cfe 100644 --- a/src/main/c/Minesweeper/minesweeper_start.c +++ b/src/main/c/Minesweeper/minesweeper_start.c @@ -74,13 +74,17 @@ void main_menu_minesweeper(){ void game_minesweeper(){ bool running = true; int x, y, t; + Minesweeper_Board board = initialize_minesweeper(); while (running){ - Minesweeper_Board board = initialize_minesweeper(); + system("clear"); draw_minesweeper(board); printf("Next turn (x, y, t(0 = open, 1 = flag)): "); scanf("%d %d %d", &x, &y, &t); getchar(); + if(t == 1){board.tiles[x + y * board.width] = board.tiles[x + y * board.width] == EMPTY ? EMPTY : board.tiles[x + y * board.width] == FLAG ? BLOCK : FLAG;} + + if (t == 2){break;} } } From c49cdc2e37aa5551297c61fae1ba8919ed51692c Mon Sep 17 00:00:00 2001 From: David Moeller Date: Fri, 26 Jan 2024 14:26:04 +0100 Subject: [PATCH 035/245] refactoring: placing bombs calculating marking tile --- src/main/c/Minesweeper/minesweeper_start.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/main/c/Minesweeper/minesweeper_start.c b/src/main/c/Minesweeper/minesweeper_start.c index fd58cfe..85dc9d1 100644 --- a/src/main/c/Minesweeper/minesweeper_start.c +++ b/src/main/c/Minesweeper/minesweeper_start.c @@ -75,6 +75,8 @@ void game_minesweeper(){ bool running = true; int x, y, t; Minesweeper_Board board = initialize_minesweeper(); + place_bombs(&board); + while (running){ system("clear"); draw_minesweeper(board); @@ -82,9 +84,10 @@ void game_minesweeper(){ printf("Next turn (x, y, t(0 = open, 1 = flag)): "); scanf("%d %d %d", &x, &y, &t); getchar(); - if(t == 1){board.tiles[x + y * board.width] = board.tiles[x + y * board.width] == EMPTY ? EMPTY : board.tiles[x + y * board.width] == FLAG ? BLOCK : FLAG;} - - + if(x < board.width && y < board.height){ + x = x + y * board.width; + if(t == 1){board.tiles[x] = board.tiles[x] == FLAG ? BLOCK : board.tiles[x] == BLOCK ? FLAG : board.tiles[x];} + } if (t == 2){break;} } } @@ -149,12 +152,12 @@ Minesweeper_Board initialize_minesweeper(){ board.tiles = (char*) malloc(width * height * sizeof(char)); for(int i = 0; i < width * height; i++){board.tiles[i] = BLOCK;} board.num_bombs = num_bombs; - place_bombs(&board); + board.bombs = (int*) malloc(board.num_bombs * sizeof(int)); + for(int i = 0; i < num_bombs; i++){board.bombs[i] = -1;} return board; } void place_bombs(Minesweeper_Board *board){ - board->bombs = (int*) malloc(board->num_bombs * sizeof(int)); srand(time(NULL)); int r; for(int i = 0; i < board->num_bombs; i++){ From 063eb9ebe040e53d5f170ffd62089f2e847ec2a6 Mon Sep 17 00:00:00 2001 From: David Moeller Date: Fri, 26 Jan 2024 14:39:53 +0100 Subject: [PATCH 036/245] Test test if tile has a bomb --- src/main/c/Minesweeper/minesweeper_start.h | 1 + test/Minesweeper/test_bomb_in_array.c | 25 ++++++++++++++++++++++ 2 files changed, 26 insertions(+) create mode 100644 test/Minesweeper/test_bomb_in_array.c diff --git a/src/main/c/Minesweeper/minesweeper_start.h b/src/main/c/Minesweeper/minesweeper_start.h index bf0f21a..a73d944 100644 --- a/src/main/c/Minesweeper/minesweeper_start.h +++ b/src/main/c/Minesweeper/minesweeper_start.h @@ -11,6 +11,7 @@ typedef struct Minesweeper_Board{ void minesweeper_start(); +bool bomb_in_array(int array[], int bomb, int length); #endif // MINESWEEPER_START_H \ No newline at end of file diff --git a/test/Minesweeper/test_bomb_in_array.c b/test/Minesweeper/test_bomb_in_array.c new file mode 100644 index 0000000..710791b --- /dev/null +++ b/test/Minesweeper/test_bomb_in_array.c @@ -0,0 +1,25 @@ +#ifdef TEST +#include "unity.h" +#include +#include "../../src/main/c/Minesweeper/minesweeper_start.h" + + +void setUp(void){} +void tearDown(void){} + + +void test_bomb_in_array(void){ + /* arrange */ + bool result; + int array[] = {5, 9, 42, 6, 87, 95, 202, 13, 45 ,78}; + int bomb = 42; + int length = 10; + + /* act */ + result = bomb_in_array(array, bomb, length); + + /* assert */ + TEST_ASSERT_TRUE(result);//head collides with body +} + +#endif // TEST \ No newline at end of file From 72f8a44cc1d2c5ab3cefe1fa2ab0f679abc44671 Mon Sep 17 00:00:00 2001 From: David Moeller Date: Fri, 26 Jan 2024 15:59:03 +0100 Subject: [PATCH 037/245] Test if tile has no bomb --- src/main/c/Minesweeper/minesweeper_start.c | 9 ++++++++- test/Minesweeper/test_bomb_in_array.c | 15 +++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/main/c/Minesweeper/minesweeper_start.c b/src/main/c/Minesweeper/minesweeper_start.c index 85dc9d1..50bb461 100644 --- a/src/main/c/Minesweeper/minesweeper_start.c +++ b/src/main/c/Minesweeper/minesweeper_start.c @@ -24,6 +24,7 @@ Minesweeper_Board initialize_minesweeper(); void place_bombs(Minesweeper_Board *board); bool bomb_in_array(int array[], int bomb, int length); void draw_minesweeper(Minesweeper_Board board); +int open_tile(Minesweeper_Board *board, int tile); #pragma endregion #pragma region Global @@ -84,8 +85,9 @@ void game_minesweeper(){ printf("Next turn (x, y, t(0 = open, 1 = flag)): "); scanf("%d %d %d", &x, &y, &t); getchar(); - if(x < board.width && y < board.height){ + if(x < board.width && x > -1 && y < board.height && y > -1){ x = x + y * board.width; + if(t == 0){running = open_tile(&board, x);} if(t == 1){board.tiles[x] = board.tiles[x] == FLAG ? BLOCK : board.tiles[x] == BLOCK ? FLAG : board.tiles[x];} } if (t == 2){break;} @@ -193,4 +195,9 @@ void draw_minesweeper(Minesweeper_Board board){ printf(" +"); for(int i = 0; i < board.width; i++){printf("-");} printf("+\n"); +} + +int open_tile(Minesweeper_Board *board, int tile){ + if(bomb_in_array(board->bombs, tile, board->num_bombs)){return -1;} + } \ No newline at end of file diff --git a/test/Minesweeper/test_bomb_in_array.c b/test/Minesweeper/test_bomb_in_array.c index 710791b..2e97c56 100644 --- a/test/Minesweeper/test_bomb_in_array.c +++ b/test/Minesweeper/test_bomb_in_array.c @@ -22,4 +22,19 @@ void test_bomb_in_array(void){ TEST_ASSERT_TRUE(result);//head collides with body } + +void test_bomb_not_in_array(void){ + /* arrange */ + bool result; + int array[] = {5, 9, 42, 6, 87, 95, 202, 13, 45 ,78}; + int bomb = 0; + int length = 10; + + /* act */ + result = bomb_in_array(array, bomb, length); + + /* assert */ + TEST_ASSERT_FALSE(result);//head collides with body +} + #endif // TEST \ No newline at end of file From 2a8cefa322d5359746f4591563a20c269b933c66 Mon Sep 17 00:00:00 2001 From: David Moeller Date: Fri, 26 Jan 2024 17:30:10 +0100 Subject: [PATCH 038/245] Test no bombs araound tile --- src/main/c/Minesweeper/minesweeper_start.c | 19 +++++++++++++++++ src/main/c/Minesweeper/minesweeper_start.h | 2 ++ test/Minesweeper/test_number_of_bombs.c | 24 ++++++++++++++++++++++ 3 files changed, 45 insertions(+) create mode 100644 test/Minesweeper/test_number_of_bombs.c diff --git a/src/main/c/Minesweeper/minesweeper_start.c b/src/main/c/Minesweeper/minesweeper_start.c index 50bb461..43a1eed 100644 --- a/src/main/c/Minesweeper/minesweeper_start.c +++ b/src/main/c/Minesweeper/minesweeper_start.c @@ -25,6 +25,7 @@ void place_bombs(Minesweeper_Board *board); bool bomb_in_array(int array[], int bomb, int length); void draw_minesweeper(Minesweeper_Board board); int open_tile(Minesweeper_Board *board, int tile); +int number_of_bombs(Minesweeper_Board *board, int tile); #pragma endregion #pragma region Global @@ -199,5 +200,23 @@ void draw_minesweeper(Minesweeper_Board board){ int open_tile(Minesweeper_Board *board, int tile){ if(bomb_in_array(board->bombs, tile, board->num_bombs)){return -1;} + int num = number_of_bombs(board, tile); +} + +int number_of_bombs(Minesweeper_Board *board, int tile){ + int sum = 0; + for(int i = 0; i < 8; i++){ + int check_tile = tile; + if(i < 3 && tile % board->width == 0){continue;} + else{check_tile - 1;} + if(i > 4 && tile % board->width + 1 == board->width){continue;} + else{check_tile + 1;} + if(i % 3 == 0 && i != 0 && tile / board->width == 0){continue;} + else{check_tile - board->width;} + if(i % 3 == 1 && tile / board->width + 1 == height){continue;} + else{check_tile + board->width;} + if(bomb_in_array(board->bombs, check_tile, board->num_bombs)){sum++;} + } + return sum; } \ No newline at end of file diff --git a/src/main/c/Minesweeper/minesweeper_start.h b/src/main/c/Minesweeper/minesweeper_start.h index a73d944..c62977b 100644 --- a/src/main/c/Minesweeper/minesweeper_start.h +++ b/src/main/c/Minesweeper/minesweeper_start.h @@ -11,7 +11,9 @@ typedef struct Minesweeper_Board{ void minesweeper_start(); +Minesweeper_Board initialize_minesweeper(); bool bomb_in_array(int array[], int bomb, int length); +int number_of_bombs(Minesweeper_Board *board, int tile); #endif // MINESWEEPER_START_H \ No newline at end of file diff --git a/test/Minesweeper/test_number_of_bombs.c b/test/Minesweeper/test_number_of_bombs.c new file mode 100644 index 0000000..3f899f7 --- /dev/null +++ b/test/Minesweeper/test_number_of_bombs.c @@ -0,0 +1,24 @@ +#ifdef TEST +#include "unity.h" +#include +#include "../../src/main/c/Minesweeper/minesweeper_start.h" + + +void setUp(void){} +void tearDown(void){} + + +void test_no_bombs_placed_around_tile(void){ + /* arrange */ + int result; + Minesweeper_Board board = initialize_minesweeper(); + int tile = 1 + board.width * 1; + + /* act */ + result = number_of_bombs(&board, tile); + + /* assert */ + TEST_ASSERT_EQUAL_INT(0, result);//no bombs placed +} + +#endif // TEST \ No newline at end of file From 6e0233c784d56d4cdfe10d3120ee0159d572a3c0 Mon Sep 17 00:00:00 2001 From: David Moeller Date: Fri, 26 Jan 2024 17:39:25 +0100 Subject: [PATCH 039/245] Test bombs near but not around tile --- test/Minesweeper/test_bomb_in_array.c | 4 ++-- test/Minesweeper/test_number_of_bombs.c | 17 +++++++++++++++++ 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/test/Minesweeper/test_bomb_in_array.c b/test/Minesweeper/test_bomb_in_array.c index 2e97c56..8aae16d 100644 --- a/test/Minesweeper/test_bomb_in_array.c +++ b/test/Minesweeper/test_bomb_in_array.c @@ -19,7 +19,7 @@ void test_bomb_in_array(void){ result = bomb_in_array(array, bomb, length); /* assert */ - TEST_ASSERT_TRUE(result);//head collides with body + TEST_ASSERT_TRUE(result); } @@ -34,7 +34,7 @@ void test_bomb_not_in_array(void){ result = bomb_in_array(array, bomb, length); /* assert */ - TEST_ASSERT_FALSE(result);//head collides with body + TEST_ASSERT_FALSE(result); } #endif // TEST \ No newline at end of file diff --git a/test/Minesweeper/test_number_of_bombs.c b/test/Minesweeper/test_number_of_bombs.c index 3f899f7..e449f33 100644 --- a/test/Minesweeper/test_number_of_bombs.c +++ b/test/Minesweeper/test_number_of_bombs.c @@ -21,4 +21,21 @@ void test_no_bombs_placed_around_tile(void){ TEST_ASSERT_EQUAL_INT(0, result);//no bombs placed } +void test_searching_for_bombs_on_correct_tiles(void){ + /* arrange */ + int result; + Minesweeper_Board board = initialize_minesweeper(); + int tile = 0 + board.width * 1; + board.bombs[0] = 0 + board.width * 2; + board.bombs[0] = 2 + board.width * 1; + board.bombs[0] = board.width - 1 + board.width * 1; + board.bombs[0] = 0 + board.width * (board.height - 1); + + /* act */ + result = number_of_bombs(&board, tile); + + /* assert */ + TEST_ASSERT_EQUAL_INT(0, result);//no bombs placed around tile +} + #endif // TEST \ No newline at end of file From 79c871c7ff3ead2265e8f9a390d8f829e5924bb1 Mon Sep 17 00:00:00 2001 From: David Moeller Date: Fri, 26 Jan 2024 18:13:20 +0100 Subject: [PATCH 040/245] Test 2 bombs around tile --- src/main/c/Minesweeper/minesweeper_start.c | 16 ++++++------- test/Minesweeper/test_number_of_bombs.c | 27 ++++++++++++++++++---- 2 files changed, 30 insertions(+), 13 deletions(-) diff --git a/src/main/c/Minesweeper/minesweeper_start.c b/src/main/c/Minesweeper/minesweeper_start.c index 43a1eed..98eb0eb 100644 --- a/src/main/c/Minesweeper/minesweeper_start.c +++ b/src/main/c/Minesweeper/minesweeper_start.c @@ -208,14 +208,14 @@ int number_of_bombs(Minesweeper_Board *board, int tile){ int sum = 0; for(int i = 0; i < 8; i++){ int check_tile = tile; - if(i < 3 && tile % board->width == 0){continue;} - else{check_tile - 1;} - if(i > 4 && tile % board->width + 1 == board->width){continue;} - else{check_tile + 1;} - if(i % 3 == 0 && i != 0 && tile / board->width == 0){continue;} - else{check_tile - board->width;} - if(i % 3 == 1 && tile / board->width + 1 == height){continue;} - else{check_tile + board->width;} + if(i < 3){if(tile % board->width == 0){continue;} + else{check_tile -= 1;}} + if(i > 4){if(tile % board->width + 1 == board->width){continue;} + else{check_tile += 1;}} + if(i % 3 == 0){if(i != 0 && tile / board->width == 0){continue;} + else{check_tile -= board->width;}} + if(i % 3 == 1){if(tile / board->width + 1 == height){continue;} + else{check_tile += board->width;}} if(bomb_in_array(board->bombs, check_tile, board->num_bombs)){sum++;} } return sum; diff --git a/test/Minesweeper/test_number_of_bombs.c b/test/Minesweeper/test_number_of_bombs.c index e449f33..047c475 100644 --- a/test/Minesweeper/test_number_of_bombs.c +++ b/test/Minesweeper/test_number_of_bombs.c @@ -12,7 +12,7 @@ void test_no_bombs_placed_around_tile(void){ /* arrange */ int result; Minesweeper_Board board = initialize_minesweeper(); - int tile = 1 + board.width * 1; + int tile = 0 + board.width * 1; /* act */ result = number_of_bombs(&board, tile); @@ -26,10 +26,10 @@ void test_searching_for_bombs_on_correct_tiles(void){ int result; Minesweeper_Board board = initialize_minesweeper(); int tile = 0 + board.width * 1; - board.bombs[0] = 0 + board.width * 2; - board.bombs[0] = 2 + board.width * 1; - board.bombs[0] = board.width - 1 + board.width * 1; - board.bombs[0] = 0 + board.width * (board.height - 1); + board.bombs[0] = 0 + board.width * 3; + board.bombs[1] = 2 + board.width * 1; + board.bombs[2] = board.width - 1 + board.width * 1; + board.bombs[3] = 0 + board.width * (board.height - 1); /* act */ result = number_of_bombs(&board, tile); @@ -38,4 +38,21 @@ void test_searching_for_bombs_on_correct_tiles(void){ TEST_ASSERT_EQUAL_INT(0, result);//no bombs placed around tile } +void test_2_bombs_around_tile(void){ + /* arrange */ + int result; + Minesweeper_Board board = initialize_minesweeper(); + int tile = 0 + board.width * 1; + board.bombs[0] = 0 + board.width * 2; + board.bombs[1] = 1 + board.width * 1; + board.bombs[2] = board.width - 1 + board.width * 1; + board.bombs[3] = 0 + board.width * (board.height - 1); + + /* act */ + result = number_of_bombs(&board, tile); + + /* assert */ + TEST_ASSERT_EQUAL_INT(2, result);//2 bombs placed around tile +} + #endif // TEST \ No newline at end of file From 616ffae6b48f45dc917d61e4962d6a54fc43594a Mon Sep 17 00:00:00 2001 From: David Moeller Date: Fri, 26 Jan 2024 18:21:30 +0100 Subject: [PATCH 041/245] Test 5 or 8 bombs around tile --- test/Minesweeper/test_number_of_bombs.c | 39 +++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/test/Minesweeper/test_number_of_bombs.c b/test/Minesweeper/test_number_of_bombs.c index 047c475..6a0dd4f 100644 --- a/test/Minesweeper/test_number_of_bombs.c +++ b/test/Minesweeper/test_number_of_bombs.c @@ -55,4 +55,43 @@ void test_2_bombs_around_tile(void){ TEST_ASSERT_EQUAL_INT(2, result);//2 bombs placed around tile } +void test_5_bombs_around_tile(void){ + /* arrange */ + int result; + Minesweeper_Board board = initialize_minesweeper(); + int tile = 1 + board.width * 0; + board.bombs[0] = 0 + board.width * 0; + board.bombs[1] = 2 + board.width * 0; + board.bombs[2] = 0 + board.width * 1; + board.bombs[3] = 1 + board.width * 1; + board.bombs[4] = 2 + board.width * 1; + + /* act */ + result = number_of_bombs(&board, tile); + + /* assert */ + TEST_ASSERT_EQUAL_INT(5, result);//5 bombs placed around tile +} + +void test_8_bombs_around_tile(void){ + /* arrange */ + int result; + Minesweeper_Board board = initialize_minesweeper(); + int tile = 7 + board.width * 7; + board.bombs[0] = 6 + board.width * 6; + board.bombs[1] = 7 + board.width * 6; + board.bombs[2] = 8 + board.width * 6; + board.bombs[3] = 6 + board.width * 7; + board.bombs[4] = 8 + board.width * 7; + board.bombs[5] = 6 + board.width * 8; + board.bombs[6] = 7 + board.width * 8; + board.bombs[7] = 8 + board.width * 8; + + /* act */ + result = number_of_bombs(&board, tile); + + /* assert */ + TEST_ASSERT_EQUAL_INT(8, result);//2 bombs placed around tile +} + #endif // TEST \ No newline at end of file From a004b66a33412dcc9e49ea169d08116a428374e3 Mon Sep 17 00:00:00 2001 From: David Moeller Date: Fri, 26 Jan 2024 20:22:53 +0100 Subject: [PATCH 042/245] Minesweeper is playable --- src/main/c/Minesweeper/minesweeper_start.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/main/c/Minesweeper/minesweeper_start.c b/src/main/c/Minesweeper/minesweeper_start.c index 98eb0eb..48bf4d9 100644 --- a/src/main/c/Minesweeper/minesweeper_start.c +++ b/src/main/c/Minesweeper/minesweeper_start.c @@ -88,7 +88,12 @@ void game_minesweeper(){ getchar(); if(x < board.width && x > -1 && y < board.height && y > -1){ x = x + y * board.width; - if(t == 0){running = open_tile(&board, x);} + if(t == 0){ + int bombs = open_tile(&board, x); + if(bombs == -1){running = false;} + else if(bombs == 0){board.tiles[x] = EMPTY;} + else{board.tiles[x] = bombs + 48;} + } if(t == 1){board.tiles[x] = board.tiles[x] == FLAG ? BLOCK : board.tiles[x] == BLOCK ? FLAG : board.tiles[x];} } if (t == 2){break;} @@ -201,7 +206,7 @@ void draw_minesweeper(Minesweeper_Board board){ int open_tile(Minesweeper_Board *board, int tile){ if(bomb_in_array(board->bombs, tile, board->num_bombs)){return -1;} int num = number_of_bombs(board, tile); - + if(1){return num;} } int number_of_bombs(Minesweeper_Board *board, int tile){ From 2367550137e9c3c30e57e53bb00d4d36e6bba6b8 Mon Sep 17 00:00:00 2001 From: David Moeller Date: Fri, 26 Jan 2024 21:03:38 +0100 Subject: [PATCH 043/245] wip batch opening --- src/main/c/Minesweeper/minesweeper_start.c | 54 ++++++++++++++++------ src/main/c/Minesweeper/minesweeper_start.h | 5 +- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/main/c/Minesweeper/minesweeper_start.c b/src/main/c/Minesweeper/minesweeper_start.c index 48bf4d9..a16a24b 100644 --- a/src/main/c/Minesweeper/minesweeper_start.c +++ b/src/main/c/Minesweeper/minesweeper_start.c @@ -22,10 +22,12 @@ void game_minesweeper(); void options_minesweeper(); Minesweeper_Board initialize_minesweeper(); void place_bombs(Minesweeper_Board *board); -bool bomb_in_array(int array[], int bomb, int length); -void draw_minesweeper(Minesweeper_Board board); +bool bomb_in_array(int *array, int bomb, int length); +bool array_contains_value(int *array, int value, int length); +void draw_minesweeper(Minesweeper_Board *board); int open_tile(Minesweeper_Board *board, int tile); int number_of_bombs(Minesweeper_Board *board, int tile); +void open_empty_space(Minesweeper_Board *board, int tile, int index); #pragma endregion #pragma region Global @@ -77,11 +79,12 @@ void game_minesweeper(){ bool running = true; int x, y, t; Minesweeper_Board board = initialize_minesweeper(); + place_bombs(&board); while (running){ system("clear"); - draw_minesweeper(board); + draw_minesweeper(&board); printf("Next turn (x, y, t(0 = open, 1 = flag)): "); scanf("%d %d %d", &x, &y, &t); @@ -91,7 +94,7 @@ void game_minesweeper(){ if(t == 0){ int bombs = open_tile(&board, x); if(bombs == -1){running = false;} - else if(bombs == 0){board.tiles[x] = EMPTY;} + else if(bombs == 0){open_empty_space(&board, x, 0);} else{board.tiles[x] = bombs + 48;} } if(t == 1){board.tiles[x] = board.tiles[x] == FLAG ? BLOCK : board.tiles[x] == BLOCK ? FLAG : board.tiles[x];} @@ -157,8 +160,10 @@ Minesweeper_Board initialize_minesweeper(){ Minesweeper_Board board; board.width = width; board.height = height; - board.tiles = (char*) malloc(width * height * sizeof(char)); + board.tiles = (int*) malloc(width * height * sizeof(int)); for(int i = 0; i < width * height; i++){board.tiles[i] = BLOCK;} + board.marked = (int*) malloc(width * height * sizeof(int)); + for(int i = 0; i < width * height; i++){board.tiles[i] = 0;} board.num_bombs = num_bombs; board.bombs = (int*) malloc(board.num_bombs * sizeof(int)); for(int i = 0; i < num_bombs; i++){board.bombs[i] = -1;} @@ -177,29 +182,33 @@ void place_bombs(Minesweeper_Board *board){ } } -bool bomb_in_array(int array[], int bomb, int length){ +bool bomb_in_array(int *array, int bomb, int length){ for(int i = 0; i < length; i++){ if(array[i] == bomb){return true;} } return false; } -void draw_minesweeper(Minesweeper_Board board){ +bool array_contains_value(int *array, int value, int length){ + +} + +void draw_minesweeper(Minesweeper_Board *board){ printf(" "); - for(int i = 0; i < board.width; i++){printf("%d", i / 10);} + for(int i = 0; i < board->width; i++){printf("%d", i / 10);} printf("\n "); - for(int i = 0; i < board.width; i++){printf("%d", i % 10);} + for(int i = 0; i < board->width; i++){printf("%d", i % 10);} printf("\n +"); - for(int i = 0; i < board.width; i++){printf("-");} + for(int i = 0; i < board->width; i++){printf("-");} printf("+\n"); - for(int i = 0; i < board.height; i++){ + for(int i = 0; i < board->height; i++){ printf("%d", i / 10); printf("%d|", i % 10); - for(int j = 0; j < board.width; j++){printf("%c", board.tiles[i * width + j]);} + for(int j = 0; j < board->width; j++){printf("%c", board->tiles[i * width + j]);} printf("|\n"); } printf(" +"); - for(int i = 0; i < board.width; i++){printf("-");} + for(int i = 0; i < board->width; i++){printf("-");} printf("+\n"); } @@ -224,4 +233,23 @@ int number_of_bombs(Minesweeper_Board *board, int tile){ if(bomb_in_array(board->bombs, check_tile, board->num_bombs)){sum++;} } return sum; +} + +void open_empty_space(Minesweeper_Board *board, int tile, int index){ + board->tiles[tile] = EMPTY; + board->marked[index++] = tile; + for(int i = 0; i < 8; i++){ + int check_tile = tile; + if(i < 3){if(tile % board->width == 0){continue;} + else{check_tile -= 1;}} + if(i > 4){if(tile % board->width + 1 == board->width){continue;} + else{check_tile += 1;}} + if(i % 3 == 0){if(i != 0 && tile / board->width == 0){continue;} + else{check_tile -= board->width;}} + if(i % 3 == 1){if(tile / board->width + 1 == height){continue;} + else{check_tile += board->width;}} + int sum = open_tile(board, check_tile); + if(sum != 0){board->tiles[check_tile] = sum + 48;} + else if(!array_contains_value(board->marked, check_tile, index)){open_empty_space(board, check_tile, index);} + } } \ No newline at end of file diff --git a/src/main/c/Minesweeper/minesweeper_start.h b/src/main/c/Minesweeper/minesweeper_start.h index c62977b..b577233 100644 --- a/src/main/c/Minesweeper/minesweeper_start.h +++ b/src/main/c/Minesweeper/minesweeper_start.h @@ -4,7 +4,8 @@ typedef struct Minesweeper_Board{ unsigned int width; unsigned int height; - char *tiles; + int *tiles; + int *marked; int num_bombs; int *bombs; }Minesweeper_Board; @@ -12,7 +13,7 @@ typedef struct Minesweeper_Board{ void minesweeper_start(); Minesweeper_Board initialize_minesweeper(); -bool bomb_in_array(int array[], int bomb, int length); +bool bomb_in_array(int *array, int bomb, int length); int number_of_bombs(Minesweeper_Board *board, int tile); From 3203609f1abeef01468d8d5cf5ab837158156a5b Mon Sep 17 00:00:00 2001 From: David Moeller Date: Fri, 26 Jan 2024 21:27:55 +0100 Subject: [PATCH 044/245] refactoring: Minesweeper_Board and bomb_in_array to array_contains_value --- src/main/c/Minesweeper/minesweeper_start.c | 28 ++++++++++++++-------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/src/main/c/Minesweeper/minesweeper_start.c b/src/main/c/Minesweeper/minesweeper_start.c index a16a24b..3025597 100644 --- a/src/main/c/Minesweeper/minesweeper_start.c +++ b/src/main/c/Minesweeper/minesweeper_start.c @@ -5,7 +5,7 @@ #include "minesweeper_start.h" #pragma region defines #define BLOCK '#' -#define FLAG '?' +#define FLAG 'x' #define EMPTY ' ' #define SMALL 10 #define MIDDLE 15 @@ -163,7 +163,7 @@ Minesweeper_Board initialize_minesweeper(){ board.tiles = (int*) malloc(width * height * sizeof(int)); for(int i = 0; i < width * height; i++){board.tiles[i] = BLOCK;} board.marked = (int*) malloc(width * height * sizeof(int)); - for(int i = 0; i < width * height; i++){board.tiles[i] = 0;} + for(int i = 0; i < width * height; i++){board.marked[i] = 0;} board.num_bombs = num_bombs; board.bombs = (int*) malloc(board.num_bombs * sizeof(int)); for(int i = 0; i < num_bombs; i++){board.bombs[i] = -1;} @@ -176,21 +176,24 @@ void place_bombs(Minesweeper_Board *board){ for(int i = 0; i < board->num_bombs; i++){ while (1){ r = rand() % (board->width * board->height); - if(!bomb_in_array(board->bombs, r, board->num_bombs)){break;} + if(!array_contains_value(board->bombs, r, board->num_bombs)){break;} } board->bombs[i] = r; } } -bool bomb_in_array(int *array, int bomb, int length){ +bool bomb_in_array(int *array, int value, int length){ for(int i = 0; i < length; i++){ - if(array[i] == bomb){return true;} + if(array[i] == value){return true;} } return false; } bool array_contains_value(int *array, int value, int length){ - + for(int i = 0; i < length; i++){ + if(array[i] == value){return true;} + } + return false; } void draw_minesweeper(Minesweeper_Board *board){ @@ -205,15 +208,20 @@ void draw_minesweeper(Minesweeper_Board *board){ printf("%d", i / 10); printf("%d|", i % 10); for(int j = 0; j < board->width; j++){printf("%c", board->tiles[i * width + j]);} - printf("|\n"); + printf("|%d", i / 10); + printf("%d\n", i % 10); } printf(" +"); for(int i = 0; i < board->width; i++){printf("-");} - printf("+\n"); + printf("+\n "); + for(int i = 0; i < board->width; i++){printf("%d", i / 10);} + printf("\n "); + for(int i = 0; i < board->width; i++){printf("%d", i % 10);} + printf("\n"); } int open_tile(Minesweeper_Board *board, int tile){ - if(bomb_in_array(board->bombs, tile, board->num_bombs)){return -1;} + if(array_contains_value(board->bombs, tile, board->num_bombs)){return -1;} int num = number_of_bombs(board, tile); if(1){return num;} } @@ -230,7 +238,7 @@ int number_of_bombs(Minesweeper_Board *board, int tile){ else{check_tile -= board->width;}} if(i % 3 == 1){if(tile / board->width + 1 == height){continue;} else{check_tile += board->width;}} - if(bomb_in_array(board->bombs, check_tile, board->num_bombs)){sum++;} + if(array_contains_value(board->bombs, check_tile, board->num_bombs)){sum++;} } return sum; } From ad8fc5d7bcb1279df272e1ed3d33f2a4d9d6f5d8 Mon Sep 17 00:00:00 2001 From: David Moeller Date: Sat, 27 Jan 2024 16:05:11 +0100 Subject: [PATCH 045/245] minor fixes --- src/main/c/Minesweeper/minesweeper_start.c | 8 -------- src/main/c/Minesweeper/minesweeper_start.h | 2 +- test/Minesweeper/test_bomb_in_array.c | 4 ++-- 3 files changed, 3 insertions(+), 11 deletions(-) diff --git a/src/main/c/Minesweeper/minesweeper_start.c b/src/main/c/Minesweeper/minesweeper_start.c index 3025597..fae882a 100644 --- a/src/main/c/Minesweeper/minesweeper_start.c +++ b/src/main/c/Minesweeper/minesweeper_start.c @@ -22,7 +22,6 @@ void game_minesweeper(); void options_minesweeper(); Minesweeper_Board initialize_minesweeper(); void place_bombs(Minesweeper_Board *board); -bool bomb_in_array(int *array, int bomb, int length); bool array_contains_value(int *array, int value, int length); void draw_minesweeper(Minesweeper_Board *board); int open_tile(Minesweeper_Board *board, int tile); @@ -182,13 +181,6 @@ void place_bombs(Minesweeper_Board *board){ } } -bool bomb_in_array(int *array, int value, int length){ - for(int i = 0; i < length; i++){ - if(array[i] == value){return true;} - } - return false; -} - bool array_contains_value(int *array, int value, int length){ for(int i = 0; i < length; i++){ if(array[i] == value){return true;} diff --git a/src/main/c/Minesweeper/minesweeper_start.h b/src/main/c/Minesweeper/minesweeper_start.h index b577233..c37d731 100644 --- a/src/main/c/Minesweeper/minesweeper_start.h +++ b/src/main/c/Minesweeper/minesweeper_start.h @@ -13,7 +13,7 @@ typedef struct Minesweeper_Board{ void minesweeper_start(); Minesweeper_Board initialize_minesweeper(); -bool bomb_in_array(int *array, int bomb, int length); +bool array_contains_value(int *array, int bomb, int length); int number_of_bombs(Minesweeper_Board *board, int tile); diff --git a/test/Minesweeper/test_bomb_in_array.c b/test/Minesweeper/test_bomb_in_array.c index 8aae16d..7073857 100644 --- a/test/Minesweeper/test_bomb_in_array.c +++ b/test/Minesweeper/test_bomb_in_array.c @@ -16,7 +16,7 @@ void test_bomb_in_array(void){ int length = 10; /* act */ - result = bomb_in_array(array, bomb, length); + result = array_contains_value(array, bomb, length); /* assert */ TEST_ASSERT_TRUE(result); @@ -31,7 +31,7 @@ void test_bomb_not_in_array(void){ int length = 10; /* act */ - result = bomb_in_array(array, bomb, length); + result = array_contains_value(array, bomb, length); /* assert */ TEST_ASSERT_FALSE(result); From 8957916a23fb9ac4b6548b6942b421cc5c0dad24 Mon Sep 17 00:00:00 2001 From: fdai7775 Date: Tue, 30 Jan 2024 11:44:47 +0000 Subject: [PATCH 046/245] display the game board --- src/main/c/GameTic_Tac_Toe/game.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/main/c/GameTic_Tac_Toe/game.c b/src/main/c/GameTic_Tac_Toe/game.c index 7d5c061..aeec7e0 100644 --- a/src/main/c/GameTic_Tac_Toe/game.c +++ b/src/main/c/GameTic_Tac_Toe/game.c @@ -4,3 +4,16 @@ char board[3][3] = {{'1', '2', '3'}, {'4', '5', '6'}, {'7', '8', '9'}}; char currentPlayer = 'X'; + +// Funktionen zur Anzeige des Spielbretts +void displayBoard() { + printf("Tic-Tac-Toe\n"); + for (int i = 0; i < 3; i++) { + for (int j = 0; j < 3; j++) { + printf("%c", board[i][j]); + if (j < 2) printf(" | "); + } + printf("\n"); + if (i < 2) printf("---------\n"); + } +} From a2b296651064ff9c44370ae4494e2bbb0b4a5e7e Mon Sep 17 00:00:00 2001 From: fdai7775 Date: Tue, 30 Jan 2024 11:45:48 +0000 Subject: [PATCH 047/245] Verification of the winner --- src/main/c/GameTic_Tac_Toe/game.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/c/GameTic_Tac_Toe/game.c b/src/main/c/GameTic_Tac_Toe/game.c index aeec7e0..2937166 100644 --- a/src/main/c/GameTic_Tac_Toe/game.c +++ b/src/main/c/GameTic_Tac_Toe/game.c @@ -17,3 +17,6 @@ void displayBoard() { if (i < 2) printf("---------\n"); } } + +// Funktion zur Überprüfung des Gewinners +char checkWinner() { From 2d7b1b0e8cda5029a6694ca40002147c4b37f86d Mon Sep 17 00:00:00 2001 From: fdai7775 Date: Tue, 30 Jan 2024 11:46:46 +0000 Subject: [PATCH 048/245] Check horizontal and vertical lines --- src/main/c/GameTic_Tac_Toe/game.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/c/GameTic_Tac_Toe/game.c b/src/main/c/GameTic_Tac_Toe/game.c index 2937166..a08e501 100644 --- a/src/main/c/GameTic_Tac_Toe/game.c +++ b/src/main/c/GameTic_Tac_Toe/game.c @@ -20,3 +20,8 @@ void displayBoard() { // Funktion zur Überprüfung des Gewinners char checkWinner() { + // Überprüfe horizontale und vertikale Linien + for (int i = 0; i < 3; i++) { + if (board[i][0] == board[i][1] && board[i][1] == board[i][2]) return board[i][0]; + if (board[0][i] == board[1][i] && board[1][i] == board[2][i]) return board[0][i]; + } From 00ee1fdb18c618c51a313b7a0faa1a1294286c34 Mon Sep 17 00:00:00 2001 From: fdai7775 Date: Tue, 30 Jan 2024 11:47:58 +0000 Subject: [PATCH 049/245] Check diagonal lines --- src/main/c/GameTic_Tac_Toe/game.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/c/GameTic_Tac_Toe/game.c b/src/main/c/GameTic_Tac_Toe/game.c index a08e501..3f1dc5a 100644 --- a/src/main/c/GameTic_Tac_Toe/game.c +++ b/src/main/c/GameTic_Tac_Toe/game.c @@ -25,3 +25,7 @@ char checkWinner() { if (board[i][0] == board[i][1] && board[i][1] == board[i][2]) return board[i][0]; if (board[0][i] == board[1][i] && board[1][i] == board[2][i]) return board[0][i]; } + // Überprüfe diagonale Linien + if (board[0][0] == board[1][1] && board[1][1] == board[2][2]) return board[0][0]; + if (board[0][2] == board[1][1] && board[1][1] == board[2][0]) return board[0][2]; + From 22ce5b5fc45d3de430691a3439044bfb96a2d4f7 Mon Sep 17 00:00:00 2001 From: fdai7775 Date: Tue, 30 Jan 2024 11:52:41 +0000 Subject: [PATCH 050/245] No winner --- src/main/c/GameTic_Tac_Toe/game.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/c/GameTic_Tac_Toe/game.c b/src/main/c/GameTic_Tac_Toe/game.c index 3f1dc5a..a91ba51 100644 --- a/src/main/c/GameTic_Tac_Toe/game.c +++ b/src/main/c/GameTic_Tac_Toe/game.c @@ -29,3 +29,6 @@ char checkWinner() { if (board[0][0] == board[1][1] && board[1][1] == board[2][2]) return board[0][0]; if (board[0][2] == board[1][1] && board[1][1] == board[2][0]) return board[0][2]; + // Kein Gewinner + return ' '; +} From f770bfd5d647d60b268f0a267b006343b50c2aaa Mon Sep 17 00:00:00 2001 From: fdai7775 Date: Tue, 30 Jan 2024 11:58:28 +0000 Subject: [PATCH 051/245] Verification function --- src/main/c/GameTic_Tac_Toe/game.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/main/c/GameTic_Tac_Toe/game.c b/src/main/c/GameTic_Tac_Toe/game.c index a91ba51..6432f7f 100644 --- a/src/main/c/GameTic_Tac_Toe/game.c +++ b/src/main/c/GameTic_Tac_Toe/game.c @@ -32,3 +32,15 @@ char checkWinner() { // Kein Gewinner return ' '; } + +// Funktion zur Überprüfung, ob das Spiel unentschieden ist +int isBoardFull() { + for (int i = 0; i < 3; i++) { + for (int j = 0; j < 3; j++) { + if (board[i][j] != 'X' && board[i][j] != 'O') { + return 0; + } + } + } + return 1; +} From d75ff5cdbf9d229e47f300ecee996e83ec902ae4 Mon Sep 17 00:00:00 2001 From: fdai7775 Date: Tue, 30 Jan 2024 11:59:42 +0000 Subject: [PATCH 052/245] Function: A player's turn --- src/main/c/GameTic_Tac_Toe/game.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/main/c/GameTic_Tac_Toe/game.c b/src/main/c/GameTic_Tac_Toe/game.c index 6432f7f..089012b 100644 --- a/src/main/c/GameTic_Tac_Toe/game.c +++ b/src/main/c/GameTic_Tac_Toe/game.c @@ -44,3 +44,11 @@ int isBoardFull() { } return 1; } + + +// Funktion zum Zug eines Spielers +void makeMove() { + int choice; + printf("Spieler %c, wähle eine Zahl (1-9): ", currentPlayer); + scanf("%d", &choice); + From 95c97636763ff420483d77a59bf813e4fac5b54d Mon Sep 17 00:00:00 2001 From: fdai7775 Date: Tue, 30 Jan 2024 12:00:33 +0000 Subject: [PATCH 053/245] Convert the number --- src/main/c/GameTic_Tac_Toe/game.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/c/GameTic_Tac_Toe/game.c b/src/main/c/GameTic_Tac_Toe/game.c index 089012b..48035ae 100644 --- a/src/main/c/GameTic_Tac_Toe/game.c +++ b/src/main/c/GameTic_Tac_Toe/game.c @@ -52,3 +52,7 @@ void makeMove() { printf("Spieler %c, wähle eine Zahl (1-9): ", currentPlayer); scanf("%d", &choice); +// Konvertiere die Zahl in Zeilen- und Spaltenindex + int row = (choice - 1) / 3; + int col = (choice - 1) % 3; + From c0df50c14754154612ecd07674579ea5abdeb251 Mon Sep 17 00:00:00 2001 From: fdai7775 Date: Tue, 30 Jan 2024 12:01:52 +0000 Subject: [PATCH 054/245] Check whether the selected field is valid --- src/main/c/GameTic_Tac_Toe/game.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/c/GameTic_Tac_Toe/game.c b/src/main/c/GameTic_Tac_Toe/game.c index 48035ae..f0ddb37 100644 --- a/src/main/c/GameTic_Tac_Toe/game.c +++ b/src/main/c/GameTic_Tac_Toe/game.c @@ -56,3 +56,7 @@ void makeMove() { int row = (choice - 1) / 3; int col = (choice - 1) % 3; + // Überprüfe, ob das gewählte Feld gültig ist + if (choice >= 1 && choice <= 9 && board[row][col] != 'X' && board[row][col] != 'O') { + + From 68f804befc16b175915ddd7c4aa066c3b5667d32 Mon Sep 17 00:00:00 2001 From: fdai7775 Date: Tue, 30 Jan 2024 12:02:18 +0000 Subject: [PATCH 055/245] Update game.c --- src/main/c/GameTic_Tac_Toe/game.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/c/GameTic_Tac_Toe/game.c b/src/main/c/GameTic_Tac_Toe/game.c index f0ddb37..5129548 100644 --- a/src/main/c/GameTic_Tac_Toe/game.c +++ b/src/main/c/GameTic_Tac_Toe/game.c @@ -58,5 +58,6 @@ void makeMove() { // Überprüfe, ob das gewählte Feld gültig ist if (choice >= 1 && choice <= 9 && board[row][col] != 'X' && board[row][col] != 'O') { - + board[row][col] = currentPlayer; + } else { From 57ff8f28ae42deb751d92346429a7eb54dee673d Mon Sep 17 00:00:00 2001 From: fdai7775 Date: Tue, 30 Jan 2024 12:03:21 +0000 Subject: [PATCH 056/245] Invalid move --- src/main/c/GameTic_Tac_Toe/game.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/c/GameTic_Tac_Toe/game.c b/src/main/c/GameTic_Tac_Toe/game.c index 5129548..51f5c7c 100644 --- a/src/main/c/GameTic_Tac_Toe/game.c +++ b/src/main/c/GameTic_Tac_Toe/game.c @@ -60,4 +60,7 @@ void makeMove() { if (choice >= 1 && choice <= 9 && board[row][col] != 'X' && board[row][col] != 'O') { board[row][col] = currentPlayer; } else { - + printf("Ungültiger Zug! Bitte wähle erneut.\n"); + makeMove(); // Rekursiver Aufruf, bis ein gültiger Zug gemacht wird + } +} From e99a489aa351de1759d2f54cc771860fb8a7e88b Mon Sep 17 00:00:00 2001 From: fdai7775 Date: Tue, 30 Jan 2024 12:04:05 +0000 Subject: [PATCH 057/245] Update main --- src/main/c/GameTic_Tac_Toe/game.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/c/GameTic_Tac_Toe/game.c b/src/main/c/GameTic_Tac_Toe/game.c index 51f5c7c..85a08a2 100644 --- a/src/main/c/GameTic_Tac_Toe/game.c +++ b/src/main/c/GameTic_Tac_Toe/game.c @@ -64,3 +64,8 @@ void makeMove() { makeMove(); // Rekursiver Aufruf, bis ein gültiger Zug gemacht wird } } + +int main() { + while (1) { + displayBoard(); + makeMove(); From 097e26462eaec31300dc48366252ef1f57ebbd12 Mon Sep 17 00:00:00 2001 From: fdai7775 Date: Tue, 30 Jan 2024 12:05:23 +0000 Subject: [PATCH 058/245] check winner --- src/main/c/GameTic_Tac_Toe/game.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/main/c/GameTic_Tac_Toe/game.c b/src/main/c/GameTic_Tac_Toe/game.c index 85a08a2..215af00 100644 --- a/src/main/c/GameTic_Tac_Toe/game.c +++ b/src/main/c/GameTic_Tac_Toe/game.c @@ -69,3 +69,10 @@ int main() { while (1) { displayBoard(); makeMove(); + + char winner = checkWinner(); + if (winner == 'X' || winner == 'O') { + displayBoard(); + printf("Spieler %c gewinnt!\n", winner); + break; + } From c4c5255c32e69b0b45164e5fe6098ead52f76bcb Mon Sep 17 00:00:00 2001 From: fdai7775 Date: Tue, 30 Jan 2024 12:20:45 +0000 Subject: [PATCH 059/245] possibility: draw --- src/main/c/GameTic_Tac_Toe/game.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/c/GameTic_Tac_Toe/game.c b/src/main/c/GameTic_Tac_Toe/game.c index 215af00..0f0d6f8 100644 --- a/src/main/c/GameTic_Tac_Toe/game.c +++ b/src/main/c/GameTic_Tac_Toe/game.c @@ -76,3 +76,9 @@ int main() { printf("Spieler %c gewinnt!\n", winner); break; } + + if (isBoardFull()) { + displayBoard(); + printf("Unentschieden!\n"); + break; + } From 44325c521fed24d036f30b85d670ff9f5af962e8 Mon Sep 17 00:00:00 2001 From: fdai7775 Date: Tue, 30 Jan 2024 12:22:57 +0000 Subject: [PATCH 060/245] Change player --- src/main/c/GameTic_Tac_Toe/game.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/main/c/GameTic_Tac_Toe/game.c b/src/main/c/GameTic_Tac_Toe/game.c index 0f0d6f8..b20f125 100644 --- a/src/main/c/GameTic_Tac_Toe/game.c +++ b/src/main/c/GameTic_Tac_Toe/game.c @@ -82,3 +82,10 @@ int main() { printf("Unentschieden!\n"); break; } + + // Wechsle den Spieler + currentPlayer = (currentPlayer == 'X') ? 'O' : 'X'; + } + + return 0; +} From eb9a2755fe911b7b7760353dc20384acbea304d5 Mon Sep 17 00:00:00 2001 From: fdai7775 Date: Tue, 30 Jan 2024 16:57:40 +0000 Subject: [PATCH 061/245] refactoring: lear condition for an invalid move --- src/main/c/GameTic_Tac_Toe/game.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/c/GameTic_Tac_Toe/game.c b/src/main/c/GameTic_Tac_Toe/game.c index b20f125..11d2a79 100644 --- a/src/main/c/GameTic_Tac_Toe/game.c +++ b/src/main/c/GameTic_Tac_Toe/game.c @@ -57,11 +57,11 @@ void makeMove() { int col = (choice - 1) % 3; // Überprüfe, ob das gewählte Feld gültig ist - if (choice >= 1 && choice <= 9 && board[row][col] != 'X' && board[row][col] != 'O') { - board[row][col] = currentPlayer; - } else { - printf("Ungültiger Zug! Bitte wähle erneut.\n"); + if (choice < 1 || choice > 9 || board[row][col] == 'X' || board[row][col] == 'O') { + printf("Ungültiger Zug! Bitte wähle erneut.\n"); makeMove(); // Rekursiver Aufruf, bis ein gültiger Zug gemacht wird + } else { + board[row][col] = currentPlayer; } } From 5567f10afcad179c0a7def3929b264a963b207a5 Mon Sep 17 00:00:00 2001 From: fdai7775 Date: Tue, 30 Jan 2024 17:05:35 +0000 Subject: [PATCH 062/245] refactoring: using else and if --- src/main/c/GameTic_Tac_Toe/game.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/c/GameTic_Tac_Toe/game.c b/src/main/c/GameTic_Tac_Toe/game.c index 11d2a79..278b1e5 100644 --- a/src/main/c/GameTic_Tac_Toe/game.c +++ b/src/main/c/GameTic_Tac_Toe/game.c @@ -27,7 +27,7 @@ char checkWinner() { } // Überprüfe diagonale Linien if (board[0][0] == board[1][1] && board[1][1] == board[2][2]) return board[0][0]; - if (board[0][2] == board[1][1] && board[1][1] == board[2][0]) return board[0][2]; + else if (board[0][2] == board[1][1] && board[1][1] == board[2][0]) return board[0][2]; // Kein Gewinner return ' '; From 4af8ceda5d461297fa85ba5c0bf158a4874f1090 Mon Sep 17 00:00:00 2001 From: fdai7775 Date: Tue, 30 Jan 2024 17:15:30 +0000 Subject: [PATCH 063/245] refactoring: using an auxiliary feature for win conditions --- src/main/c/GameTic_Tac_Toe/game.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/main/c/GameTic_Tac_Toe/game.c b/src/main/c/GameTic_Tac_Toe/game.c index 278b1e5..0765c17 100644 --- a/src/main/c/GameTic_Tac_Toe/game.c +++ b/src/main/c/GameTic_Tac_Toe/game.c @@ -17,13 +17,19 @@ void displayBoard() { if (i < 2) printf("---------\n"); } } - +char checkLine(char a, char b, char c) { + if (a == b && b == c) return a; + return ' '; +} // Funktion zur Überprüfung des Gewinners char checkWinner() { // Überprüfe horizontale und vertikale Linien - for (int i = 0; i < 3; i++) { - if (board[i][0] == board[i][1] && board[i][1] == board[i][2]) return board[i][0]; - if (board[0][i] == board[1][i] && board[1][i] == board[2][i]) return board[0][i]; + for (int i = 0; i < 3; i++) { + char horizontalWinner = checkLine(board[i][0], board[i][1], board[i][2]); + char verticalWinner = checkLine(board[0][i], board[1][i], board[2][i]); + + if (horizontalWinner != ' ') return horizontalWinner; + if (verticalWinner != ' ') return verticalWinner; } // Überprüfe diagonale Linien if (board[0][0] == board[1][1] && board[1][1] == board[2][2]) return board[0][0]; From ad6d3bbdcfe3e7aad435dee8e30e4bcfb7ff818a Mon Sep 17 00:00:00 2001 From: fdai7775 Date: Tue, 30 Jan 2024 17:18:52 +0000 Subject: [PATCH 064/245] refactoring: using an auxiliary function for diagonal lines --- src/main/c/GameTic_Tac_Toe/game.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main/c/GameTic_Tac_Toe/game.c b/src/main/c/GameTic_Tac_Toe/game.c index 0765c17..215f890 100644 --- a/src/main/c/GameTic_Tac_Toe/game.c +++ b/src/main/c/GameTic_Tac_Toe/game.c @@ -32,8 +32,11 @@ char checkWinner() { if (verticalWinner != ' ') return verticalWinner; } // Überprüfe diagonale Linien - if (board[0][0] == board[1][1] && board[1][1] == board[2][2]) return board[0][0]; - else if (board[0][2] == board[1][1] && board[1][1] == board[2][0]) return board[0][2]; + char diagonal1Winner = checkLine(board[0][0], board[1][1], board[2][2]); + char diagonal2Winner = checkLine(board[0][2], board[1][1], board[2][0]); + + if (diagonal1Winner != ' ') return diagonal1Winner; + if (diagonal2Winner != ' ') return diagonal2Winner; // Kein Gewinner return ' '; From a6c12ae026290794ac6649cdae8e9da72d85f285 Mon Sep 17 00:00:00 2001 From: fdai7775 Date: Tue, 30 Jan 2024 17:43:49 +0000 Subject: [PATCH 065/245] refactoring: logic functions for player exchange --- src/main/c/GameTic_Tac_Toe/game.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/c/GameTic_Tac_Toe/game.c b/src/main/c/GameTic_Tac_Toe/game.c index 215f890..a3f3ae2 100644 --- a/src/main/c/GameTic_Tac_Toe/game.c +++ b/src/main/c/GameTic_Tac_Toe/game.c @@ -56,6 +56,10 @@ int isBoardFull() { // Funktion zum Zug eines Spielers +char switchPlayer(char currentPlayer) { + return (currentPlayer == 'X') ? 'O' : 'X'; +} + void makeMove() { int choice; printf("Spieler %c, wähle eine Zahl (1-9): ", currentPlayer); @@ -71,6 +75,7 @@ void makeMove() { makeMove(); // Rekursiver Aufruf, bis ein gültiger Zug gemacht wird } else { board[row][col] = currentPlayer; + currentPlayer = switchPlayer(currentPlayer); } } From 6e55a92f3ee10ff8330579b75aec2beff2e2b58d Mon Sep 17 00:00:00 2001 From: fdai7775 Date: Tue, 30 Jan 2024 17:53:55 +0000 Subject: [PATCH 066/245] refactoring: separation of the game loop into functions --- src/main/c/GameTic_Tac_Toe/game.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/main/c/GameTic_Tac_Toe/game.c b/src/main/c/GameTic_Tac_Toe/game.c index a3f3ae2..f193efa 100644 --- a/src/main/c/GameTic_Tac_Toe/game.c +++ b/src/main/c/GameTic_Tac_Toe/game.c @@ -79,7 +79,7 @@ void makeMove() { } } -int main() { +void playGame() { while (1) { displayBoard(); makeMove(); @@ -95,11 +95,10 @@ int main() { displayBoard(); printf("Unentschieden!\n"); break; - } - - // Wechsle den Spieler - currentPlayer = (currentPlayer == 'X') ? 'O' : 'X'; + } } - +} +int main(){ + playGame(); return 0; } From 36d75c111cbcc1a583de5762d5d8ef4b44f708c1 Mon Sep 17 00:00:00 2001 From: fdai7775 Date: Tue, 30 Jan 2024 17:56:28 +0000 Subject: [PATCH 067/245] refactoring: using const --- src/main/c/GameTic_Tac_Toe/game.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/c/GameTic_Tac_Toe/game.c b/src/main/c/GameTic_Tac_Toe/game.c index f193efa..f20e298 100644 --- a/src/main/c/GameTic_Tac_Toe/game.c +++ b/src/main/c/GameTic_Tac_Toe/game.c @@ -43,9 +43,11 @@ char checkWinner() { } // Funktion zur Überprüfung, ob das Spiel unentschieden ist +const int BOARD_SIZE = 3; + int isBoardFull() { - for (int i = 0; i < 3; i++) { - for (int j = 0; j < 3; j++) { + for (int i = 0; i < BOARD_SIZE; i++) { + for (int j = 0; j < BOARD_SIZE; j++) { if (board[i][j] != 'X' && board[i][j] != 'O') { return 0; } From 6c7fc28dc481897bcb97ca729968930eb764239c Mon Sep 17 00:00:00 2001 From: fdai7775 Date: Tue, 30 Jan 2024 18:04:27 +0000 Subject: [PATCH 068/245] refactoring: Clear condition in makeMove --- src/main/c/GameTic_Tac_Toe/game.c | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/src/main/c/GameTic_Tac_Toe/game.c b/src/main/c/GameTic_Tac_Toe/game.c index f20e298..ece4bb7 100644 --- a/src/main/c/GameTic_Tac_Toe/game.c +++ b/src/main/c/GameTic_Tac_Toe/game.c @@ -62,22 +62,28 @@ char switchPlayer(char currentPlayer) { return (currentPlayer == 'X') ? 'O' : 'X'; } +int isValidMove(int choice) { + int row = (choice - 1) / BOARD_SIZE; + int col = (choice - 1) % BOARD_SIZE; + + return (choice >= 1 && choice <= BOARD_SIZE * BOARD_SIZE && board[row][col] != 'X' && board[row][col] != 'O'); +} + void makeMove() { int choice; - printf("Spieler %c, wähle eine Zahl (1-9): ", currentPlayer); + printf("Spieler %c, waehle eine Zahl (1-9): ", currentPlayer); scanf("%d", &choice); // Konvertiere die Zahl in Zeilen- und Spaltenindex - int row = (choice - 1) / 3; - int col = (choice - 1) % 3; - - // Überprüfe, ob das gewählte Feld gültig ist - if (choice < 1 || choice > 9 || board[row][col] == 'X' || board[row][col] == 'O') { - printf("Ungültiger Zug! Bitte wähle erneut.\n"); - makeMove(); // Rekursiver Aufruf, bis ein gültiger Zug gemacht wird - } else { - board[row][col] = currentPlayer; - currentPlayer = switchPlayer(currentPlayer); +if (isValidMove(choice)) { + int row = (choice - 1) / / BOARD_SIZE; + int col = (choice - 1) % % BOARD_SIZE; + board[row][col] = currentPlayer; + currentPlayer = switchPlayer(currentPlayer); + +} else { + printf("Ungueltiger Zug! Bitte waehle erneut.\n"); + makeMove(); // Rekursiver Aufruf, bis ein gültiger Zug gemacht wird } } From 18a2eeaa64286be27a672a14db8e5d93166e5d17 Mon Sep 17 00:00:00 2001 From: fdai7775 Date: Tue, 30 Jan 2024 18:07:39 +0000 Subject: [PATCH 069/245] Update: corrected errors --- src/main/c/GameTic_Tac_Toe/game.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/c/GameTic_Tac_Toe/game.c b/src/main/c/GameTic_Tac_Toe/game.c index ece4bb7..e56e55f 100644 --- a/src/main/c/GameTic_Tac_Toe/game.c +++ b/src/main/c/GameTic_Tac_Toe/game.c @@ -76,8 +76,8 @@ void makeMove() { // Konvertiere die Zahl in Zeilen- und Spaltenindex if (isValidMove(choice)) { - int row = (choice - 1) / / BOARD_SIZE; - int col = (choice - 1) % % BOARD_SIZE; + int row = (choice - 1) / BOARD_SIZE; + int col = (choice - 1) % BOARD_SIZE; board[row][col] = currentPlayer; currentPlayer = switchPlayer(currentPlayer); From 1abf73507ee06529b853a80e64fbae52006217dc Mon Sep 17 00:00:00 2001 From: fdai7775 Date: Tue, 30 Jan 2024 18:14:59 +0000 Subject: [PATCH 071/245] refactoring: Using const for game symbol constants --- src/main/c/GameTic_Tac_Toe/game.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/c/GameTic_Tac_Toe/game.c b/src/main/c/GameTic_Tac_Toe/game.c index e56e55f..ec98aec 100644 --- a/src/main/c/GameTic_Tac_Toe/game.c +++ b/src/main/c/GameTic_Tac_Toe/game.c @@ -4,7 +4,8 @@ char board[3][3] = {{'1', '2', '3'}, {'4', '5', '6'}, {'7', '8', '9'}}; char currentPlayer = 'X'; - +const char PLAYER_X = 'X'; +const char PLAYER_O = 'O'; // Funktionen zur Anzeige des Spielbretts void displayBoard() { printf("Tic-Tac-Toe\n"); From 98533bbc98c2651716fbe3ed42f4f902a0cfb337 Mon Sep 17 00:00:00 2001 From: fdai7775 Date: Tue, 30 Jan 2024 18:16:46 +0000 Subject: [PATCH 072/245] refactoring: Removing the currentPlayer global variable --- src/main/c/GameTic_Tac_Toe/game.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/c/GameTic_Tac_Toe/game.c b/src/main/c/GameTic_Tac_Toe/game.c index ec98aec..8615cb8 100644 --- a/src/main/c/GameTic_Tac_Toe/game.c +++ b/src/main/c/GameTic_Tac_Toe/game.c @@ -60,7 +60,7 @@ int isBoardFull() { // Funktion zum Zug eines Spielers char switchPlayer(char currentPlayer) { - return (currentPlayer == 'X') ? 'O' : 'X'; + return (currentPlayer == PLAYER_X) ? PLAYER_O : PLAYER_X; } int isValidMove(int choice) { From 6a843132cff3f0493108d4e31870d35d49c0f615 Mon Sep 17 00:00:00 2001 From: fdai7775 Date: Tue, 30 Jan 2024 18:20:35 +0000 Subject: [PATCH 073/245] refactoring: Using a loop --- src/main/c/GameTic_Tac_Toe/game.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/main/c/GameTic_Tac_Toe/game.c b/src/main/c/GameTic_Tac_Toe/game.c index 8615cb8..177acc8 100644 --- a/src/main/c/GameTic_Tac_Toe/game.c +++ b/src/main/c/GameTic_Tac_Toe/game.c @@ -6,16 +6,22 @@ char board[3][3] = {{'1', '2', '3'}, char currentPlayer = 'X'; const char PLAYER_X = 'X'; const char PLAYER_O = 'O'; + // Funktionen zur Anzeige des Spielbretts void displayBoard() { printf("Tic-Tac-Toe\n"); - for (int i = 0; i < 3; i++) { - for (int j = 0; j < 3; j++) { + for (int i = 0; i < BOARD_SIZE; i++) { + for (int j = 0; j < BOARD_SIZE; j++) { printf("%c", board[i][j]); - if (j < 2) printf(" | "); - } + if (j < BOARD_SIZE - 1) printf(" | "); + } printf("\n"); - if (i < 2) printf("---------\n"); + if (i < BOARD_SIZE - 1) { + for (int k = 0; k < BOARD_SIZE * 4 - 1; k++) { + printf("-"); + } + printf("\n"); + } } } char checkLine(char a, char b, char c) { From 6956db884ccb4754d4f78c00e834035ca2244b8d Mon Sep 17 00:00:00 2001 From: fdai7775 Date: Tue, 30 Jan 2024 18:35:42 +0000 Subject: [PATCH 074/245] refactoring: char replaced with enum --- src/main/c/GameTic_Tac_Toe/game.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/c/GameTic_Tac_Toe/game.c b/src/main/c/GameTic_Tac_Toe/game.c index 177acc8..ea95618 100644 --- a/src/main/c/GameTic_Tac_Toe/game.c +++ b/src/main/c/GameTic_Tac_Toe/game.c @@ -24,14 +24,16 @@ void displayBoard() { } } } + char checkLine(char a, char b, char c) { if (a == b && b == c) return a; return ' '; } + // Funktion zur Überprüfung des Gewinners char checkWinner() { // Überprüfe horizontale und vertikale Linien - for (int i = 0; i < 3; i++) { + for (int i = 0; i < BOARD_SIZE; i++) { char horizontalWinner = checkLine(board[i][0], board[i][1], board[i][2]); char verticalWinner = checkLine(board[0][i], board[1][i], board[2][i]); @@ -65,7 +67,7 @@ int isBoardFull() { // Funktion zum Zug eines Spielers -char switchPlayer(char currentPlayer) { +enum switchPlayer(enum currentPlayer) { return (currentPlayer == PLAYER_X) ? PLAYER_O : PLAYER_X; } From 2ce9e44041607a5540c09bd2e23d749023f89b9b Mon Sep 17 00:00:00 2001 From: fdai7775 Date: Tue, 30 Jan 2024 18:44:21 +0000 Subject: [PATCH 075/245] refactoring: replacing larger parts --- src/main/c/GameTic_Tac_Toe/game.c | 35 ++++++++++++++++--------------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/src/main/c/GameTic_Tac_Toe/game.c b/src/main/c/GameTic_Tac_Toe/game.c index ea95618..3b7f017 100644 --- a/src/main/c/GameTic_Tac_Toe/game.c +++ b/src/main/c/GameTic_Tac_Toe/game.c @@ -80,14 +80,14 @@ int isValidMove(int choice) { void makeMove() { int choice; - printf("Spieler %c, waehle eine Zahl (1-9): ", currentPlayer); + printf("Spieler %c, waehle eine Zahl (1-9): ", currentPlayer == PLAYER_X) ? 'X' : 'O'); scanf("%d", &choice); // Konvertiere die Zahl in Zeilen- und Spaltenindex if (isValidMove(choice)) { int row = (choice - 1) / BOARD_SIZE; int col = (choice - 1) % BOARD_SIZE; - board[row][col] = currentPlayer; + board[row][col] = currentPlayer == PLAYER_X) ? 'X' : 'O'; currentPlayer = switchPlayer(currentPlayer); } else { @@ -96,25 +96,26 @@ if (isValidMove(choice)) { } } +int isGameOver() { + char winner = checkWinner(); + return (winner == PLAYER_X || winner == PLAYER_O || isBoardFull()); +} + +void printGameResult(char winner) { + if (winner == PLAYER_X || winner == PLAYER_O) { + printf("Spieler %c gewinnt!\n", (winner == PLAYER_X) ? 'X' : 'O'); + } else { + printf("Unentschieden!\n"); + } +} + void playGame() { - while (1) { + while (!isGameOver()) { displayBoard(); makeMove(); - - char winner = checkWinner(); - if (winner == 'X' || winner == 'O') { - displayBoard(); - printf("Spieler %c gewinnt!\n", winner); - break; - } - - if (isBoardFull()) { - displayBoard(); - printf("Unentschieden!\n"); - break; - } } -} + + //Fehlt etwas, änderung folgt; int main(){ playGame(); return 0; From 673de7e2e293f3540618bd7bdec3b39ec5fd28c6 Mon Sep 17 00:00:00 2001 From: fdai7775 Date: Tue, 30 Jan 2024 18:45:51 +0000 Subject: [PATCH 076/245] refactoring: added missing part --- src/main/c/GameTic_Tac_Toe/game.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/c/GameTic_Tac_Toe/game.c b/src/main/c/GameTic_Tac_Toe/game.c index 3b7f017..f72b814 100644 --- a/src/main/c/GameTic_Tac_Toe/game.c +++ b/src/main/c/GameTic_Tac_Toe/game.c @@ -115,7 +115,11 @@ void playGame() { makeMove(); } - //Fehlt etwas, änderung folgt; + displayBoard(); + char winner = checkWinner(); + printGameResult(winner); +} + int main(){ playGame(); return 0; From b12449338944ee154d3da893562a62fd897012e8 Mon Sep 17 00:00:00 2001 From: fdai7775 Date: Tue, 30 Jan 2024 19:14:53 +0000 Subject: [PATCH 077/245] refactoring: correct the errors --- src/main/c/GameTic_Tac_Toe/game.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/main/c/GameTic_Tac_Toe/game.c b/src/main/c/GameTic_Tac_Toe/game.c index f72b814..443fe8d 100644 --- a/src/main/c/GameTic_Tac_Toe/game.c +++ b/src/main/c/GameTic_Tac_Toe/game.c @@ -1,5 +1,6 @@ #include +const int BOARD_SIZE = 3; char board[3][3] = {{'1', '2', '3'}, {'4', '5', '6'}, {'7', '8', '9'}}; @@ -52,8 +53,6 @@ char checkWinner() { } // Funktion zur Überprüfung, ob das Spiel unentschieden ist -const int BOARD_SIZE = 3; - int isBoardFull() { for (int i = 0; i < BOARD_SIZE; i++) { for (int j = 0; j < BOARD_SIZE; j++) { @@ -67,7 +66,7 @@ int isBoardFull() { // Funktion zum Zug eines Spielers -enum switchPlayer(enum currentPlayer) { +char switchPlayer(char currentPlayer) { return (currentPlayer == PLAYER_X) ? PLAYER_O : PLAYER_X; } @@ -80,14 +79,14 @@ int isValidMove(int choice) { void makeMove() { int choice; - printf("Spieler %c, waehle eine Zahl (1-9): ", currentPlayer == PLAYER_X) ? 'X' : 'O'); + printf("Spieler %c, waehle eine Zahl (1-9): ", (currentPlayer == PLAYER_X) ? 'X' : 'O'); scanf("%d", &choice); // Konvertiere die Zahl in Zeilen- und Spaltenindex if (isValidMove(choice)) { int row = (choice - 1) / BOARD_SIZE; int col = (choice - 1) % BOARD_SIZE; - board[row][col] = currentPlayer == PLAYER_X) ? 'X' : 'O'; + board[row][col] = (currentPlayer == PLAYER_X) ? 'X' : 'O'; currentPlayer = switchPlayer(currentPlayer); } else { From 1ac053a2dca41b1b2e44ef8c012ab77c8c29311a Mon Sep 17 00:00:00 2001 From: fdai8040 Date: Wed, 31 Jan 2024 12:19:57 +0000 Subject: [PATCH 078/245] Erstelle eine neues Verzeichnis --- src/main/c/Pong/.gitkeep | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/main/c/Pong/.gitkeep diff --git a/src/main/c/Pong/.gitkeep b/src/main/c/Pong/.gitkeep new file mode 100644 index 0000000..e69de29 From 0c2593924dddf30a0603fb7c451850ac045f1e00 Mon Sep 17 00:00:00 2001 From: fdai8040 Date: Wed, 31 Jan 2024 12:21:06 +0000 Subject: [PATCH 079/245] Add new file --- src/main/c/Pong/game.c | 1 + 1 file changed, 1 insertion(+) create mode 100644 src/main/c/Pong/game.c diff --git a/src/main/c/Pong/game.c b/src/main/c/Pong/game.c new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/src/main/c/Pong/game.c @@ -0,0 +1 @@ + From 66b03b0a20621e2660b7f2c9077a7023d8ce5da4 Mon Sep 17 00:00:00 2001 From: Ariana Ginju Date: Wed, 31 Jan 2024 12:23:59 +0000 Subject: [PATCH 080/245] Add new directory --- test/tests_tictactoe.game/.gitkeep | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 test/tests_tictactoe.game/.gitkeep diff --git a/test/tests_tictactoe.game/.gitkeep b/test/tests_tictactoe.game/.gitkeep new file mode 100644 index 0000000..e69de29 From 5e74794e40fd23875ccb0ff5b9056fd47fe2c236 Mon Sep 17 00:00:00 2001 From: Ariana Ginju Date: Wed, 31 Jan 2024 12:27:00 +0000 Subject: [PATCH 081/245] Delete .gitkeep --- test/tests_tictactoe.game/.gitkeep | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 test/tests_tictactoe.game/.gitkeep diff --git a/test/tests_tictactoe.game/.gitkeep b/test/tests_tictactoe.game/.gitkeep deleted file mode 100644 index e69de29..0000000 From d6dd92dc1e6a83cac81770d4236ab31892ad02b1 Mon Sep 17 00:00:00 2001 From: Ariana Ginju Date: Wed, 31 Jan 2024 12:28:08 +0000 Subject: [PATCH 082/245] Add new file --- test/test_tictactoe.c | 1 + 1 file changed, 1 insertion(+) create mode 100644 test/test_tictactoe.c diff --git a/test/test_tictactoe.c b/test/test_tictactoe.c new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/test/test_tictactoe.c @@ -0,0 +1 @@ + From 556ecbe863183e310fe004c143da33133a1cf60d Mon Sep 17 00:00:00 2001 From: Ariana Ginju Date: Wed, 31 Jan 2024 12:32:21 +0000 Subject: [PATCH 083/245] Update game.c --- src/main/c/GameTic_Tac_Toe/game.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/c/GameTic_Tac_Toe/game.c b/src/main/c/GameTic_Tac_Toe/game.c index 443fe8d..62b99bc 100644 --- a/src/main/c/GameTic_Tac_Toe/game.c +++ b/src/main/c/GameTic_Tac_Toe/game.c @@ -64,7 +64,6 @@ int isBoardFull() { return 1; } - // Funktion zum Zug eines Spielers char switchPlayer(char currentPlayer) { return (currentPlayer == PLAYER_X) ? PLAYER_O : PLAYER_X; From 8b88c2fbc974b4564ca0977ee294a7979f941a2b Mon Sep 17 00:00:00 2001 From: Ariana Ginju Date: Wed, 24 Jan 2024 12:36:32 +0000 Subject: [PATCH 085/245] Add new directory Author: Ariana Ginju --- src/main/c/GameTic_Tac_Toe/.gitkeep | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/main/c/GameTic_Tac_Toe/.gitkeep diff --git a/src/main/c/GameTic_Tac_Toe/.gitkeep b/src/main/c/GameTic_Tac_Toe/.gitkeep new file mode 100644 index 0000000..e69de29 From 2c08c49fdf287f7dcb61a0f36b8d25a2472da8a7 Mon Sep 17 00:00:00 2001 From: Ariana Ginju Date: Wed, 24 Jan 2024 12:45:27 +0000 Subject: [PATCH 086/245] Add new file --- src/main/c/GameTic_Tac_Toe/temp | 1 + 1 file changed, 1 insertion(+) create mode 100644 src/main/c/GameTic_Tac_Toe/temp diff --git a/src/main/c/GameTic_Tac_Toe/temp b/src/main/c/GameTic_Tac_Toe/temp new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/src/main/c/GameTic_Tac_Toe/temp @@ -0,0 +1 @@ + From eca9fef7a13af1ef19f0765d5feeebc03878c48b Mon Sep 17 00:00:00 2001 From: Ariana Ginju Date: Wed, 24 Jan 2024 13:04:28 +0000 Subject: [PATCH 087/245] Delete temp --- src/main/c/GameTic_Tac_Toe/temp | 1 - 1 file changed, 1 deletion(-) delete mode 100644 src/main/c/GameTic_Tac_Toe/temp diff --git a/src/main/c/GameTic_Tac_Toe/temp b/src/main/c/GameTic_Tac_Toe/temp deleted file mode 100644 index 8b13789..0000000 --- a/src/main/c/GameTic_Tac_Toe/temp +++ /dev/null @@ -1 +0,0 @@ - From a8c427c5b2c361bb6739f9188bfc24184eb4802d Mon Sep 17 00:00:00 2001 From: Ariana Ginju Date: Wed, 24 Jan 2024 14:21:33 +0100 Subject: [PATCH 088/245] added global board --- src/main/c/GameTic_Tac_Toe/game.c | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 src/main/c/GameTic_Tac_Toe/game.c diff --git a/src/main/c/GameTic_Tac_Toe/game.c b/src/main/c/GameTic_Tac_Toe/game.c new file mode 100644 index 0000000..7d5c061 --- /dev/null +++ b/src/main/c/GameTic_Tac_Toe/game.c @@ -0,0 +1,6 @@ +#include + +char board[3][3] = {{'1', '2', '3'}, + {'4', '5', '6'}, + {'7', '8', '9'}}; +char currentPlayer = 'X'; From 794f052fa746757d14dba5d6de325061cb229aca Mon Sep 17 00:00:00 2001 From: Ariana Ginju Date: Tue, 30 Jan 2024 11:44:47 +0000 Subject: [PATCH 089/245] display the game board --- src/main/c/GameTic_Tac_Toe/game.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/main/c/GameTic_Tac_Toe/game.c b/src/main/c/GameTic_Tac_Toe/game.c index 7d5c061..aeec7e0 100644 --- a/src/main/c/GameTic_Tac_Toe/game.c +++ b/src/main/c/GameTic_Tac_Toe/game.c @@ -4,3 +4,16 @@ char board[3][3] = {{'1', '2', '3'}, {'4', '5', '6'}, {'7', '8', '9'}}; char currentPlayer = 'X'; + +// Funktionen zur Anzeige des Spielbretts +void displayBoard() { + printf("Tic-Tac-Toe\n"); + for (int i = 0; i < 3; i++) { + for (int j = 0; j < 3; j++) { + printf("%c", board[i][j]); + if (j < 2) printf(" | "); + } + printf("\n"); + if (i < 2) printf("---------\n"); + } +} From 7999eb79fe7155da4fc5b3b8d94f54fdd2d395c4 Mon Sep 17 00:00:00 2001 From: Ariana Ginju Date: Tue, 30 Jan 2024 11:45:48 +0000 Subject: [PATCH 090/245] Verification of the winner --- src/main/c/GameTic_Tac_Toe/game.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/c/GameTic_Tac_Toe/game.c b/src/main/c/GameTic_Tac_Toe/game.c index aeec7e0..2937166 100644 --- a/src/main/c/GameTic_Tac_Toe/game.c +++ b/src/main/c/GameTic_Tac_Toe/game.c @@ -17,3 +17,6 @@ void displayBoard() { if (i < 2) printf("---------\n"); } } + +// Funktion zur Überprüfung des Gewinners +char checkWinner() { From a9fb21881e83ecb0337d2e60b5ff9bca5bb78e33 Mon Sep 17 00:00:00 2001 From: Ariana Ginju Date: Tue, 30 Jan 2024 11:46:46 +0000 Subject: [PATCH 091/245] Check horizontal and vertical lines --- src/main/c/GameTic_Tac_Toe/game.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/c/GameTic_Tac_Toe/game.c b/src/main/c/GameTic_Tac_Toe/game.c index 2937166..a08e501 100644 --- a/src/main/c/GameTic_Tac_Toe/game.c +++ b/src/main/c/GameTic_Tac_Toe/game.c @@ -20,3 +20,8 @@ void displayBoard() { // Funktion zur Überprüfung des Gewinners char checkWinner() { + // Überprüfe horizontale und vertikale Linien + for (int i = 0; i < 3; i++) { + if (board[i][0] == board[i][1] && board[i][1] == board[i][2]) return board[i][0]; + if (board[0][i] == board[1][i] && board[1][i] == board[2][i]) return board[0][i]; + } From 30f7147c18b85d24caa91288a8d7e6cd7f45f4d5 Mon Sep 17 00:00:00 2001 From: Ariana Ginju Date: Tue, 30 Jan 2024 11:47:58 +0000 Subject: [PATCH 092/245] Check diagonal lines --- src/main/c/GameTic_Tac_Toe/game.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/c/GameTic_Tac_Toe/game.c b/src/main/c/GameTic_Tac_Toe/game.c index a08e501..3f1dc5a 100644 --- a/src/main/c/GameTic_Tac_Toe/game.c +++ b/src/main/c/GameTic_Tac_Toe/game.c @@ -25,3 +25,7 @@ char checkWinner() { if (board[i][0] == board[i][1] && board[i][1] == board[i][2]) return board[i][0]; if (board[0][i] == board[1][i] && board[1][i] == board[2][i]) return board[0][i]; } + // Überprüfe diagonale Linien + if (board[0][0] == board[1][1] && board[1][1] == board[2][2]) return board[0][0]; + if (board[0][2] == board[1][1] && board[1][1] == board[2][0]) return board[0][2]; + From 970382ae3c968897fb7925f33e52b2f3ca643152 Mon Sep 17 00:00:00 2001 From: Ariana Ginju Date: Tue, 30 Jan 2024 11:52:41 +0000 Subject: [PATCH 093/245] No winner --- src/main/c/GameTic_Tac_Toe/game.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/c/GameTic_Tac_Toe/game.c b/src/main/c/GameTic_Tac_Toe/game.c index 3f1dc5a..a91ba51 100644 --- a/src/main/c/GameTic_Tac_Toe/game.c +++ b/src/main/c/GameTic_Tac_Toe/game.c @@ -29,3 +29,6 @@ char checkWinner() { if (board[0][0] == board[1][1] && board[1][1] == board[2][2]) return board[0][0]; if (board[0][2] == board[1][1] && board[1][1] == board[2][0]) return board[0][2]; + // Kein Gewinner + return ' '; +} From 7f8de3f06bb9fa26aca2ef129c4b6041b24dc4f1 Mon Sep 17 00:00:00 2001 From: Ariana Ginju Date: Tue, 30 Jan 2024 11:58:28 +0000 Subject: [PATCH 094/245] Verification function --- src/main/c/GameTic_Tac_Toe/game.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/main/c/GameTic_Tac_Toe/game.c b/src/main/c/GameTic_Tac_Toe/game.c index a91ba51..6432f7f 100644 --- a/src/main/c/GameTic_Tac_Toe/game.c +++ b/src/main/c/GameTic_Tac_Toe/game.c @@ -32,3 +32,15 @@ char checkWinner() { // Kein Gewinner return ' '; } + +// Funktion zur Überprüfung, ob das Spiel unentschieden ist +int isBoardFull() { + for (int i = 0; i < 3; i++) { + for (int j = 0; j < 3; j++) { + if (board[i][j] != 'X' && board[i][j] != 'O') { + return 0; + } + } + } + return 1; +} From 1ec3169a5b6edffa9c36a7a30e3d2df7a3943381 Mon Sep 17 00:00:00 2001 From: Ariana Ginju Date: Tue, 30 Jan 2024 11:59:42 +0000 Subject: [PATCH 095/245] Function: A player's turn --- src/main/c/GameTic_Tac_Toe/game.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/main/c/GameTic_Tac_Toe/game.c b/src/main/c/GameTic_Tac_Toe/game.c index 6432f7f..089012b 100644 --- a/src/main/c/GameTic_Tac_Toe/game.c +++ b/src/main/c/GameTic_Tac_Toe/game.c @@ -44,3 +44,11 @@ int isBoardFull() { } return 1; } + + +// Funktion zum Zug eines Spielers +void makeMove() { + int choice; + printf("Spieler %c, wähle eine Zahl (1-9): ", currentPlayer); + scanf("%d", &choice); + From 22d08f9a4b27e6ed72339a872ad860226106cd85 Mon Sep 17 00:00:00 2001 From: Ariana Ginju Date: Tue, 30 Jan 2024 12:00:33 +0000 Subject: [PATCH 096/245] Convert the number --- src/main/c/GameTic_Tac_Toe/game.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/c/GameTic_Tac_Toe/game.c b/src/main/c/GameTic_Tac_Toe/game.c index 089012b..48035ae 100644 --- a/src/main/c/GameTic_Tac_Toe/game.c +++ b/src/main/c/GameTic_Tac_Toe/game.c @@ -52,3 +52,7 @@ void makeMove() { printf("Spieler %c, wähle eine Zahl (1-9): ", currentPlayer); scanf("%d", &choice); +// Konvertiere die Zahl in Zeilen- und Spaltenindex + int row = (choice - 1) / 3; + int col = (choice - 1) % 3; + From f1b61336a5a5beb5d08874fb901e9657932f9b1e Mon Sep 17 00:00:00 2001 From: Ariana Ginju Date: Tue, 30 Jan 2024 12:01:52 +0000 Subject: [PATCH 097/245] Check whether the selected field is valid --- src/main/c/GameTic_Tac_Toe/game.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/c/GameTic_Tac_Toe/game.c b/src/main/c/GameTic_Tac_Toe/game.c index 48035ae..f0ddb37 100644 --- a/src/main/c/GameTic_Tac_Toe/game.c +++ b/src/main/c/GameTic_Tac_Toe/game.c @@ -56,3 +56,7 @@ void makeMove() { int row = (choice - 1) / 3; int col = (choice - 1) % 3; + // Überprüfe, ob das gewählte Feld gültig ist + if (choice >= 1 && choice <= 9 && board[row][col] != 'X' && board[row][col] != 'O') { + + From 9ef4f2f96690b5e7cdf6af931d9ffcbac1abaec5 Mon Sep 17 00:00:00 2001 From: Ariana Ginju Date: Tue, 30 Jan 2024 12:02:18 +0000 Subject: [PATCH 098/245] Update game.c --- src/main/c/GameTic_Tac_Toe/game.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/c/GameTic_Tac_Toe/game.c b/src/main/c/GameTic_Tac_Toe/game.c index f0ddb37..5129548 100644 --- a/src/main/c/GameTic_Tac_Toe/game.c +++ b/src/main/c/GameTic_Tac_Toe/game.c @@ -58,5 +58,6 @@ void makeMove() { // Überprüfe, ob das gewählte Feld gültig ist if (choice >= 1 && choice <= 9 && board[row][col] != 'X' && board[row][col] != 'O') { - + board[row][col] = currentPlayer; + } else { From d47cb68db8380e185c9556709a41c366ccd0a30d Mon Sep 17 00:00:00 2001 From: Ariana Ginju Date: Tue, 30 Jan 2024 12:03:21 +0000 Subject: [PATCH 099/245] Invalid move --- src/main/c/GameTic_Tac_Toe/game.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/c/GameTic_Tac_Toe/game.c b/src/main/c/GameTic_Tac_Toe/game.c index 5129548..51f5c7c 100644 --- a/src/main/c/GameTic_Tac_Toe/game.c +++ b/src/main/c/GameTic_Tac_Toe/game.c @@ -60,4 +60,7 @@ void makeMove() { if (choice >= 1 && choice <= 9 && board[row][col] != 'X' && board[row][col] != 'O') { board[row][col] = currentPlayer; } else { - + printf("Ungültiger Zug! Bitte wähle erneut.\n"); + makeMove(); // Rekursiver Aufruf, bis ein gültiger Zug gemacht wird + } +} From 87f5a6c5d8267494d57cd5302e9e5517ef909f61 Mon Sep 17 00:00:00 2001 From: Ariana Ginju Date: Tue, 30 Jan 2024 12:04:05 +0000 Subject: [PATCH 100/245] Update main --- src/main/c/GameTic_Tac_Toe/game.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/c/GameTic_Tac_Toe/game.c b/src/main/c/GameTic_Tac_Toe/game.c index 51f5c7c..85a08a2 100644 --- a/src/main/c/GameTic_Tac_Toe/game.c +++ b/src/main/c/GameTic_Tac_Toe/game.c @@ -64,3 +64,8 @@ void makeMove() { makeMove(); // Rekursiver Aufruf, bis ein gültiger Zug gemacht wird } } + +int main() { + while (1) { + displayBoard(); + makeMove(); From bd7b0a63c647e259a8fb7ab9255d3a7d289996a8 Mon Sep 17 00:00:00 2001 From: Ariana Ginju Date: Tue, 30 Jan 2024 12:05:23 +0000 Subject: [PATCH 101/245] check winner --- src/main/c/GameTic_Tac_Toe/game.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/main/c/GameTic_Tac_Toe/game.c b/src/main/c/GameTic_Tac_Toe/game.c index 85a08a2..215af00 100644 --- a/src/main/c/GameTic_Tac_Toe/game.c +++ b/src/main/c/GameTic_Tac_Toe/game.c @@ -69,3 +69,10 @@ int main() { while (1) { displayBoard(); makeMove(); + + char winner = checkWinner(); + if (winner == 'X' || winner == 'O') { + displayBoard(); + printf("Spieler %c gewinnt!\n", winner); + break; + } From b02a1f7f6cf0cc7727c125ff136099760d521075 Mon Sep 17 00:00:00 2001 From: Ariana Ginju Date: Tue, 30 Jan 2024 12:20:45 +0000 Subject: [PATCH 102/245] possibility: draw --- src/main/c/GameTic_Tac_Toe/game.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/c/GameTic_Tac_Toe/game.c b/src/main/c/GameTic_Tac_Toe/game.c index 215af00..0f0d6f8 100644 --- a/src/main/c/GameTic_Tac_Toe/game.c +++ b/src/main/c/GameTic_Tac_Toe/game.c @@ -76,3 +76,9 @@ int main() { printf("Spieler %c gewinnt!\n", winner); break; } + + if (isBoardFull()) { + displayBoard(); + printf("Unentschieden!\n"); + break; + } From 421db299f35517a88096b718f0af89ab65693137 Mon Sep 17 00:00:00 2001 From: Ariana Ginju Date: Tue, 30 Jan 2024 12:22:57 +0000 Subject: [PATCH 103/245] Change player --- src/main/c/GameTic_Tac_Toe/game.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/main/c/GameTic_Tac_Toe/game.c b/src/main/c/GameTic_Tac_Toe/game.c index 0f0d6f8..b20f125 100644 --- a/src/main/c/GameTic_Tac_Toe/game.c +++ b/src/main/c/GameTic_Tac_Toe/game.c @@ -82,3 +82,10 @@ int main() { printf("Unentschieden!\n"); break; } + + // Wechsle den Spieler + currentPlayer = (currentPlayer == 'X') ? 'O' : 'X'; + } + + return 0; +} From 04b9365a8ac416738f3555c3f6eb17ea18a4ae2f Mon Sep 17 00:00:00 2001 From: Ariana Ginju Date: Tue, 30 Jan 2024 16:57:40 +0000 Subject: [PATCH 104/245] refactoring: lear condition for an invalid move --- src/main/c/GameTic_Tac_Toe/game.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/c/GameTic_Tac_Toe/game.c b/src/main/c/GameTic_Tac_Toe/game.c index b20f125..11d2a79 100644 --- a/src/main/c/GameTic_Tac_Toe/game.c +++ b/src/main/c/GameTic_Tac_Toe/game.c @@ -57,11 +57,11 @@ void makeMove() { int col = (choice - 1) % 3; // Überprüfe, ob das gewählte Feld gültig ist - if (choice >= 1 && choice <= 9 && board[row][col] != 'X' && board[row][col] != 'O') { - board[row][col] = currentPlayer; - } else { - printf("Ungültiger Zug! Bitte wähle erneut.\n"); + if (choice < 1 || choice > 9 || board[row][col] == 'X' || board[row][col] == 'O') { + printf("Ungültiger Zug! Bitte wähle erneut.\n"); makeMove(); // Rekursiver Aufruf, bis ein gültiger Zug gemacht wird + } else { + board[row][col] = currentPlayer; } } From a0ecdb63f1cbbe0fc19f296d86830176e43793b3 Mon Sep 17 00:00:00 2001 From: Ariana Ginju Date: Tue, 30 Jan 2024 17:05:35 +0000 Subject: [PATCH 105/245] refactoring: using else and if --- src/main/c/GameTic_Tac_Toe/game.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/c/GameTic_Tac_Toe/game.c b/src/main/c/GameTic_Tac_Toe/game.c index 11d2a79..278b1e5 100644 --- a/src/main/c/GameTic_Tac_Toe/game.c +++ b/src/main/c/GameTic_Tac_Toe/game.c @@ -27,7 +27,7 @@ char checkWinner() { } // Überprüfe diagonale Linien if (board[0][0] == board[1][1] && board[1][1] == board[2][2]) return board[0][0]; - if (board[0][2] == board[1][1] && board[1][1] == board[2][0]) return board[0][2]; + else if (board[0][2] == board[1][1] && board[1][1] == board[2][0]) return board[0][2]; // Kein Gewinner return ' '; From 990b115c96fed40a214baed9d0fe6d5dc5c63ec9 Mon Sep 17 00:00:00 2001 From: Ariana Ginju Date: Tue, 30 Jan 2024 17:15:30 +0000 Subject: [PATCH 106/245] refactoring: using an auxiliary feature for win conditions --- src/main/c/GameTic_Tac_Toe/game.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/main/c/GameTic_Tac_Toe/game.c b/src/main/c/GameTic_Tac_Toe/game.c index 278b1e5..0765c17 100644 --- a/src/main/c/GameTic_Tac_Toe/game.c +++ b/src/main/c/GameTic_Tac_Toe/game.c @@ -17,13 +17,19 @@ void displayBoard() { if (i < 2) printf("---------\n"); } } - +char checkLine(char a, char b, char c) { + if (a == b && b == c) return a; + return ' '; +} // Funktion zur Überprüfung des Gewinners char checkWinner() { // Überprüfe horizontale und vertikale Linien - for (int i = 0; i < 3; i++) { - if (board[i][0] == board[i][1] && board[i][1] == board[i][2]) return board[i][0]; - if (board[0][i] == board[1][i] && board[1][i] == board[2][i]) return board[0][i]; + for (int i = 0; i < 3; i++) { + char horizontalWinner = checkLine(board[i][0], board[i][1], board[i][2]); + char verticalWinner = checkLine(board[0][i], board[1][i], board[2][i]); + + if (horizontalWinner != ' ') return horizontalWinner; + if (verticalWinner != ' ') return verticalWinner; } // Überprüfe diagonale Linien if (board[0][0] == board[1][1] && board[1][1] == board[2][2]) return board[0][0]; From fec03368ca2cd1c5a0c2648c81f7709e179c9dd6 Mon Sep 17 00:00:00 2001 From: Ariana Ginju Date: Tue, 30 Jan 2024 17:18:52 +0000 Subject: [PATCH 107/245] refactoring: using an auxiliary function for diagonal lines --- src/main/c/GameTic_Tac_Toe/game.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main/c/GameTic_Tac_Toe/game.c b/src/main/c/GameTic_Tac_Toe/game.c index 0765c17..215f890 100644 --- a/src/main/c/GameTic_Tac_Toe/game.c +++ b/src/main/c/GameTic_Tac_Toe/game.c @@ -32,8 +32,11 @@ char checkWinner() { if (verticalWinner != ' ') return verticalWinner; } // Überprüfe diagonale Linien - if (board[0][0] == board[1][1] && board[1][1] == board[2][2]) return board[0][0]; - else if (board[0][2] == board[1][1] && board[1][1] == board[2][0]) return board[0][2]; + char diagonal1Winner = checkLine(board[0][0], board[1][1], board[2][2]); + char diagonal2Winner = checkLine(board[0][2], board[1][1], board[2][0]); + + if (diagonal1Winner != ' ') return diagonal1Winner; + if (diagonal2Winner != ' ') return diagonal2Winner; // Kein Gewinner return ' '; From 483f2b54800761f661f66ec9e4f931386e707620 Mon Sep 17 00:00:00 2001 From: Ariana Ginju Date: Tue, 30 Jan 2024 17:43:49 +0000 Subject: [PATCH 108/245] refactoring: logic functions for player exchange Author: Ariana Ginju --- src/main/c/GameTic_Tac_Toe/game.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/c/GameTic_Tac_Toe/game.c b/src/main/c/GameTic_Tac_Toe/game.c index 215f890..a3f3ae2 100644 --- a/src/main/c/GameTic_Tac_Toe/game.c +++ b/src/main/c/GameTic_Tac_Toe/game.c @@ -56,6 +56,10 @@ int isBoardFull() { // Funktion zum Zug eines Spielers +char switchPlayer(char currentPlayer) { + return (currentPlayer == 'X') ? 'O' : 'X'; +} + void makeMove() { int choice; printf("Spieler %c, wähle eine Zahl (1-9): ", currentPlayer); @@ -71,6 +75,7 @@ void makeMove() { makeMove(); // Rekursiver Aufruf, bis ein gültiger Zug gemacht wird } else { board[row][col] = currentPlayer; + currentPlayer = switchPlayer(currentPlayer); } } From 29759098ad1f386a32dc74eb2b89f87d99ff4196 Mon Sep 17 00:00:00 2001 From: Ariana Ginju Date: Tue, 30 Jan 2024 17:53:55 +0000 Subject: [PATCH 109/245] refactoring: separation of the game loop into functions Author: Ariana Ginju --- src/main/c/GameTic_Tac_Toe/game.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/main/c/GameTic_Tac_Toe/game.c b/src/main/c/GameTic_Tac_Toe/game.c index a3f3ae2..f193efa 100644 --- a/src/main/c/GameTic_Tac_Toe/game.c +++ b/src/main/c/GameTic_Tac_Toe/game.c @@ -79,7 +79,7 @@ void makeMove() { } } -int main() { +void playGame() { while (1) { displayBoard(); makeMove(); @@ -95,11 +95,10 @@ int main() { displayBoard(); printf("Unentschieden!\n"); break; - } - - // Wechsle den Spieler - currentPlayer = (currentPlayer == 'X') ? 'O' : 'X'; + } } - +} +int main(){ + playGame(); return 0; } From 0d188261b2ad94bb5efa2a48e553496662ef42b1 Mon Sep 17 00:00:00 2001 From: Ariana Ginju Date: Tue, 30 Jan 2024 17:56:28 +0000 Subject: [PATCH 110/245] refactoring: using const --- src/main/c/GameTic_Tac_Toe/game.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/c/GameTic_Tac_Toe/game.c b/src/main/c/GameTic_Tac_Toe/game.c index f193efa..f20e298 100644 --- a/src/main/c/GameTic_Tac_Toe/game.c +++ b/src/main/c/GameTic_Tac_Toe/game.c @@ -43,9 +43,11 @@ char checkWinner() { } // Funktion zur Überprüfung, ob das Spiel unentschieden ist +const int BOARD_SIZE = 3; + int isBoardFull() { - for (int i = 0; i < 3; i++) { - for (int j = 0; j < 3; j++) { + for (int i = 0; i < BOARD_SIZE; i++) { + for (int j = 0; j < BOARD_SIZE; j++) { if (board[i][j] != 'X' && board[i][j] != 'O') { return 0; } From f0480af37136c2200c5e0486ef55e54a1336f045 Mon Sep 17 00:00:00 2001 From: Ariana Ginju Date: Tue, 30 Jan 2024 18:04:27 +0000 Subject: [PATCH 111/245] refactoring: Clear condition in makeMove --- src/main/c/GameTic_Tac_Toe/game.c | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/src/main/c/GameTic_Tac_Toe/game.c b/src/main/c/GameTic_Tac_Toe/game.c index f20e298..ece4bb7 100644 --- a/src/main/c/GameTic_Tac_Toe/game.c +++ b/src/main/c/GameTic_Tac_Toe/game.c @@ -62,22 +62,28 @@ char switchPlayer(char currentPlayer) { return (currentPlayer == 'X') ? 'O' : 'X'; } +int isValidMove(int choice) { + int row = (choice - 1) / BOARD_SIZE; + int col = (choice - 1) % BOARD_SIZE; + + return (choice >= 1 && choice <= BOARD_SIZE * BOARD_SIZE && board[row][col] != 'X' && board[row][col] != 'O'); +} + void makeMove() { int choice; - printf("Spieler %c, wähle eine Zahl (1-9): ", currentPlayer); + printf("Spieler %c, waehle eine Zahl (1-9): ", currentPlayer); scanf("%d", &choice); // Konvertiere die Zahl in Zeilen- und Spaltenindex - int row = (choice - 1) / 3; - int col = (choice - 1) % 3; - - // Überprüfe, ob das gewählte Feld gültig ist - if (choice < 1 || choice > 9 || board[row][col] == 'X' || board[row][col] == 'O') { - printf("Ungültiger Zug! Bitte wähle erneut.\n"); - makeMove(); // Rekursiver Aufruf, bis ein gültiger Zug gemacht wird - } else { - board[row][col] = currentPlayer; - currentPlayer = switchPlayer(currentPlayer); +if (isValidMove(choice)) { + int row = (choice - 1) / / BOARD_SIZE; + int col = (choice - 1) % % BOARD_SIZE; + board[row][col] = currentPlayer; + currentPlayer = switchPlayer(currentPlayer); + +} else { + printf("Ungueltiger Zug! Bitte waehle erneut.\n"); + makeMove(); // Rekursiver Aufruf, bis ein gültiger Zug gemacht wird } } From 0221526e8e45ec1686d295f40d8660626af09bac Mon Sep 17 00:00:00 2001 From: Ariana Ginju Date: Tue, 30 Jan 2024 18:07:39 +0000 Subject: [PATCH 112/245] Update: corrected errors --- src/main/c/GameTic_Tac_Toe/game.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/c/GameTic_Tac_Toe/game.c b/src/main/c/GameTic_Tac_Toe/game.c index ece4bb7..e56e55f 100644 --- a/src/main/c/GameTic_Tac_Toe/game.c +++ b/src/main/c/GameTic_Tac_Toe/game.c @@ -76,8 +76,8 @@ void makeMove() { // Konvertiere die Zahl in Zeilen- und Spaltenindex if (isValidMove(choice)) { - int row = (choice - 1) / / BOARD_SIZE; - int col = (choice - 1) % % BOARD_SIZE; + int row = (choice - 1) / BOARD_SIZE; + int col = (choice - 1) % BOARD_SIZE; board[row][col] = currentPlayer; currentPlayer = switchPlayer(currentPlayer); From b690c7e673ae766b2cdc4f5f639fae28436f7e53 Mon Sep 17 00:00:00 2001 From: Ariana Ginju Date: Tue, 30 Jan 2024 18:14:59 +0000 Subject: [PATCH 113/245] refactoring: Using const for game symbol constants --- src/main/c/GameTic_Tac_Toe/game.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/c/GameTic_Tac_Toe/game.c b/src/main/c/GameTic_Tac_Toe/game.c index e56e55f..ec98aec 100644 --- a/src/main/c/GameTic_Tac_Toe/game.c +++ b/src/main/c/GameTic_Tac_Toe/game.c @@ -4,7 +4,8 @@ char board[3][3] = {{'1', '2', '3'}, {'4', '5', '6'}, {'7', '8', '9'}}; char currentPlayer = 'X'; - +const char PLAYER_X = 'X'; +const char PLAYER_O = 'O'; // Funktionen zur Anzeige des Spielbretts void displayBoard() { printf("Tic-Tac-Toe\n"); From 0721be55c82ee5cbbfe631cf08501bd091df9d6b Mon Sep 17 00:00:00 2001 From: Ariana Ginju Date: Tue, 30 Jan 2024 18:16:46 +0000 Subject: [PATCH 114/245] refactoring: Removing the currentPlayer global variable --- src/main/c/GameTic_Tac_Toe/game.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/c/GameTic_Tac_Toe/game.c b/src/main/c/GameTic_Tac_Toe/game.c index ec98aec..8615cb8 100644 --- a/src/main/c/GameTic_Tac_Toe/game.c +++ b/src/main/c/GameTic_Tac_Toe/game.c @@ -60,7 +60,7 @@ int isBoardFull() { // Funktion zum Zug eines Spielers char switchPlayer(char currentPlayer) { - return (currentPlayer == 'X') ? 'O' : 'X'; + return (currentPlayer == PLAYER_X) ? PLAYER_O : PLAYER_X; } int isValidMove(int choice) { From dff9fd6ec9fdcd792ff6f2628a11a7e213fcd57a Mon Sep 17 00:00:00 2001 From: Ariana Ginju Date: Tue, 30 Jan 2024 18:20:35 +0000 Subject: [PATCH 115/245] refactoring: Using a loop --- src/main/c/GameTic_Tac_Toe/game.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/main/c/GameTic_Tac_Toe/game.c b/src/main/c/GameTic_Tac_Toe/game.c index 8615cb8..177acc8 100644 --- a/src/main/c/GameTic_Tac_Toe/game.c +++ b/src/main/c/GameTic_Tac_Toe/game.c @@ -6,16 +6,22 @@ char board[3][3] = {{'1', '2', '3'}, char currentPlayer = 'X'; const char PLAYER_X = 'X'; const char PLAYER_O = 'O'; + // Funktionen zur Anzeige des Spielbretts void displayBoard() { printf("Tic-Tac-Toe\n"); - for (int i = 0; i < 3; i++) { - for (int j = 0; j < 3; j++) { + for (int i = 0; i < BOARD_SIZE; i++) { + for (int j = 0; j < BOARD_SIZE; j++) { printf("%c", board[i][j]); - if (j < 2) printf(" | "); - } + if (j < BOARD_SIZE - 1) printf(" | "); + } printf("\n"); - if (i < 2) printf("---------\n"); + if (i < BOARD_SIZE - 1) { + for (int k = 0; k < BOARD_SIZE * 4 - 1; k++) { + printf("-"); + } + printf("\n"); + } } } char checkLine(char a, char b, char c) { From 6d1d96c4d9732867d1f69a2ebca2af38fe51cd3c Mon Sep 17 00:00:00 2001 From: Ariana Ginju Date: Tue, 30 Jan 2024 18:35:42 +0000 Subject: [PATCH 116/245] refactoring: char replaced with enum --- src/main/c/GameTic_Tac_Toe/game.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/c/GameTic_Tac_Toe/game.c b/src/main/c/GameTic_Tac_Toe/game.c index 177acc8..ea95618 100644 --- a/src/main/c/GameTic_Tac_Toe/game.c +++ b/src/main/c/GameTic_Tac_Toe/game.c @@ -24,14 +24,16 @@ void displayBoard() { } } } + char checkLine(char a, char b, char c) { if (a == b && b == c) return a; return ' '; } + // Funktion zur Überprüfung des Gewinners char checkWinner() { // Überprüfe horizontale und vertikale Linien - for (int i = 0; i < 3; i++) { + for (int i = 0; i < BOARD_SIZE; i++) { char horizontalWinner = checkLine(board[i][0], board[i][1], board[i][2]); char verticalWinner = checkLine(board[0][i], board[1][i], board[2][i]); @@ -65,7 +67,7 @@ int isBoardFull() { // Funktion zum Zug eines Spielers -char switchPlayer(char currentPlayer) { +enum switchPlayer(enum currentPlayer) { return (currentPlayer == PLAYER_X) ? PLAYER_O : PLAYER_X; } From 51aff089d80018462a17f45565432ff16bf07f76 Mon Sep 17 00:00:00 2001 From: Ariana Ginju Date: Tue, 30 Jan 2024 18:44:21 +0000 Subject: [PATCH 117/245] refactoring: replacing larger parts --- src/main/c/GameTic_Tac_Toe/game.c | 35 ++++++++++++++++--------------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/src/main/c/GameTic_Tac_Toe/game.c b/src/main/c/GameTic_Tac_Toe/game.c index ea95618..3b7f017 100644 --- a/src/main/c/GameTic_Tac_Toe/game.c +++ b/src/main/c/GameTic_Tac_Toe/game.c @@ -80,14 +80,14 @@ int isValidMove(int choice) { void makeMove() { int choice; - printf("Spieler %c, waehle eine Zahl (1-9): ", currentPlayer); + printf("Spieler %c, waehle eine Zahl (1-9): ", currentPlayer == PLAYER_X) ? 'X' : 'O'); scanf("%d", &choice); // Konvertiere die Zahl in Zeilen- und Spaltenindex if (isValidMove(choice)) { int row = (choice - 1) / BOARD_SIZE; int col = (choice - 1) % BOARD_SIZE; - board[row][col] = currentPlayer; + board[row][col] = currentPlayer == PLAYER_X) ? 'X' : 'O'; currentPlayer = switchPlayer(currentPlayer); } else { @@ -96,25 +96,26 @@ if (isValidMove(choice)) { } } +int isGameOver() { + char winner = checkWinner(); + return (winner == PLAYER_X || winner == PLAYER_O || isBoardFull()); +} + +void printGameResult(char winner) { + if (winner == PLAYER_X || winner == PLAYER_O) { + printf("Spieler %c gewinnt!\n", (winner == PLAYER_X) ? 'X' : 'O'); + } else { + printf("Unentschieden!\n"); + } +} + void playGame() { - while (1) { + while (!isGameOver()) { displayBoard(); makeMove(); - - char winner = checkWinner(); - if (winner == 'X' || winner == 'O') { - displayBoard(); - printf("Spieler %c gewinnt!\n", winner); - break; - } - - if (isBoardFull()) { - displayBoard(); - printf("Unentschieden!\n"); - break; - } } -} + + //Fehlt etwas, änderung folgt; int main(){ playGame(); return 0; From 3989ecb68131b39183b56acdd5f9ba06e24f0cef Mon Sep 17 00:00:00 2001 From: Ariana Ginju Date: Tue, 30 Jan 2024 18:45:51 +0000 Subject: [PATCH 118/245] refactoring: added missing part --- src/main/c/GameTic_Tac_Toe/game.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/c/GameTic_Tac_Toe/game.c b/src/main/c/GameTic_Tac_Toe/game.c index 3b7f017..f72b814 100644 --- a/src/main/c/GameTic_Tac_Toe/game.c +++ b/src/main/c/GameTic_Tac_Toe/game.c @@ -115,7 +115,11 @@ void playGame() { makeMove(); } - //Fehlt etwas, änderung folgt; + displayBoard(); + char winner = checkWinner(); + printGameResult(winner); +} + int main(){ playGame(); return 0; From 4cdef01b3a4c00d51b701701ed1780c878177253 Mon Sep 17 00:00:00 2001 From: Ariana Ginju Date: Tue, 30 Jan 2024 19:14:53 +0000 Subject: [PATCH 119/245] refactoring: correct the errors --- src/main/c/GameTic_Tac_Toe/game.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/main/c/GameTic_Tac_Toe/game.c b/src/main/c/GameTic_Tac_Toe/game.c index f72b814..443fe8d 100644 --- a/src/main/c/GameTic_Tac_Toe/game.c +++ b/src/main/c/GameTic_Tac_Toe/game.c @@ -1,5 +1,6 @@ #include +const int BOARD_SIZE = 3; char board[3][3] = {{'1', '2', '3'}, {'4', '5', '6'}, {'7', '8', '9'}}; @@ -52,8 +53,6 @@ char checkWinner() { } // Funktion zur Überprüfung, ob das Spiel unentschieden ist -const int BOARD_SIZE = 3; - int isBoardFull() { for (int i = 0; i < BOARD_SIZE; i++) { for (int j = 0; j < BOARD_SIZE; j++) { @@ -67,7 +66,7 @@ int isBoardFull() { // Funktion zum Zug eines Spielers -enum switchPlayer(enum currentPlayer) { +char switchPlayer(char currentPlayer) { return (currentPlayer == PLAYER_X) ? PLAYER_O : PLAYER_X; } @@ -80,14 +79,14 @@ int isValidMove(int choice) { void makeMove() { int choice; - printf("Spieler %c, waehle eine Zahl (1-9): ", currentPlayer == PLAYER_X) ? 'X' : 'O'); + printf("Spieler %c, waehle eine Zahl (1-9): ", (currentPlayer == PLAYER_X) ? 'X' : 'O'); scanf("%d", &choice); // Konvertiere die Zahl in Zeilen- und Spaltenindex if (isValidMove(choice)) { int row = (choice - 1) / BOARD_SIZE; int col = (choice - 1) % BOARD_SIZE; - board[row][col] = currentPlayer == PLAYER_X) ? 'X' : 'O'; + board[row][col] = (currentPlayer == PLAYER_X) ? 'X' : 'O'; currentPlayer = switchPlayer(currentPlayer); } else { From 20e5561526c78d54b721eef846afba80e411298e Mon Sep 17 00:00:00 2001 From: Ariana Ginju Date: Wed, 31 Jan 2024 12:23:59 +0000 Subject: [PATCH 120/245] Add new directory --- test/tests_tictactoe.game/.gitkeep | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 test/tests_tictactoe.game/.gitkeep diff --git a/test/tests_tictactoe.game/.gitkeep b/test/tests_tictactoe.game/.gitkeep new file mode 100644 index 0000000..e69de29 From a1de4d4bb84dbd5a60038e1bbf0948729656be0c Mon Sep 17 00:00:00 2001 From: Ariana Ginju Date: Wed, 31 Jan 2024 12:27:00 +0000 Subject: [PATCH 121/245] Delete .gitkeep --- test/tests_tictactoe.game/.gitkeep | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 test/tests_tictactoe.game/.gitkeep diff --git a/test/tests_tictactoe.game/.gitkeep b/test/tests_tictactoe.game/.gitkeep deleted file mode 100644 index e69de29..0000000 From f756c806111db52ec747236f56681fff766dec18 Mon Sep 17 00:00:00 2001 From: Ariana Ginju Date: Wed, 31 Jan 2024 12:28:08 +0000 Subject: [PATCH 122/245] Add new file --- test/test_tictactoe.c | 1 + 1 file changed, 1 insertion(+) create mode 100644 test/test_tictactoe.c diff --git a/test/test_tictactoe.c b/test/test_tictactoe.c new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/test/test_tictactoe.c @@ -0,0 +1 @@ + From c3865b164d9defa4a3517efa1462beb07ad2f939 Mon Sep 17 00:00:00 2001 From: Julia Selig Date: Wed, 31 Jan 2024 13:09:11 +0000 Subject: [PATCH 123/245] Erstellen Spielfeld --- src/main/c/Pong/game.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/src/main/c/Pong/game.c b/src/main/c/Pong/game.c index 8b13789..b2969e0 100644 --- a/src/main/c/Pong/game.c +++ b/src/main/c/Pong/game.c @@ -1 +1,25 @@ +#include +#define WIDTH 40 //Breite Spielfeld +#define HEIGHT 20 //Höhe Spielfeld + +void drawField() { + for (int i = 0; i <= HEIGHT; i++){ + for (int j = 0; j <= WIDTH; j++){ + if (i == 0 || i == HEIGHT){ + printf("-"); + } else if ("i == 0 || j == WIDTH") { + printf("|"); + } else { + printf(" "); + } + } + printf("\n"); + } +} + +int main(){ + drawField(); + + return 0; +} From 753dd2211c81e1989d33795aebe3ba6cbd3a4434 Mon Sep 17 00:00:00 2001 From: fdai8040 Date: Wed, 31 Jan 2024 13:32:36 +0000 Subject: [PATCH 124/245] =?UTF-8?q?Hinzuf=C3=BCgen=20Schl=C3=A4gel?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/c/Pong/game.c | 32 +++++++++++++++++++++++++++++--- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git a/src/main/c/Pong/game.c b/src/main/c/Pong/game.c index b2969e0..f97a3f0 100644 --- a/src/main/c/Pong/game.c +++ b/src/main/c/Pong/game.c @@ -2,14 +2,20 @@ #define WIDTH 40 //Breite Spielfeld #define HEIGHT 20 //Höhe Spielfeld +#define PADDLE_LENGTH 4 +#define PADDLE '#' -void drawField() { +void drawField(int paddle1PositionY, int paddle2PositionY) { for (int i = 0; i <= HEIGHT; i++){ for (int j = 0; j <= WIDTH; j++){ if (i == 0 || i == HEIGHT){ printf("-"); - } else if ("i == 0 || j == WIDTH") { + } else if ("j == 0 || j == WIDTH") && (i < paddle1PositionY || i >= paddle1PositionY + PADDLE_LENGTH) && (i < paddle2PositionY || i >= paddle2PositionY + PADDLE_LENGTH)) { printf("|"); + } else if (i >= paddle1PositionY && i < paddle1PositionY + PADDLE_LENGTH && j == WIDTH) { + printf("%c", PADDLE); + }else if (i >= paddle2PositionY && i < paddle2PositionY + PADDLE_LENGTH && j == 0) { + printf("%c", PADDLE); } else { printf(" "); } @@ -19,7 +25,27 @@ void drawField() { } int main(){ - drawField(); + int paddle1PositionY = HEIGHT / 2 - PADDLE_LENGTH / 2; + int paddle2PositionY = HEIGHT / 2 - PADDLE_LENGTH / 2; + while (1) { + if (kbhit()){ + char input = getch(); + if (input == 'w' && paddle1PositionY > 1) + { + paddle1PositionY--; + } else if (input == 's' && paddle1PositionY < HEIGHT - PADDLE_LENGTH - 1) { + paddle1PositionY++; + } + } + +// Hier Steuerung für Schläger 2 noch reinschreiben + + draw Field(paddle1PositionY, paddle2PositionY); + + } + return 0; } + + From 2e38b367d885f0805a843b99b1b5b62f927dabfc Mon Sep 17 00:00:00 2001 From: fdai8040 Date: Wed, 31 Jan 2024 13:53:00 +0000 Subject: [PATCH 125/245] =?UTF-8?q?Hinzuf=C3=BCgen=20Schl=C3=A4gel=202?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/c/Pong/game.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/main/c/Pong/game.c b/src/main/c/Pong/game.c index f97a3f0..69d6a31 100644 --- a/src/main/c/Pong/game.c +++ b/src/main/c/Pong/game.c @@ -24,6 +24,7 @@ void drawField(int paddle1PositionY, int paddle2PositionY) { } } + int main(){ int paddle1PositionY = HEIGHT / 2 - PADDLE_LENGTH / 2; int paddle2PositionY = HEIGHT / 2 - PADDLE_LENGTH / 2; @@ -39,7 +40,15 @@ int main(){ } } -// Hier Steuerung für Schläger 2 noch reinschreiben +//Steuerung für Schläger 2 + if (kbhit()){ + char input = getch(); + if (input == 'i' && paddle2PositionY > 1) { + paddle2PositionY--; + } else if (input == 'k' && paddle2PositionY < HEIGHT - PADDLE_LENGTH - 1){ + paddle2PositionY++; + } + } draw Field(paddle1PositionY, paddle2PositionY); From 1e473e2d0bb1f4e2e60257dd06d122889ff7ec61 Mon Sep 17 00:00:00 2001 From: fdai8040 Date: Wed, 31 Jan 2024 13:59:23 +0000 Subject: [PATCH 126/245] =?UTF-8?q?Hinzuf=C3=BCgen=20Tastatureingabe?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/c/Pong/game.c | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/src/main/c/Pong/game.c b/src/main/c/Pong/game.c index 69d6a31..e8b68d6 100644 --- a/src/main/c/Pong/game.c +++ b/src/main/c/Pong/game.c @@ -1,4 +1,5 @@ #include +#include #define WIDTH 40 //Breite Spielfeld #define HEIGHT 20 //Höhe Spielfeld @@ -24,6 +25,36 @@ void drawField(int paddle1PositionY, int paddle2PositionY) { } } +int kbhit(void){ + struct termios oldt, newt; + int ch, oldf; + + tcgetattr(STDIN_FILENO, &oldt); + newt = oldt; + newt.c_lflag &= ~(ICANON | ECHO); + tcsetattr(STDIN_FILENO, TCSANOW, &newt); + oldf = fcntl(STDIN_FILENO, F_GETFL, 0); + fcntl(STDIN_FILENO, F_SETFL, oldf | O_NONBLOCK); + + ch = getchar(); + + tcsetattr(STDIN_FILENO, TCSANOW, &oldt); + fcntl(STDIN_FILENO, F_SETFL, oldf); + + if (ch != EOF) { + ungetc(ch, stdin); + return 1; +} +return 0; +} + +int getch(void) { + int ch; + + while ((ch = getchar()) == '\n'); + + return ch; +} int main(){ int paddle1PositionY = HEIGHT / 2 - PADDLE_LENGTH / 2; From 30b212b1cff3dfaa6bbf2a31b1dc354f5c63acf5 Mon Sep 17 00:00:00 2001 From: fdai8040 Date: Wed, 31 Jan 2024 14:54:05 +0000 Subject: [PATCH 127/245] =?UTF-8?q?Bildschirm=20l=C3=B6schen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/c/Pong/game.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/main/c/Pong/game.c b/src/main/c/Pong/game.c index e8b68d6..6453f7a 100644 --- a/src/main/c/Pong/game.c +++ b/src/main/c/Pong/game.c @@ -1,12 +1,20 @@ #include #include +#include #define WIDTH 40 //Breite Spielfeld #define HEIGHT 20 //Höhe Spielfeld #define PADDLE_LENGTH 4 #define PADDLE '#' +// Bildschirm löschen nach Veränderung Position +void clearScreen() { + system("clear"); +} + void drawField(int paddle1PositionY, int paddle2PositionY) { + clearScreen(); + for (int i = 0; i <= HEIGHT; i++){ for (int j = 0; j <= WIDTH; j++){ if (i == 0 || i == HEIGHT){ @@ -15,7 +23,7 @@ void drawField(int paddle1PositionY, int paddle2PositionY) { printf("|"); } else if (i >= paddle1PositionY && i < paddle1PositionY + PADDLE_LENGTH && j == WIDTH) { printf("%c", PADDLE); - }else if (i >= paddle2PositionY && i < paddle2PositionY + PADDLE_LENGTH && j == 0) { + } else if (i >= paddle2PositionY && i < paddle2PositionY + PADDLE_LENGTH && j == 0) { printf("%c", PADDLE); } else { printf(" "); @@ -61,6 +69,7 @@ int main(){ int paddle2PositionY = HEIGHT / 2 - PADDLE_LENGTH / 2; while (1) { + //Steuerung für Schläger 1 if (kbhit()){ char input = getch(); if (input == 'w' && paddle1PositionY > 1) From 1636b53e131649af149ba398d43d5b1795e4d832 Mon Sep 17 00:00:00 2001 From: fdai8040 Date: Wed, 31 Jan 2024 14:55:36 +0000 Subject: [PATCH 128/245] Verlangsamen Schleife --- src/main/c/Pong/game.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/c/Pong/game.c b/src/main/c/Pong/game.c index 6453f7a..11a11b4 100644 --- a/src/main/c/Pong/game.c +++ b/src/main/c/Pong/game.c @@ -1,6 +1,7 @@ #include #include #include +#include #define WIDTH 40 //Breite Spielfeld #define HEIGHT 20 //Höhe Spielfeld @@ -92,6 +93,8 @@ int main(){ draw Field(paddle1PositionY, paddle2PositionY); + usleep(100000); //Verlangsamen Schleife/Spiel + } } return 0; From 6d51598c4ea5babe36686c5f3ce1981a15deed8c Mon Sep 17 00:00:00 2001 From: fdai8040 Date: Wed, 31 Jan 2024 15:10:01 +0000 Subject: [PATCH 129/245] Implementierung Ball --- src/main/c/Pong/game.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/main/c/Pong/game.c b/src/main/c/Pong/game.c index 11a11b4..c6067ed 100644 --- a/src/main/c/Pong/game.c +++ b/src/main/c/Pong/game.c @@ -7,13 +7,22 @@ #define HEIGHT 20 //Höhe Spielfeld #define PADDLE_LENGTH 4 #define PADDLE '#' +#define BALL 'O' + +//Ballstruktur +typedef struct { + int x; + int y; + int speedX; + int speedY; +} Ball; // Bildschirm löschen nach Veränderung Position void clearScreen() { system("clear"); } -void drawField(int paddle1PositionY, int paddle2PositionY) { +void drawField(int paddle1PositionY, int paddle2PositionY, Ball ball) { clearScreen(); for (int i = 0; i <= HEIGHT; i++){ From d1a3a890c1daad92c1685786f3e56b07b3ea5d4d Mon Sep 17 00:00:00 2001 From: fdai8040 Date: Wed, 31 Jan 2024 15:13:19 +0000 Subject: [PATCH 130/245] Startposition&Geschwindigkeit des Balles --- src/main/c/Pong/game.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/c/Pong/game.c b/src/main/c/Pong/game.c index c6067ed..f0f382e 100644 --- a/src/main/c/Pong/game.c +++ b/src/main/c/Pong/game.c @@ -35,6 +35,8 @@ void drawField(int paddle1PositionY, int paddle2PositionY, Ball ball) { printf("%c", PADDLE); } else if (i >= paddle2PositionY && i < paddle2PositionY + PADDLE_LENGTH && j == 0) { printf("%c", PADDLE); + } else if (i == ball.y && j == ball.x) { + printf("%c", BALL); } else { printf(" "); } @@ -77,6 +79,7 @@ int getch(void) { int main(){ int paddle1PositionY = HEIGHT / 2 - PADDLE_LENGTH / 2; int paddle2PositionY = HEIGHT / 2 - PADDLE_LENGTH / 2; + Ball ball = {WIDTH / 2, HEIGHT / 2, 1, 1}; //Startposition&Geschwindigkeit Ball while (1) { //Steuerung für Schläger 1 From e88f7ff2e6d1f7d42428f18763751b40ca3b13cf Mon Sep 17 00:00:00 2001 From: fdai8040 Date: Wed, 31 Jan 2024 15:14:28 +0000 Subject: [PATCH 131/245] Bewegung Ball --- src/main/c/Pong/game.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/c/Pong/game.c b/src/main/c/Pong/game.c index f0f382e..4030b11 100644 --- a/src/main/c/Pong/game.c +++ b/src/main/c/Pong/game.c @@ -102,6 +102,10 @@ int main(){ paddle2PositionY++; } } + + //Bewegung Ball + ball.x += ball.speedX; + ball.y += ball.speedY; draw Field(paddle1PositionY, paddle2PositionY); From 2b8a70f000ed8139501f1ed38e13f697ef031be2 Mon Sep 17 00:00:00 2001 From: fdai8040 Date: Wed, 31 Jan 2024 15:17:33 +0000 Subject: [PATCH 132/245] =?UTF-8?q?Ball=20Kollision=20mit=20Schl=C3=A4gern?= =?UTF-8?q?=20und=20W=C3=A4nden?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/c/Pong/game.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/main/c/Pong/game.c b/src/main/c/Pong/game.c index 4030b11..90f45f3 100644 --- a/src/main/c/Pong/game.c +++ b/src/main/c/Pong/game.c @@ -107,12 +107,22 @@ int main(){ ball.x += ball.speedX; ball.y += ball.speedY; + //Kollision Ball (mit Schlägern und Wänden) + if (ball.y <= 0 || ball.y >= HEIGHT - 1){ + ball.speedY = -ball.speedY; + } + if (ball.x == 1 && (ball.y >= paddle2PositionY && ball.y < paddle2PositionY + PADDLE_LENGTH)){ + ball.speedX = -ball.speedX; + } + if (ball.x == WIDTH - 1 && (ball.y >= paddle1PositionY && ball.y < paddle1PositionY + PADDLE_LENGTH)){ + ball.speedX = -ball.speedX; + } + draw Field(paddle1PositionY, paddle2PositionY); usleep(100000); //Verlangsamen Schleife/Spiel } - } - + return 0; } From 16041ce71143a5a0d555aeb277b4c2e84be5cf9b Mon Sep 17 00:00:00 2001 From: fdai8040 Date: Wed, 31 Jan 2024 15:24:18 +0000 Subject: [PATCH 133/245] Spielstand --- src/main/c/Pong/game.c | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/src/main/c/Pong/game.c b/src/main/c/Pong/game.c index 90f45f3..ce46d29 100644 --- a/src/main/c/Pong/game.c +++ b/src/main/c/Pong/game.c @@ -22,7 +22,7 @@ void clearScreen() { system("clear"); } -void drawField(int paddle1PositionY, int paddle2PositionY, Ball ball) { +void drawField(int paddle1PositionY, int paddle2PositionY, Ball ball, int score1, int score2) { clearScreen(); for (int i = 0; i <= HEIGHT; i++){ @@ -43,6 +43,9 @@ void drawField(int paddle1PositionY, int paddle2PositionY, Ball ball) { } printf("\n"); } + + printf("Spieler 1: %d\tSpieler 2: %d\n", score1, score2); + } int kbhit(void){ @@ -64,7 +67,7 @@ int kbhit(void){ if (ch != EOF) { ungetc(ch, stdin); return 1; -} + } return 0; } @@ -118,6 +121,20 @@ int main(){ ball.speedX = -ball.speedX; } + // Punkte zählen + if (ball.x <= 0){ + score1++; + ball.x = WIDTH / 2; + ball.y = HEIGHT / 2; + ball.speedX = -ball.speedX; + } + if (ball.x >= WIDTH - 1){ + score2++; + ball.x = WIDTH / 2; + ball.y = HEIGHT / 2; + ball.speedX = -ball.speedX; + } + draw Field(paddle1PositionY, paddle2PositionY); usleep(100000); //Verlangsamen Schleife/Spiel From 20ea5a7cbc65f36d7f9db23622d93ddc629ecb54 Mon Sep 17 00:00:00 2001 From: fdai8040 Date: Wed, 31 Jan 2024 15:32:46 +0000 Subject: [PATCH 134/245] Spielstand (vergessen zu implementieren variable) --- src/main/c/Pong/game.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/c/Pong/game.c b/src/main/c/Pong/game.c index ce46d29..3bb88ad 100644 --- a/src/main/c/Pong/game.c +++ b/src/main/c/Pong/game.c @@ -83,6 +83,8 @@ int main(){ int paddle1PositionY = HEIGHT / 2 - PADDLE_LENGTH / 2; int paddle2PositionY = HEIGHT / 2 - PADDLE_LENGTH / 2; Ball ball = {WIDTH / 2, HEIGHT / 2, 1, 1}; //Startposition&Geschwindigkeit Ball + int score1 = 0; + int score2 = 0; while (1) { //Steuerung für Schläger 1 From eadc41ecfb1554d6dae53cc4ad57e5da65ce62b9 Mon Sep 17 00:00:00 2001 From: fdai8040 Date: Wed, 31 Jan 2024 15:46:23 +0000 Subject: [PATCH 135/245] Spiel beenden wenn Punktestand erreicht --- src/main/c/Pong/game.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/main/c/Pong/game.c b/src/main/c/Pong/game.c index 3bb88ad..71b56a2 100644 --- a/src/main/c/Pong/game.c +++ b/src/main/c/Pong/game.c @@ -85,6 +85,7 @@ int main(){ Ball ball = {WIDTH / 2, HEIGHT / 2, 1, 1}; //Startposition&Geschwindigkeit Ball int score1 = 0; int score2 = 0; + int maxScore = 5; while (1) { //Steuerung für Schläger 1 @@ -137,7 +138,13 @@ int main(){ ball.speedX = -ball.speedX; } - draw Field(paddle1PositionY, paddle2PositionY); + draw Field(paddle1PositionY, paddle2PositionY,score1, score2); + + // Spielende überprüfen + if (score1 == maxScore || score2 == maxScore) { + printf("Spiel beendet!\n"); + break; + } usleep(100000); //Verlangsamen Schleife/Spiel } From 587dc8334f80412594ad99aa4599b6a31a2f2c95 Mon Sep 17 00:00:00 2001 From: fdai8040 Date: Wed, 31 Jan 2024 15:51:37 +0000 Subject: [PATCH 136/245] Ball anzeigen (vergessen) --- src/main/c/Pong/game.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/c/Pong/game.c b/src/main/c/Pong/game.c index 71b56a2..eee78dc 100644 --- a/src/main/c/Pong/game.c +++ b/src/main/c/Pong/game.c @@ -138,7 +138,7 @@ int main(){ ball.speedX = -ball.speedX; } - draw Field(paddle1PositionY, paddle2PositionY,score1, score2); + draw Field(paddle1PositionY, paddle2PositionY, ball, score1, score2); // Spielende überprüfen if (score1 == maxScore || score2 == maxScore) { From 0cf720020d01f720e2363e379b09e94357954306 Mon Sep 17 00:00:00 2001 From: fdai8040 Date: Wed, 31 Jan 2024 15:56:06 +0000 Subject: [PATCH 137/245] Anzeigen Gewinner --- src/main/c/Pong/game.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/c/Pong/game.c b/src/main/c/Pong/game.c index eee78dc..96daa74 100644 --- a/src/main/c/Pong/game.c +++ b/src/main/c/Pong/game.c @@ -143,6 +143,11 @@ int main(){ // Spielende überprüfen if (score1 == maxScore || score2 == maxScore) { printf("Spiel beendet!\n"); + if (score1 == maxScore) { + printf("Spieler 1 gewinnt!\n"); + } else { + printf("Spieler 2 gewinnt!\n"); + } break; } From 13a15d1fc6b9b409003ab0b1c68b23a8ad5d277a Mon Sep 17 00:00:00 2001 From: fdai8040 Date: Wed, 31 Jan 2024 16:18:11 +0000 Subject: [PATCH 138/245] Spiel Pausieren --- src/main/c/Pong/game.c | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/src/main/c/Pong/game.c b/src/main/c/Pong/game.c index 96daa74..877ea22 100644 --- a/src/main/c/Pong/game.c +++ b/src/main/c/Pong/game.c @@ -45,6 +45,7 @@ void drawField(int paddle1PositionY, int paddle2PositionY, Ball ball, int score1 } printf("Spieler 1: %d\tSpieler 2: %d\n", score1, score2); + printf("Drücken Sie 'p', um das Spiel zu pausieren.\n"); } @@ -86,28 +87,38 @@ int main(){ int score1 = 0; int score2 = 0; int maxScore = 5; + int isPaused = 0; while (1) { //Steuerung für Schläger 1 if (kbhit()){ char input = getch(); - if (input == 'w' && paddle1PositionY > 1) + if (input == 'w' && paddle1PositionY > 1 && !isPaused) { paddle1PositionY--; - } else if (input == 's' && paddle1PositionY < HEIGHT - PADDLE_LENGTH - 1) { + } else if (input == 's' && paddle1PositionY < HEIGHT - PADDLE_LENGTH - 1 && !isPaused) { paddle1PositionY++; + } else if (input == 'p') { + isPaused = !isPaused; } } //Steuerung für Schläger 2 if (kbhit()){ char input = getch(); - if (input == 'i' && paddle2PositionY > 1) { + if (input == 'i' && paddle2PositionY > 1 && !isPaused) { paddle2PositionY--; - } else if (input == 'k' && paddle2PositionY < HEIGHT - PADDLE_LENGTH - 1){ + } else if (input == 'k' && paddle2PositionY < HEIGHT - PADDLE_LENGTH - 1 && !isPaused){ paddle2PositionY++; + } else if (input == 'p') { + isPaused = !isPaused; } } + + //Wenn Pauseiert + if (isPaused) { + continue; + } //Bewegung Ball ball.x += ball.speedX; From cbf0e4a79b73f622515a622ae9b7fad74f4f9d32 Mon Sep 17 00:00:00 2001 From: fdai8040 Date: Wed, 31 Jan 2024 16:27:49 +0000 Subject: [PATCH 139/245] refactoring:_optimierungpausierung --- src/main/c/Pong/game.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/main/c/Pong/game.c b/src/main/c/Pong/game.c index 877ea22..4d72e10 100644 --- a/src/main/c/Pong/game.c +++ b/src/main/c/Pong/game.c @@ -91,12 +91,12 @@ int main(){ while (1) { //Steuerung für Schläger 1 - if (kbhit()){ + if (!isPaused && kbhit()){ char input = getch(); - if (input == 'w' && paddle1PositionY > 1 && !isPaused) + if (input == 'w' && paddle1PositionY > 1) { paddle1PositionY--; - } else if (input == 's' && paddle1PositionY < HEIGHT - PADDLE_LENGTH - 1 && !isPaused) { + } else if (input == 's' && paddle1PositionY < HEIGHT - PADDLE_LENGTH - 1) { paddle1PositionY++; } else if (input == 'p') { isPaused = !isPaused; @@ -104,11 +104,11 @@ int main(){ } //Steuerung für Schläger 2 - if (kbhit()){ + if (!isPaused && kbhit()){ char input = getch(); - if (input == 'i' && paddle2PositionY > 1 && !isPaused) { + if (input == 'i' && paddle2PositionY > 1){ paddle2PositionY--; - } else if (input == 'k' && paddle2PositionY < HEIGHT - PADDLE_LENGTH - 1 && !isPaused){ + } else if (input == 'k' && paddle2PositionY < HEIGHT - PADDLE_LENGTH - 1){ paddle2PositionY++; } else if (input == 'p') { isPaused = !isPaused; @@ -117,6 +117,7 @@ int main(){ //Wenn Pauseiert if (isPaused) { + drawField(paddle1PositionY, paddle2PositionY, ball, score1, score2, 1); continue; } From 285a26a686575e263fd687ff059935b82b449453 Mon Sep 17 00:00:00 2001 From: fdai8040 Date: Wed, 31 Jan 2024 16:36:45 +0000 Subject: [PATCH 140/245] Vergessen Int isPaused --- src/main/c/Pong/game.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/c/Pong/game.c b/src/main/c/Pong/game.c index 4d72e10..5e9636e 100644 --- a/src/main/c/Pong/game.c +++ b/src/main/c/Pong/game.c @@ -22,7 +22,7 @@ void clearScreen() { system("clear"); } -void drawField(int paddle1PositionY, int paddle2PositionY, Ball ball, int score1, int score2) { +void drawField(int paddle1PositionY, int paddle2PositionY, Ball ball, int score1, int score2, int isPaused) { clearScreen(); for (int i = 0; i <= HEIGHT; i++){ From fdaacc75eebe3cfa36a73b7fe6d24589ea244840 Mon Sep 17 00:00:00 2001 From: fdai8040 Date: Wed, 31 Jan 2024 16:39:39 +0000 Subject: [PATCH 141/245] Aktualisiert Spielpause --- src/main/c/Pong/game.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main/c/Pong/game.c b/src/main/c/Pong/game.c index 5e9636e..75fdbc6 100644 --- a/src/main/c/Pong/game.c +++ b/src/main/c/Pong/game.c @@ -45,8 +45,11 @@ void drawField(int paddle1PositionY, int paddle2PositionY, Ball ball, int score1 } printf("Spieler 1: %d\tSpieler 2: %d\n", score1, score2); - printf("Drücken Sie 'p', um das Spiel zu pausieren.\n"); - + if (isPaused) { + printf("Spiel pausiert. Drücken Sie 'p', um fortzufahren.\n"); + } else { + printf("Drücken Sie 'p', um das Spiel zu pausieren.\n"); + } } int kbhit(void){ From 1ce01e7bb349af9b407115fb0faf31b1c2b94794 Mon Sep 17 00:00:00 2001 From: fdai8040 Date: Wed, 31 Jan 2024 16:42:54 +0000 Subject: [PATCH 142/245] refactoring:_aktualisieren_ballposition_nun_an_zentraler_Stelle --- src/main/c/Pong/game.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/main/c/Pong/game.c b/src/main/c/Pong/game.c index 75fdbc6..c74f466 100644 --- a/src/main/c/Pong/game.c +++ b/src/main/c/Pong/game.c @@ -83,6 +83,13 @@ int getch(void) { return ch; } +//Aktualisierung Ballposition +void updateBallPosition(Ball *ball) { + ball->x += ball->speedX; + ball->y += ball->speedY; +} + + int main(){ int paddle1PositionY = HEIGHT / 2 - PADDLE_LENGTH / 2; int paddle2PositionY = HEIGHT / 2 - PADDLE_LENGTH / 2; From c2ce23c9fd2bcaceb3ba749850652ee4b974c02d Mon Sep 17 00:00:00 2001 From: fdai8040 Date: Wed, 31 Jan 2024 16:46:17 +0000 Subject: [PATCH 143/245] refactoring:_verbesserung_kollision --- src/main/c/Pong/game.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/main/c/Pong/game.c b/src/main/c/Pong/game.c index c74f466..b2ca2e0 100644 --- a/src/main/c/Pong/game.c +++ b/src/main/c/Pong/game.c @@ -89,6 +89,20 @@ void updateBallPosition(Ball *ball) { ball->y += ball->speedY; } +//Verbesserung Kollision mit Schlägern&Wänden +int checkCollision(Ball ball, int paddle1PositionY, int paddle2PositionY) { + // Kollision mit Schlägern und Wänden + if (ball.y <= 0 || ball.y >= HEIGHT - 1){ + ball.speedY = -ball.speedY; + } + if (ball.x == 1 && (ball.y >= paddle2PositionY && ball.y < paddle2PositionY + PADDLE_LENGTH)){ + ball.speedX = -ball.speedX; + } + + if (ball.x == WIDTH - 1 && (ball.y >= paddle1PositionY && ball.y < paddle1PositionY + PADDLE_LENGTH)){ + ball.speedX = -ball.speedX; + } + int main(){ int paddle1PositionY = HEIGHT / 2 - PADDLE_LENGTH / 2; From 8720b8fba938cf70335143b4ca95ba61edf341e8 Mon Sep 17 00:00:00 2001 From: fdai8040 Date: Wed, 31 Jan 2024 16:47:31 +0000 Subject: [PATCH 144/245] =?UTF-8?q?refactoring:=5Fbesser=5Fpunkte=5Fz?= =?UTF-8?q?=C3=A4hlen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/c/Pong/game.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/main/c/Pong/game.c b/src/main/c/Pong/game.c index b2ca2e0..c1d554f 100644 --- a/src/main/c/Pong/game.c +++ b/src/main/c/Pong/game.c @@ -103,6 +103,17 @@ int checkCollision(Ball ball, int paddle1PositionY, int paddle2PositionY) { ball.speedX = -ball.speedX; } + //Punkte zählen + if (ball.x <= 0){ + return 1; // Spieler 2 gewinnt Punkt + } + + if (ball.x >= WIDTH - 1){ + return 2; // Spieler 1 gewinnt Punkt + } + + return 0; // kein Punkt +} int main(){ int paddle1PositionY = HEIGHT / 2 - PADDLE_LENGTH / 2; From b5518b41cdc8ba21e93da1e74d3b6ee2c3421727 Mon Sep 17 00:00:00 2001 From: fdai8040 Date: Wed, 31 Jan 2024 16:49:42 +0000 Subject: [PATCH 145/245] =?UTF-8?q?refactoring:=5Fverbesserung=5Fpunktez?= =?UTF-8?q?=C3=A4hlen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/c/Pong/game.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/c/Pong/game.c b/src/main/c/Pong/game.c index c1d554f..6e3bc64 100644 --- a/src/main/c/Pong/game.c +++ b/src/main/c/Pong/game.c @@ -124,7 +124,7 @@ int main(){ int maxScore = 5; int isPaused = 0; - while (1) { + while (score1 < maxScore && score2 < maxScore) { //Steuerung für Schläger 1 if (!isPaused && kbhit()){ char input = getch(); From 99f33da69ec53c9b8a04ff6dbc7fd9bd71ce8192 Mon Sep 17 00:00:00 2001 From: fdai8040 Date: Wed, 31 Jan 2024 16:59:24 +0000 Subject: [PATCH 146/245] refactoring:_verbesserung_aktualisierung_spielstand_und_ballposition --- src/main/c/Pong/game.c | 47 ++++++++++++++---------------------------- 1 file changed, 15 insertions(+), 32 deletions(-) diff --git a/src/main/c/Pong/game.c b/src/main/c/Pong/game.c index 6e3bc64..4f6008e 100644 --- a/src/main/c/Pong/game.c +++ b/src/main/c/Pong/game.c @@ -157,50 +157,33 @@ int main(){ } //Bewegung Ball - ball.x += ball.speedX; - ball.y += ball.speedY; + updateBallPosition(&ball); + int result = checkCollision(ball, paddle1PositionY, paddle2PositionY); - //Kollision Ball (mit Schlägern und Wänden) - if (ball.y <= 0 || ball.y >= HEIGHT - 1){ - ball.speedY = -ball.speedY; - } - if (ball.x == 1 && (ball.y >= paddle2PositionY && ball.y < paddle2PositionY + PADDLE_LENGTH)){ - ball.speedX = -ball.speedX; - } - if (ball.x == WIDTH - 1 && (ball.y >= paddle1PositionY && ball.y < paddle1PositionY + PADDLE_LENGTH)){ - ball.speedX = -ball.speedX; - } - - // Punkte zählen - if (ball.x <= 0){ - score1++; + //Aktualisiert Spielstand und Ballposition + if (result == 1) { + score2++; ball.x = WIDTH / 2; ball.y = HEIGHT / 2; ball.speedX = -ball.speedX; - } - if (ball.x >= WIDTH - 1){ - score2++; + } else if (result == 2) { + score1++; ball.x = WIDTH / 2; ball.y = HEIGHT / 2; ball.speedX = -ball.speedX; } - draw Field(paddle1PositionY, paddle2PositionY, ball, score1, score2); - - // Spielende überprüfen - if (score1 == maxScore || score2 == maxScore) { - printf("Spiel beendet!\n"); - if (score1 == maxScore) { - printf("Spieler 1 gewinnt!\n"); - } else { - printf("Spieler 2 gewinnt!\n"); - } - break; - } - + drawField(paddle1PositionY, paddle2PositionY, ball, score1, score2, 0); usleep(100000); //Verlangsamen Schleife/Spiel } + clearScreen(); + if (score1 == maxScore) { + printf("Spieler 1 gewinnt!\n"); + } else { + printf("Spieler 2 gewinnt!\n"); + } + return 0; } From 9d072197a96f32b73dc6e9c05c80256455b21d53 Mon Sep 17 00:00:00 2001 From: fdai8040 Date: Wed, 31 Jan 2024 17:10:03 +0000 Subject: [PATCH 147/245] =?UTF-8?q?Zur=C3=BCcksetzen=20Spielstand?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/c/Pong/game.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/main/c/Pong/game.c b/src/main/c/Pong/game.c index 4f6008e..835c600 100644 --- a/src/main/c/Pong/game.c +++ b/src/main/c/Pong/game.c @@ -115,6 +115,12 @@ int checkCollision(Ball ball, int paddle1PositionY, int paddle2PositionY) { return 0; // kein Punkt } +//Reset +void resetScore(int *score1, int *score2) { + *score1 = 0; + *score2 = 0; +} + int main(){ int paddle1PositionY = HEIGHT / 2 - PADDLE_LENGTH / 2; int paddle2PositionY = HEIGHT / 2 - PADDLE_LENGTH / 2; @@ -173,6 +179,8 @@ int main(){ ball.speedX = -ball.speedX; } + resetScore(&score1, &score2); //Zurücksetzen Spielstand + drawField(paddle1PositionY, paddle2PositionY, ball, score1, score2, 0); usleep(100000); //Verlangsamen Schleife/Spiel } From 6c33a64a5d37897cf9a50935cd5835226cd00b73 Mon Sep 17 00:00:00 2001 From: fdai8040 Date: Wed, 31 Jan 2024 21:00:19 +0000 Subject: [PATCH 148/245] Stoppen des Spiels --- src/main/c/Pong/game.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/main/c/Pong/game.c b/src/main/c/Pong/game.c index 835c600..b50acba 100644 --- a/src/main/c/Pong/game.c +++ b/src/main/c/Pong/game.c @@ -50,6 +50,7 @@ void drawField(int paddle1PositionY, int paddle2PositionY, Ball ball, int score1 } else { printf("Drücken Sie 'p', um das Spiel zu pausieren.\n"); } + printf("Drücken Sie 'q', um das Spiel zu beenden.\n"); } int kbhit(void){ @@ -141,8 +142,12 @@ int main(){ paddle1PositionY++; } else if (input == 'p') { isPaused = !isPaused; - } + } else if (input == 'q') { + clearScreen(); + printf("Spiel beendet.\n"); + return 0; } + } //Steuerung für Schläger 2 if (!isPaused && kbhit()){ @@ -153,6 +158,10 @@ int main(){ paddle2PositionY++; } else if (input == 'p') { isPaused = !isPaused; + } else if (input == 'q') { + clearScreen(); + printf("Spiel beendet.\n"); + return 0; } } From a0e35087acf85c99ca175cb37dd8e4aee6b1640d Mon Sep 17 00:00:00 2001 From: fdai8040 Date: Wed, 31 Jan 2024 21:30:30 +0000 Subject: [PATCH 149/245] Korrigiert --- src/main/c/Pong/game.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/c/Pong/game.c b/src/main/c/Pong/game.c index b50acba..fa204fb 100644 --- a/src/main/c/Pong/game.c +++ b/src/main/c/Pong/game.c @@ -29,7 +29,7 @@ void drawField(int paddle1PositionY, int paddle2PositionY, Ball ball, int score1 for (int j = 0; j <= WIDTH; j++){ if (i == 0 || i == HEIGHT){ printf("-"); - } else if ("j == 0 || j == WIDTH") && (i < paddle1PositionY || i >= paddle1PositionY + PADDLE_LENGTH) && (i < paddle2PositionY || i >= paddle2PositionY + PADDLE_LENGTH)) { + } else if ((j == 0 || j == WIDTH) && (i < paddle1PositionY || i >= paddle1PositionY + PADDLE_LENGTH) && (i < paddle2PositionY || i >= paddle2PositionY + PADDLE_LENGTH)) { printf("|"); } else if (i >= paddle1PositionY && i < paddle1PositionY + PADDLE_LENGTH && j == WIDTH) { printf("%c", PADDLE); From 4863cb3a7a88652a3599502a6d2123d690e9cb76 Mon Sep 17 00:00:00 2001 From: fdai8040 Date: Wed, 31 Jan 2024 21:33:23 +0000 Subject: [PATCH 150/245] Ball rot machen --- src/main/c/Pong/game.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/c/Pong/game.c b/src/main/c/Pong/game.c index fa204fb..999b1cd 100644 --- a/src/main/c/Pong/game.c +++ b/src/main/c/Pong/game.c @@ -7,7 +7,7 @@ #define HEIGHT 20 //Höhe Spielfeld #define PADDLE_LENGTH 4 #define PADDLE '#' -#define BALL 'O' +#define BALL "\033[1;31mO\033[0m" //Ballstruktur typedef struct { From 7f5ffe15da32d9d559ea16439d87e1c88a7937b7 Mon Sep 17 00:00:00 2001 From: fdai8040 Date: Thu, 1 Feb 2024 09:52:36 +0000 Subject: [PATCH 151/245] =?UTF-8?q?Schl=C3=A4gel=20rot=20machen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/c/Pong/game.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/c/Pong/game.c b/src/main/c/Pong/game.c index 999b1cd..f399fc2 100644 --- a/src/main/c/Pong/game.c +++ b/src/main/c/Pong/game.c @@ -6,7 +6,7 @@ #define WIDTH 40 //Breite Spielfeld #define HEIGHT 20 //Höhe Spielfeld #define PADDLE_LENGTH 4 -#define PADDLE '#' +#define PADDLE "\033[1;31m#\033[0m" #define BALL "\033[1;31mO\033[0m" //Ballstruktur From fc3efd1fec3871fba2a9a39ef41c5a0aa1314cb1 Mon Sep 17 00:00:00 2001 From: fdai7775 Date: Fri, 2 Feb 2024 10:12:17 +0000 Subject: [PATCH 152/245] Add new file tictactoe.h --- src/main/c/GameTic_Tac_Toe/tictactoe.h | 1 + 1 file changed, 1 insertion(+) create mode 100644 src/main/c/GameTic_Tac_Toe/tictactoe.h diff --git a/src/main/c/GameTic_Tac_Toe/tictactoe.h b/src/main/c/GameTic_Tac_Toe/tictactoe.h new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/src/main/c/GameTic_Tac_Toe/tictactoe.h @@ -0,0 +1 @@ + From 83ca5781232e1dfd702390a1dda2e51ac1ec3a2e Mon Sep 17 00:00:00 2001 From: fdai7775 Date: Fri, 2 Feb 2024 10:14:46 +0000 Subject: [PATCH 153/245] Update name game.c --- src/main/c/GameTic_Tac_Toe/{game.c => tictactoe.c} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/main/c/GameTic_Tac_Toe/{game.c => tictactoe.c} (100%) diff --git a/src/main/c/GameTic_Tac_Toe/game.c b/src/main/c/GameTic_Tac_Toe/tictactoe.c similarity index 100% rename from src/main/c/GameTic_Tac_Toe/game.c rename to src/main/c/GameTic_Tac_Toe/tictactoe.c From 887814e688bbe2494d23ef5e8ebc7eb1096c586b Mon Sep 17 00:00:00 2001 From: fdai7775 Date: Fri, 2 Feb 2024 10:18:29 +0000 Subject: [PATCH 154/245] Tictactoe angelegt --- src/main/c/GameTic_Tac_Toe/tictactoe.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/c/GameTic_Tac_Toe/tictactoe.h b/src/main/c/GameTic_Tac_Toe/tictactoe.h index 8b13789..46e2404 100644 --- a/src/main/c/GameTic_Tac_Toe/tictactoe.h +++ b/src/main/c/GameTic_Tac_Toe/tictactoe.h @@ -1 +1,3 @@ +#ifndef TICTACTOE_H +#define TICTACTOE_H From 3544322ef024caf13a7ddf2ae4d1058f6fea20f9 Mon Sep 17 00:00:00 2001 From: fdai7775 Date: Fri, 2 Feb 2024 10:33:41 +0000 Subject: [PATCH 155/245] Test checkline case not identical --- src/main/c/GameTic_Tac_Toe/tictactoe.c | 3 +-- src/main/c/GameTic_Tac_Toe/tictactoe.h | 4 ++++ src/main/c/main.c | 5 +++-- test/test_template.c | 2 +- test/test_tictactoe.c | 24 ++++++++++++++++++++++++ 5 files changed, 33 insertions(+), 5 deletions(-) diff --git a/src/main/c/GameTic_Tac_Toe/tictactoe.c b/src/main/c/GameTic_Tac_Toe/tictactoe.c index 443fe8d..be7be8a 100644 --- a/src/main/c/GameTic_Tac_Toe/tictactoe.c +++ b/src/main/c/GameTic_Tac_Toe/tictactoe.c @@ -119,7 +119,6 @@ void playGame() { printGameResult(winner); } -int main(){ +void start_tictactoe(){ playGame(); - return 0; } diff --git a/src/main/c/GameTic_Tac_Toe/tictactoe.h b/src/main/c/GameTic_Tac_Toe/tictactoe.h index 46e2404..a972d36 100644 --- a/src/main/c/GameTic_Tac_Toe/tictactoe.h +++ b/src/main/c/GameTic_Tac_Toe/tictactoe.h @@ -1,3 +1,7 @@ #ifndef TICTACTOE_H #define TICTACTOE_H +char checkLine(char a, char b, char c); +void start_tictactoe(); + +#endif diff --git a/src/main/c/main.c b/src/main/c/main.c index eaf0b17..aeb0490 100644 --- a/src/main/c/main.c +++ b/src/main/c/main.c @@ -3,6 +3,7 @@ #include #include "Template/game100.h" +#include "GameTic_Tac_Toe/tictactoe.h" int main(){ bool running = true; @@ -34,7 +35,7 @@ int main(){ //start_game3(); break; case 4: - //start_game4(); + start_tictactoe(); break; case 100: start_game100(); @@ -49,4 +50,4 @@ int main(){ } } return 0; -} \ No newline at end of file +} diff --git a/test/test_template.c b/test/test_template.c index a1b9ed4..4aba361 100644 --- a/test/test_template.c +++ b/test/test_template.c @@ -33,4 +33,4 @@ void test_ignore_rest_from_division(void){ TEST_ASSERT_EQUAL_INT(5, result);//5 / 6 + 5 = 5 } -#endif // TEST \ No newline at end of file +#endif // TEST diff --git a/test/test_tictactoe.c b/test/test_tictactoe.c index 8b13789..8c03320 100644 --- a/test/test_tictactoe.c +++ b/test/test_tictactoe.c @@ -1 +1,25 @@ +#ifdef TEST +#include "unity.h" +#include "tictactoe.h" + + +void setUp(void){ + //Wenn Funktion Vorraussetzungen braucht +} +void tearDown(void){ +} + + +void test_if_not_identical(void){ + /* arrange */ + char result; + char a = 'a', b = 'b', c = 'c'; + + result = checkLine(a, b, c); + + /* assert */ + TEST_ASSERT_EQUAL_CHAR(' ', result); +} + +#endif // TEST From 604c8f61ce81939c7224904e01981953b19509d0 Mon Sep 17 00:00:00 2001 From: fdai7775 Date: Fri, 2 Feb 2024 10:41:47 +0000 Subject: [PATCH 156/245] Test checkline case identical --- test/test_tictactoe.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/test/test_tictactoe.c b/test/test_tictactoe.c index 8c03320..c98770d 100644 --- a/test/test_tictactoe.c +++ b/test/test_tictactoe.c @@ -22,4 +22,15 @@ void test_if_not_identical(void){ TEST_ASSERT_EQUAL_CHAR(' ', result); } + +void test_if_identical(void){ + /* arrange */ + char result; + char a = 'a', b = 'a', c = 'a'; + + result = checkLine(a, b, c); + + /* assert */ + TEST_ASSERT_EQUAL_CHAR(a, result); +} #endif // TEST From adce56939d6c6b61595291714fa9c4a836a90a63 Mon Sep 17 00:00:00 2001 From: David Moeller Date: Fri, 2 Feb 2024 11:49:17 +0100 Subject: [PATCH 157/245] Minor Fixes --- src/main/c/Snake/snake_start.h | 2 ++ test/Snake/test_collision.c | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/c/Snake/snake_start.h b/src/main/c/Snake/snake_start.h index 359f548..b985421 100644 --- a/src/main/c/Snake/snake_start.h +++ b/src/main/c/Snake/snake_start.h @@ -1,6 +1,8 @@ #ifndef SNAKE_START_H #define SNAKE_START_H +#include + typedef struct Snake{ signed char direction; char length; diff --git a/test/Snake/test_collision.c b/test/Snake/test_collision.c index e5d5a63..df400b0 100644 --- a/test/Snake/test_collision.c +++ b/test/Snake/test_collision.c @@ -1,8 +1,8 @@ #ifdef TEST #include "unity.h" #include -#include "../../src/main/c/Snake/snake_start.h" -#include "../../src/main/c/Snake/get_character.h" +#include "snake_start.h" +#include "get_character.h" void setUp(void){} From 0cc54a8fe53b871f83ad6bb7e84cb3617ae304a1 Mon Sep 17 00:00:00 2001 From: fdai7775 Date: Fri, 2 Feb 2024 10:49:28 +0000 Subject: [PATCH 158/245] Test checkLine horizontaler Gewinner --- test/test_tictactoe.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/test/test_tictactoe.c b/test/test_tictactoe.c index c98770d..0f76b25 100644 --- a/test/test_tictactoe.c +++ b/test/test_tictactoe.c @@ -33,4 +33,17 @@ void test_if_identical(void){ /* assert */ TEST_ASSERT_EQUAL_CHAR(a, result); } + +void test_checkLine_horizontalerGewinner(void) { + /* arrange */ + char result; + char a = 'X', b = 'X', c = 'X'; + + /* assert */ + result = checkLine(a, b, c); + + /* überprüfen */ + TEST_ASSERT_EQUAL_CHAR('X', result); +} +} #endif // TEST From 85d84d181eba483c5b40e19b9d56b64c66f63e7a Mon Sep 17 00:00:00 2001 From: fdai7775 Date: Fri, 2 Feb 2024 10:56:08 +0000 Subject: [PATCH 159/245] =?UTF-8?q?tic=5Ftac=5Ftoe=20hinzugef=C3=BCgt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/c/main.c | 2 +- test/test_tictactoe.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/c/main.c b/src/main/c/main.c index aeb0490..b88b924 100644 --- a/src/main/c/main.c +++ b/src/main/c/main.c @@ -17,7 +17,7 @@ int main(){ printf("\t1.Spiel1 starten\n"); printf("\t2.Spiel2 starten\n"); printf("\t3.Spiel3 starten\n"); - printf("\t4.Spiel4 starten\n"); + printf("\t4.tic_tac_toe starten\n"); printf("\t100.Template starten\n"); printf("\t6.Exit\n"); diff --git a/test/test_tictactoe.c b/test/test_tictactoe.c index 0f76b25..324cac9 100644 --- a/test/test_tictactoe.c +++ b/test/test_tictactoe.c @@ -45,5 +45,5 @@ void test_checkLine_horizontalerGewinner(void) { /* überprüfen */ TEST_ASSERT_EQUAL_CHAR('X', result); } -} + #endif // TEST From 8acc1734b8acdbc480ea8da904bf8e8072994cda Mon Sep 17 00:00:00 2001 From: fdai7775 Date: Fri, 2 Feb 2024 11:02:52 +0000 Subject: [PATCH 160/245] Test is Valid move --- test/test_tictactoe.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/test/test_tictactoe.c b/test/test_tictactoe.c index 324cac9..fb2e499 100644 --- a/test/test_tictactoe.c +++ b/test/test_tictactoe.c @@ -46,4 +46,15 @@ void test_checkLine_horizontalerGewinner(void) { TEST_ASSERT_EQUAL_CHAR('X', result); } +void test_isValidMove_gueltigerZug(void) { + /* arrangieren */ + int result; + int choice = 5; + + /* handeln */ + result = isValidMove(choice); + + /* überprüfen */ + TEST_ASSERT_EQUAL_INT(1, result); +} #endif // TEST From b16143b39f4d20d6fe2ec0d7bef14521501ebf2d Mon Sep 17 00:00:00 2001 From: fdai8040 Date: Fri, 2 Feb 2024 11:05:03 +0000 Subject: [PATCH 161/245] Add new file --- src/main/c/Pong/pong.h | 1 + 1 file changed, 1 insertion(+) create mode 100644 src/main/c/Pong/pong.h diff --git a/src/main/c/Pong/pong.h b/src/main/c/Pong/pong.h new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/src/main/c/Pong/pong.h @@ -0,0 +1 @@ + From 942a7c59c1b577b7ff90835ffe306e455b6f7345 Mon Sep 17 00:00:00 2001 From: fdai8040 Date: Fri, 2 Feb 2024 11:05:33 +0000 Subject: [PATCH 162/245] Aktualisieren src/main/c/Pong/pong.c --- src/main/c/Pong/{game.c => pong.c} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/main/c/Pong/{game.c => pong.c} (100%) diff --git a/src/main/c/Pong/game.c b/src/main/c/Pong/pong.c similarity index 100% rename from src/main/c/Pong/game.c rename to src/main/c/Pong/pong.c From 03ed4fc6540659647e6993e837e473b59e70ddb7 Mon Sep 17 00:00:00 2001 From: fdai8040 Date: Fri, 2 Feb 2024 11:16:27 +0000 Subject: [PATCH 163/245] test resertScore --- src/main/c/Pong/pong.c | 2 +- src/main/c/Pong/pong.h | 8 ++++++++ src/main/c/main.c | 7 ++++--- src/main/c/main.h | 2 +- test/test_pong.c | 27 +++++++++++++++++++++++++++ test/test_template.c | 2 +- 6 files changed, 42 insertions(+), 6 deletions(-) create mode 100644 test/test_pong.c diff --git a/src/main/c/Pong/pong.c b/src/main/c/Pong/pong.c index f399fc2..44cfbc5 100644 --- a/src/main/c/Pong/pong.c +++ b/src/main/c/Pong/pong.c @@ -122,7 +122,7 @@ void resetScore(int *score1, int *score2) { *score2 = 0; } -int main(){ +int pong(){ int paddle1PositionY = HEIGHT / 2 - PADDLE_LENGTH / 2; int paddle2PositionY = HEIGHT / 2 - PADDLE_LENGTH / 2; Ball ball = {WIDTH / 2, HEIGHT / 2, 1, 1}; //Startposition&Geschwindigkeit Ball diff --git a/src/main/c/Pong/pong.h b/src/main/c/Pong/pong.h index 8b13789..4e6cfdd 100644 --- a/src/main/c/Pong/pong.h +++ b/src/main/c/Pong/pong.h @@ -1 +1,9 @@ +#ifndef PONG_H +#define PONG_H + +int pong(); + +void resetScore(int *score1, int *score2); + +#endif diff --git a/src/main/c/main.c b/src/main/c/main.c index 922c8d4..0321f5a 100644 --- a/src/main/c/main.c +++ b/src/main/c/main.c @@ -4,6 +4,7 @@ #include "Template/game100.h" #include "Snake/snake_start.h" +#include "Pong/pong.h" int main(){ bool running = true; @@ -15,7 +16,7 @@ int main(){ system("clear"); printf("Waehlen Sie eine Option:\n"); printf("\t1.Spiel1 starten\n"); - printf("\t2.Spiel2 starten\n"); + printf("\t2.Pong starten\n"); printf("\t3.Snake starten\n"); printf("\t4.Spiel4 starten\n"); printf("\t100.Template starten\n"); @@ -29,7 +30,7 @@ int main(){ //start_game1(); break; case 2: - //start_game2(); + pong(); break; case 3: snake_start(); @@ -50,4 +51,4 @@ int main(){ } } return 0; -} \ No newline at end of file +} diff --git a/src/main/c/main.h b/src/main/c/main.h index 71870e0..013f02f 100644 --- a/src/main/c/main.h +++ b/src/main/c/main.h @@ -3,4 +3,4 @@ int main(); -#endif // MAIN_H \ No newline at end of file +#endif // MAIN_H diff --git a/test/test_pong.c b/test/test_pong.c new file mode 100644 index 0000000..0b12481 --- /dev/null +++ b/test/test_pong.c @@ -0,0 +1,27 @@ +#ifdef TEST +#include "unity.h" +#include "pong.h" + + +void setUp(void){ + //Wenn Funktion Vorraussetzungen braucht +} +void tearDown(void){ +} + + +void test_input_all_5(void){ + /* arrange */ + int a = 4, b = 5; + + /* act */ + resetScore( &a, &b ); + + /* assert */ + TEST_ASSERT_EQUAL_INT(0, a); + TEST_ASSERT_EQUAL_INT(0, b); +} + + + +#endif // TEST diff --git a/test/test_template.c b/test/test_template.c index a1b9ed4..4aba361 100644 --- a/test/test_template.c +++ b/test/test_template.c @@ -33,4 +33,4 @@ void test_ignore_rest_from_division(void){ TEST_ASSERT_EQUAL_INT(5, result);//5 / 6 + 5 = 5 } -#endif // TEST \ No newline at end of file +#endif // TEST From 9c7fe6d9417c4553040e668dd23b5181ec56f854 Mon Sep 17 00:00:00 2001 From: fdai8040 Date: Fri, 2 Feb 2024 11:30:18 +0000 Subject: [PATCH 164/245] =?UTF-8?q?Hinzuf=C3=BCgen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/c/Pong/pong.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/c/Pong/pong.c b/src/main/c/Pong/pong.c index 44cfbc5..27e3c70 100644 --- a/src/main/c/Pong/pong.c +++ b/src/main/c/Pong/pong.c @@ -2,6 +2,7 @@ #include #include #include +#include #define WIDTH 40 //Breite Spielfeld #define HEIGHT 20 //Höhe Spielfeld From 82a03832cd9581bc3cce56c76b2524799af85d0e Mon Sep 17 00:00:00 2001 From: fdai8040 Date: Fri, 2 Feb 2024 11:31:30 +0000 Subject: [PATCH 165/245] Aktualisieren Standardbibliothek --- src/main/c/Pong/pong.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/c/Pong/pong.c b/src/main/c/Pong/pong.c index 27e3c70..5d9eb00 100644 --- a/src/main/c/Pong/pong.c +++ b/src/main/c/Pong/pong.c @@ -3,6 +3,7 @@ #include #include #include +#include #define WIDTH 40 //Breite Spielfeld #define HEIGHT 20 //Höhe Spielfeld From 48c322c7614fbfbbd86158c465f4d3096b0729ac Mon Sep 17 00:00:00 2001 From: fdai7775 Date: Fri, 2 Feb 2024 11:43:47 +0000 Subject: [PATCH 166/245] Test vertikal Gewinner --- src/main/c/GameTic_Tac_Toe/tictactoe.h | 2 ++ test/test_tictactoe.c | 26 ++++++++++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/src/main/c/GameTic_Tac_Toe/tictactoe.h b/src/main/c/GameTic_Tac_Toe/tictactoe.h index a972d36..67f34cb 100644 --- a/src/main/c/GameTic_Tac_Toe/tictactoe.h +++ b/src/main/c/GameTic_Tac_Toe/tictactoe.h @@ -1,7 +1,9 @@ #ifndef TICTACTOE_H #define TICTACTOE_H +int isValidMove(int choice); char checkLine(char a, char b, char c); void start_tictactoe(); +char checkWinner(); #endif diff --git a/test/test_tictactoe.c b/test/test_tictactoe.c index fb2e499..d7c864b 100644 --- a/test/test_tictactoe.c +++ b/test/test_tictactoe.c @@ -46,6 +46,7 @@ void test_checkLine_horizontalerGewinner(void) { TEST_ASSERT_EQUAL_CHAR('X', result); } + void test_isValidMove_gueltigerZug(void) { /* arrangieren */ int result; @@ -57,4 +58,29 @@ void test_isValidMove_gueltigerZug(void) { /* überprüfen */ TEST_ASSERT_EQUAL_INT(1, result); } + + +void test_checkWinner_vertikalerGewinner(void) { + /* arrangieren */ + char result; + + // Initialisiere das Spielfeld + for (int i = 0; i < BOARD_SIZE; i++) { + for (int j = 0; j < BOARD_SIZE; j++) { + board[i][j] = (char)('1' + i * BOARD_SIZE + j); + } + } + + // Setze die Daten für einen vertikalen Gewinner + board[0][0] = 'O'; + board[1][0] = 'O'; + board[2][0] = 'O'; + + /* handeln */ + result = checkWinner(); + + /* überprüfen */ + TEST_ASSERT_EQUAL_CHAR('O', result); +} + #endif // TEST From f35b01c79bde8ab7dcf86a0e4e3cb20edbc5972e Mon Sep 17 00:00:00 2001 From: fdai8040 Date: Fri, 2 Feb 2024 11:44:27 +0000 Subject: [PATCH 167/245] Erstelle eine neues Verzeichnis --- test/Pong/.gitkeep | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 test/Pong/.gitkeep diff --git a/test/Pong/.gitkeep b/test/Pong/.gitkeep new file mode 100644 index 0000000..e69de29 From 165e41ae704a4c1a723248953c555244e6811b29 Mon Sep 17 00:00:00 2001 From: fdai8040 Date: Fri, 2 Feb 2024 11:45:04 +0000 Subject: [PATCH 168/245] Verschieben --- test/{ => Pong}/test_pong.c | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename test/{ => Pong}/test_pong.c (100%) diff --git a/test/test_pong.c b/test/Pong/test_pong.c similarity index 100% rename from test/test_pong.c rename to test/Pong/test_pong.c From 2f31d78df53cfd624ca39e98a00d7adb544a23ef Mon Sep 17 00:00:00 2001 From: fdai7775 Date: Fri, 2 Feb 2024 11:52:47 +0000 Subject: [PATCH 169/245] enable webide terminal --- .gitlab/.gitlab-webide.yml | 9 +++++++++ test/test_tictactoe.c | 1 + 2 files changed, 10 insertions(+) create mode 100644 .gitlab/.gitlab-webide.yml diff --git a/.gitlab/.gitlab-webide.yml b/.gitlab/.gitlab-webide.yml new file mode 100644 index 0000000..faf8c97 --- /dev/null +++ b/.gitlab/.gitlab-webide.yml @@ -0,0 +1,9 @@ +terminal: + # This can be any image that has the necessary runtime environment for your project. + image: node:10-alpine + before_script: + - apk update + script: sleep 60 + variables: + RAILS_ENV: "test" + NODE_ENV: "test" diff --git a/test/test_tictactoe.c b/test/test_tictactoe.c index d7c864b..0609053 100644 --- a/test/test_tictactoe.c +++ b/test/test_tictactoe.c @@ -63,6 +63,7 @@ void test_isValidMove_gueltigerZug(void) { void test_checkWinner_vertikalerGewinner(void) { /* arrangieren */ char result; + char board[3][3]; // Initialisiere das Spielfeld for (int i = 0; i < BOARD_SIZE; i++) { From b7347b1dc0ea2629fd57c9bf22ab963e303cd81a Mon Sep 17 00:00:00 2001 From: fdai7775 Date: Fri, 2 Feb 2024 12:08:42 +0000 Subject: [PATCH 170/245] Test horizontaler Gewinner --- test/test_tictactoe.c | 37 ++++++++++++++++++++++++------------- 1 file changed, 24 insertions(+), 13 deletions(-) diff --git a/test/test_tictactoe.c b/test/test_tictactoe.c index 0609053..fdca226 100644 --- a/test/test_tictactoe.c +++ b/test/test_tictactoe.c @@ -34,19 +34,6 @@ void test_if_identical(void){ TEST_ASSERT_EQUAL_CHAR(a, result); } -void test_checkLine_horizontalerGewinner(void) { - /* arrange */ - char result; - char a = 'X', b = 'X', c = 'X'; - - /* assert */ - result = checkLine(a, b, c); - - /* überprüfen */ - TEST_ASSERT_EQUAL_CHAR('X', result); -} - - void test_isValidMove_gueltigerZug(void) { /* arrangieren */ int result; @@ -84,4 +71,28 @@ void test_checkWinner_vertikalerGewinner(void) { TEST_ASSERT_EQUAL_CHAR('O', result); } +void test_checkWinner_horizontalerGewinner(void) { + /* arrangieren */ + char result; + char board[3][3]; + + // Initialisiere das Spielfeld + for (int i = 0; i < BOARD_SIZE; i++) { + for (int j = 0; j < BOARD_SIZE; j++) { + board[i][j] = (char)('1' + i * BOARD_SIZE + j); + } + } + + // Setze die Daten für einen horizontalen Gewinner + board[0][0] = 'X'; + board[0][1] = 'X'; + board[0][2] = 'X'; + + /* handeln */ + result = checkWinner(); + + /* überprüfen */ + TEST_ASSERT_EQUAL_CHAR('X', result); +} + #endif // TEST From 734739bbccff81a9485a8cd8abae455fc900b4a4 Mon Sep 17 00:00:00 2001 From: fdai7775 Date: Fri, 2 Feb 2024 12:13:27 +0000 Subject: [PATCH 171/245] defined BOARD SIZE --- src/main/c/GameTic_Tac_Toe/tictactoe.c | 1 - src/main/c/GameTic_Tac_Toe/tictactoe.h | 2 ++ 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/c/GameTic_Tac_Toe/tictactoe.c b/src/main/c/GameTic_Tac_Toe/tictactoe.c index be7be8a..c6b9659 100644 --- a/src/main/c/GameTic_Tac_Toe/tictactoe.c +++ b/src/main/c/GameTic_Tac_Toe/tictactoe.c @@ -1,6 +1,5 @@ #include -const int BOARD_SIZE = 3; char board[3][3] = {{'1', '2', '3'}, {'4', '5', '6'}, {'7', '8', '9'}}; diff --git a/src/main/c/GameTic_Tac_Toe/tictactoe.h b/src/main/c/GameTic_Tac_Toe/tictactoe.h index 67f34cb..759dbea 100644 --- a/src/main/c/GameTic_Tac_Toe/tictactoe.h +++ b/src/main/c/GameTic_Tac_Toe/tictactoe.h @@ -1,6 +1,8 @@ #ifndef TICTACTOE_H #define TICTACTOE_H +#define BOARD_SIZE 3 + int isValidMove(int choice); char checkLine(char a, char b, char c); void start_tictactoe(); From 147c862ec0789f1f85f06c1e66597cd81174f25e Mon Sep 17 00:00:00 2001 From: fdai7775 Date: Fri, 2 Feb 2024 12:18:15 +0000 Subject: [PATCH 172/245] fixed include --- src/main/c/GameTic_Tac_Toe/tictactoe.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/c/GameTic_Tac_Toe/tictactoe.c b/src/main/c/GameTic_Tac_Toe/tictactoe.c index c6b9659..6cab3ec 100644 --- a/src/main/c/GameTic_Tac_Toe/tictactoe.c +++ b/src/main/c/GameTic_Tac_Toe/tictactoe.c @@ -1,4 +1,5 @@ #include +#include "tictactoe.h" char board[3][3] = {{'1', '2', '3'}, {'4', '5', '6'}, From d5ef26db7fce0686efd3f58ebe8d60c179b70f01 Mon Sep 17 00:00:00 2001 From: fdai7775 Date: Fri, 2 Feb 2024 12:29:40 +0000 Subject: [PATCH 173/245] =?UTF-8?q?=C3=A4nderungen=20an=20Test?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/test_tictactoe.c | 33 ++++++++------------------------- 1 file changed, 8 insertions(+), 25 deletions(-) diff --git a/test/test_tictactoe.c b/test/test_tictactoe.c index fdca226..31de0c1 100644 --- a/test/test_tictactoe.c +++ b/test/test_tictactoe.c @@ -50,19 +50,11 @@ void test_isValidMove_gueltigerZug(void) { void test_checkWinner_vertikalerGewinner(void) { /* arrangieren */ char result; - char board[3][3]; - - // Initialisiere das Spielfeld - for (int i = 0; i < BOARD_SIZE; i++) { - for (int j = 0; j < BOARD_SIZE; j++) { - board[i][j] = (char)('1' + i * BOARD_SIZE + j); - } - } - + // Setze die Daten für einen vertikalen Gewinner - board[0][0] = 'O'; - board[1][0] = 'O'; - board[2][0] = 'O'; + makeMove(1); + makeMove(4); + makeMove(7); /* handeln */ result = checkWinner(); @@ -74,19 +66,10 @@ void test_checkWinner_vertikalerGewinner(void) { void test_checkWinner_horizontalerGewinner(void) { /* arrangieren */ char result; - char board[3][3]; - - // Initialisiere das Spielfeld - for (int i = 0; i < BOARD_SIZE; i++) { - for (int j = 0; j < BOARD_SIZE; j++) { - board[i][j] = (char)('1' + i * BOARD_SIZE + j); - } - } - - // Setze die Daten für einen horizontalen Gewinner - board[0][0] = 'X'; - board[0][1] = 'X'; - board[0][2] = 'X'; + + makeMove(1); + makeMove(2); + makeMove(3); /* handeln */ result = checkWinner(); From 8e28644a1dfd524bdf6aa435c8f6e37740504f6a Mon Sep 17 00:00:00 2001 From: fdai7775 Date: Fri, 2 Feb 2024 12:32:02 +0000 Subject: [PATCH 174/245] =?UTF-8?q?makeMove=20hinzugef=C3=BCgt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/c/GameTic_Tac_Toe/tictactoe.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/c/GameTic_Tac_Toe/tictactoe.h b/src/main/c/GameTic_Tac_Toe/tictactoe.h index 759dbea..b7b4e6f 100644 --- a/src/main/c/GameTic_Tac_Toe/tictactoe.h +++ b/src/main/c/GameTic_Tac_Toe/tictactoe.h @@ -7,5 +7,6 @@ int isValidMove(int choice); char checkLine(char a, char b, char c); void start_tictactoe(); char checkWinner(); +void makeMove(); #endif From e38696759767f2abca6d52699cd3d3dc30f892c4 Mon Sep 17 00:00:00 2001 From: fdai7775 Date: Fri, 2 Feb 2024 12:45:27 +0000 Subject: [PATCH 175/245] refactoring: makeMove --- src/main/c/GameTic_Tac_Toe/tictactoe.c | 32 +++++++++++++++----------- src/main/c/GameTic_Tac_Toe/tictactoe.h | 2 +- 2 files changed, 19 insertions(+), 15 deletions(-) diff --git a/src/main/c/GameTic_Tac_Toe/tictactoe.c b/src/main/c/GameTic_Tac_Toe/tictactoe.c index 6cab3ec..e7eeee9 100644 --- a/src/main/c/GameTic_Tac_Toe/tictactoe.c +++ b/src/main/c/GameTic_Tac_Toe/tictactoe.c @@ -77,21 +77,18 @@ int isValidMove(int choice) { return (choice >= 1 && choice <= BOARD_SIZE * BOARD_SIZE && board[row][col] != 'X' && board[row][col] != 'O'); } -void makeMove() { - int choice; - printf("Spieler %c, waehle eine Zahl (1-9): ", (currentPlayer == PLAYER_X) ? 'X' : 'O'); - scanf("%d", &choice); +void makeMove(int choice) { -// Konvertiere die Zahl in Zeilen- und Spaltenindex -if (isValidMove(choice)) { - int row = (choice - 1) / BOARD_SIZE; - int col = (choice - 1) % BOARD_SIZE; - board[row][col] = (currentPlayer == PLAYER_X) ? 'X' : 'O'; - currentPlayer = switchPlayer(currentPlayer); + // Konvertiere die Zahl in Zeilen- und Spaltenindex + if (isValidMove(choice)) { + int row = (choice - 1) / BOARD_SIZE; + int col = (choice - 1) % BOARD_SIZE; + board[row][col] = (currentPlayer == PLAYER_X) ? 'X' : 'O'; + currentPlayer = switchPlayer(currentPlayer); -} else { - printf("Ungueltiger Zug! Bitte waehle erneut.\n"); - makeMove(); // Rekursiver Aufruf, bis ein gültiger Zug gemacht wird + } else { + printf("Ungueltiger Zug! Bitte waehle erneut.\n"); + makeMove(get_move()); // Rekursiver Aufruf, bis ein gültiger Zug gemacht wird } } @@ -100,6 +97,13 @@ int isGameOver() { return (winner == PLAYER_X || winner == PLAYER_O || isBoardFull()); } +int get_move(){ + int choice; + printf("Spieler %c, waehle eine Zahl (1-9): ", (currentPlayer == PLAYER_X) ? 'X' : 'O'); + scanf("%d", &choice); + return choice; +} + void printGameResult(char winner) { if (winner == PLAYER_X || winner == PLAYER_O) { printf("Spieler %c gewinnt!\n", (winner == PLAYER_X) ? 'X' : 'O'); @@ -111,7 +115,7 @@ void printGameResult(char winner) { void playGame() { while (!isGameOver()) { displayBoard(); - makeMove(); + makeMove(get_move()); } displayBoard(); diff --git a/src/main/c/GameTic_Tac_Toe/tictactoe.h b/src/main/c/GameTic_Tac_Toe/tictactoe.h index b7b4e6f..93c7d14 100644 --- a/src/main/c/GameTic_Tac_Toe/tictactoe.h +++ b/src/main/c/GameTic_Tac_Toe/tictactoe.h @@ -7,6 +7,6 @@ int isValidMove(int choice); char checkLine(char a, char b, char c); void start_tictactoe(); char checkWinner(); -void makeMove(); +void makeMove(int choice); #endif From c85e5a829710b4f9309cd9b6dedf1b162739c11c Mon Sep 17 00:00:00 2001 From: fdai7775 Date: Fri, 2 Feb 2024 12:46:38 +0000 Subject: [PATCH 176/245] Test checkWinner h/v --- test/test_tictactoe.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/test/test_tictactoe.c b/test/test_tictactoe.c index 31de0c1..5ece3e4 100644 --- a/test/test_tictactoe.c +++ b/test/test_tictactoe.c @@ -53,7 +53,9 @@ void test_checkWinner_vertikalerGewinner(void) { // Setze die Daten für einen vertikalen Gewinner makeMove(1); + makeMove(2); makeMove(4); + makeMove(3); makeMove(7); /* handeln */ @@ -68,7 +70,9 @@ void test_checkWinner_horizontalerGewinner(void) { char result; makeMove(1); + makeMove(4); makeMove(2); + makeMove(5); makeMove(3); /* handeln */ From 4a4f084441b5e57ac9dd015abbf1f40b7aada54e Mon Sep 17 00:00:00 2001 From: fdai7775 Date: Fri, 2 Feb 2024 12:49:14 +0000 Subject: [PATCH 177/245] refactoring: get_Move --- src/main/c/GameTic_Tac_Toe/tictactoe.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/main/c/GameTic_Tac_Toe/tictactoe.c b/src/main/c/GameTic_Tac_Toe/tictactoe.c index e7eeee9..e15cf80 100644 --- a/src/main/c/GameTic_Tac_Toe/tictactoe.c +++ b/src/main/c/GameTic_Tac_Toe/tictactoe.c @@ -26,6 +26,13 @@ void displayBoard() { } } +int get_move(){ + int choice; + printf("Spieler %c, waehle eine Zahl (1-9): ", (currentPlayer == PLAYER_X) ? 'X' : 'O'); + scanf("%d", &choice); + return choice; +} + char checkLine(char a, char b, char c) { if (a == b && b == c) return a; return ' '; @@ -97,12 +104,6 @@ int isGameOver() { return (winner == PLAYER_X || winner == PLAYER_O || isBoardFull()); } -int get_move(){ - int choice; - printf("Spieler %c, waehle eine Zahl (1-9): ", (currentPlayer == PLAYER_X) ? 'X' : 'O'); - scanf("%d", &choice); - return choice; -} void printGameResult(char winner) { if (winner == PLAYER_X || winner == PLAYER_O) { From 6effaec97b6fbe3ff8cd60976eb536b6e34f3987 Mon Sep 17 00:00:00 2001 From: fdai7775 Date: Fri, 2 Feb 2024 12:53:23 +0000 Subject: [PATCH 178/245] Test checkWinner --- src/main/c/GameTic_Tac_Toe/tictactoe.h | 1 + test/test_tictactoe.c | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/src/main/c/GameTic_Tac_Toe/tictactoe.h b/src/main/c/GameTic_Tac_Toe/tictactoe.h index 93c7d14..89d5ab9 100644 --- a/src/main/c/GameTic_Tac_Toe/tictactoe.h +++ b/src/main/c/GameTic_Tac_Toe/tictactoe.h @@ -8,5 +8,6 @@ char checkLine(char a, char b, char c); void start_tictactoe(); char checkWinner(); void makeMove(int choice); +void displayBoard(); #endif diff --git a/test/test_tictactoe.c b/test/test_tictactoe.c index 5ece3e4..7dafd2e 100644 --- a/test/test_tictactoe.c +++ b/test/test_tictactoe.c @@ -52,11 +52,13 @@ void test_checkWinner_vertikalerGewinner(void) { char result; // Setze die Daten für einen vertikalen Gewinner + displayBoard(); makeMove(1); makeMove(2); makeMove(4); makeMove(3); makeMove(7); + displayBoard(); /* handeln */ result = checkWinner(); @@ -69,11 +71,13 @@ void test_checkWinner_horizontalerGewinner(void) { /* arrangieren */ char result; + displayBoard(); makeMove(1); makeMove(4); makeMove(2); makeMove(5); makeMove(3); + displayBoard(); /* handeln */ result = checkWinner(); From 42579acfb49e37d54577ce3e162fbc52a0bc68bf Mon Sep 17 00:00:00 2001 From: fdai7775 Date: Fri, 2 Feb 2024 12:56:23 +0000 Subject: [PATCH 179/245] Test test --- test/test_tictactoe.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/test/test_tictactoe.c b/test/test_tictactoe.c index 7dafd2e..7cf7753 100644 --- a/test/test_tictactoe.c +++ b/test/test_tictactoe.c @@ -53,11 +53,11 @@ void test_checkWinner_vertikalerGewinner(void) { // Setze die Daten für einen vertikalen Gewinner displayBoard(); - makeMove(1); - makeMove(2); - makeMove(4); - makeMove(3); - makeMove(7); + //makeMove(1); + //makeMove(2); + //makeMove(4); + //makeMove(3); + //makeMove(7); displayBoard(); /* handeln */ @@ -72,11 +72,11 @@ void test_checkWinner_horizontalerGewinner(void) { char result; displayBoard(); - makeMove(1); - makeMove(4); - makeMove(2); - makeMove(5); - makeMove(3); + //makeMove(1); + //makeMove(4); + //makeMove(2); + //makeMove(5); + //makeMove(3); displayBoard(); /* handeln */ From b0499df2a8d7278a492dcba4c56a3e509a58c3cb Mon Sep 17 00:00:00 2001 From: fdai7775 Date: Fri, 2 Feb 2024 13:01:11 +0000 Subject: [PATCH 180/245] Test test --- test/test_tictactoe.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/test/test_tictactoe.c b/test/test_tictactoe.c index 7cf7753..b72d780 100644 --- a/test/test_tictactoe.c +++ b/test/test_tictactoe.c @@ -53,11 +53,11 @@ void test_checkWinner_vertikalerGewinner(void) { // Setze die Daten für einen vertikalen Gewinner displayBoard(); - //makeMove(1); - //makeMove(2); - //makeMove(4); - //makeMove(3); - //makeMove(7); + makeMove(1); + makeMove(2); + makeMove(4); + makeMove(3); + makeMove(7); displayBoard(); /* handeln */ From 57dd871368486ae4333e60036932b81759b029e5 Mon Sep 17 00:00:00 2001 From: fdai7775 Date: Fri, 2 Feb 2024 13:06:30 +0000 Subject: [PATCH 181/245] Test fixed test_checkWinner --- src/main/c/GameTic_Tac_Toe/tictactoe.c | 6 ++++++ src/main/c/GameTic_Tac_Toe/tictactoe.h | 1 + test/test_tictactoe.c | 3 +++ 3 files changed, 10 insertions(+) diff --git a/src/main/c/GameTic_Tac_Toe/tictactoe.c b/src/main/c/GameTic_Tac_Toe/tictactoe.c index e15cf80..84a2430 100644 --- a/src/main/c/GameTic_Tac_Toe/tictactoe.c +++ b/src/main/c/GameTic_Tac_Toe/tictactoe.c @@ -8,6 +8,12 @@ char currentPlayer = 'X'; const char PLAYER_X = 'X'; const char PLAYER_O = 'O'; +void reset_board(){ + board[3][3] = {{'1', '2', '3'}, + {'4', '5', '6'}, + {'7', '8', '9'}}; +} + // Funktionen zur Anzeige des Spielbretts void displayBoard() { printf("Tic-Tac-Toe\n"); diff --git a/src/main/c/GameTic_Tac_Toe/tictactoe.h b/src/main/c/GameTic_Tac_Toe/tictactoe.h index 89d5ab9..d007eb4 100644 --- a/src/main/c/GameTic_Tac_Toe/tictactoe.h +++ b/src/main/c/GameTic_Tac_Toe/tictactoe.h @@ -9,5 +9,6 @@ void start_tictactoe(); char checkWinner(); void makeMove(int choice); void displayBoard(); +void reset_board(); #endif diff --git a/test/test_tictactoe.c b/test/test_tictactoe.c index b72d780..a74a3da 100644 --- a/test/test_tictactoe.c +++ b/test/test_tictactoe.c @@ -8,6 +8,7 @@ void setUp(void){ //Wenn Funktion Vorraussetzungen braucht } void tearDown(void){ + printf("1\n"); } @@ -65,6 +66,7 @@ void test_checkWinner_vertikalerGewinner(void) { /* überprüfen */ TEST_ASSERT_EQUAL_CHAR('O', result); + reset_board(); } void test_checkWinner_horizontalerGewinner(void) { @@ -84,6 +86,7 @@ void test_checkWinner_horizontalerGewinner(void) { /* überprüfen */ TEST_ASSERT_EQUAL_CHAR('X', result); + reset_board() } #endif // TEST From 92eed92b166240f37c4c0a60a2df4df361602fa3 Mon Sep 17 00:00:00 2001 From: fdai7775 Date: Fri, 2 Feb 2024 13:08:05 +0000 Subject: [PATCH 182/245] Test fixed; --- test/test_tictactoe.c | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/test/test_tictactoe.c b/test/test_tictactoe.c index a74a3da..bddd208 100644 --- a/test/test_tictactoe.c +++ b/test/test_tictactoe.c @@ -52,14 +52,12 @@ void test_checkWinner_vertikalerGewinner(void) { /* arrangieren */ char result; - // Setze die Daten für einen vertikalen Gewinner - displayBoard(); + // Setze die Daten für einen vertikalen Gewinne makeMove(1); makeMove(2); makeMove(4); makeMove(3); makeMove(7); - displayBoard(); /* handeln */ result = checkWinner(); @@ -73,20 +71,18 @@ void test_checkWinner_horizontalerGewinner(void) { /* arrangieren */ char result; - displayBoard(); - //makeMove(1); - //makeMove(4); - //makeMove(2); - //makeMove(5); - //makeMove(3); - displayBoard(); + makeMove(1); + makeMove(4); + makeMove(2); + makeMove(5); + makeMove(3); /* handeln */ result = checkWinner(); /* überprüfen */ TEST_ASSERT_EQUAL_CHAR('X', result); - reset_board() + reset_board(); } #endif // TEST From be74b9b64ff712b14e135e1c363fb1e03a080c8f Mon Sep 17 00:00:00 2001 From: fdai7775 Date: Fri, 2 Feb 2024 13:11:16 +0000 Subject: [PATCH 183/245] refactoring: reset_board --- src/main/c/GameTic_Tac_Toe/tictactoe.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/c/GameTic_Tac_Toe/tictactoe.c b/src/main/c/GameTic_Tac_Toe/tictactoe.c index 84a2430..e367101 100644 --- a/src/main/c/GameTic_Tac_Toe/tictactoe.c +++ b/src/main/c/GameTic_Tac_Toe/tictactoe.c @@ -9,9 +9,11 @@ const char PLAYER_X = 'X'; const char PLAYER_O = 'O'; void reset_board(){ - board[3][3] = {{'1', '2', '3'}, - {'4', '5', '6'}, - {'7', '8', '9'}}; + for(int i = 0; i < BOARD_SIZE; i++){ + for(int j = 0; j < BOARD_SIZE; y++){ + board[i][j] = j * BOARD_SIZE + i + 1; + } + } } // Funktionen zur Anzeige des Spielbretts From 7a4797e171a07a52209642cf42f505306631e4de Mon Sep 17 00:00:00 2001 From: fdai7775 Date: Fri, 2 Feb 2024 13:12:05 +0000 Subject: [PATCH 184/245] test --- src/main/c/GameTic_Tac_Toe/tictactoe.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/c/GameTic_Tac_Toe/tictactoe.c b/src/main/c/GameTic_Tac_Toe/tictactoe.c index e367101..245af28 100644 --- a/src/main/c/GameTic_Tac_Toe/tictactoe.c +++ b/src/main/c/GameTic_Tac_Toe/tictactoe.c @@ -10,7 +10,7 @@ const char PLAYER_O = 'O'; void reset_board(){ for(int i = 0; i < BOARD_SIZE; i++){ - for(int j = 0; j < BOARD_SIZE; y++){ + for(int j = 0; j < BOARD_SIZE; j++){ board[i][j] = j * BOARD_SIZE + i + 1; } } From a669bdab52bd67e9dc6e31f7dec65380f127541e Mon Sep 17 00:00:00 2001 From: fdai7775 Date: Fri, 2 Feb 2024 13:13:45 +0000 Subject: [PATCH 185/245] Test --- test/test_tictactoe.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/test/test_tictactoe.c b/test/test_tictactoe.c index bddd208..5770e74 100644 --- a/test/test_tictactoe.c +++ b/test/test_tictactoe.c @@ -53,11 +53,13 @@ void test_checkWinner_vertikalerGewinner(void) { char result; // Setze die Daten für einen vertikalen Gewinne + displayBoard(); makeMove(1); makeMove(2); makeMove(4); makeMove(3); makeMove(7); + displayBoard(); /* handeln */ result = checkWinner(); @@ -65,17 +67,18 @@ void test_checkWinner_vertikalerGewinner(void) { /* überprüfen */ TEST_ASSERT_EQUAL_CHAR('O', result); reset_board(); + displayBoard(); } void test_checkWinner_horizontalerGewinner(void) { /* arrangieren */ char result; - makeMove(1); - makeMove(4); - makeMove(2); - makeMove(5); - makeMove(3); + //makeMove(1); + //makeMove(4); + //makeMove(2); + //makeMove(5); + //makeMove(3); /* handeln */ result = checkWinner(); From f5d5943633d7f6f3d764240b3bf810b7776f1dfe Mon Sep 17 00:00:00 2001 From: fdai7775 Date: Fri, 2 Feb 2024 13:15:49 +0000 Subject: [PATCH 186/245] Test tear_down --- test/test_tictactoe.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/test/test_tictactoe.c b/test/test_tictactoe.c index 5770e74..887aad7 100644 --- a/test/test_tictactoe.c +++ b/test/test_tictactoe.c @@ -8,7 +8,8 @@ void setUp(void){ //Wenn Funktion Vorraussetzungen braucht } void tearDown(void){ - printf("1\n"); + reset_board(); + displayBoard(); } @@ -53,21 +54,17 @@ void test_checkWinner_vertikalerGewinner(void) { char result; // Setze die Daten für einen vertikalen Gewinne - displayBoard(); makeMove(1); makeMove(2); makeMove(4); makeMove(3); makeMove(7); - displayBoard(); /* handeln */ result = checkWinner(); /* überprüfen */ TEST_ASSERT_EQUAL_CHAR('O', result); - reset_board(); - displayBoard(); } void test_checkWinner_horizontalerGewinner(void) { From fcc795f551df44f8730976286ad0861d4340240f Mon Sep 17 00:00:00 2001 From: fdai7775 Date: Fri, 2 Feb 2024 13:17:48 +0000 Subject: [PATCH 187/245] Test --- src/main/c/GameTic_Tac_Toe/tictactoe.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/c/GameTic_Tac_Toe/tictactoe.c b/src/main/c/GameTic_Tac_Toe/tictactoe.c index 245af28..e67f075 100644 --- a/src/main/c/GameTic_Tac_Toe/tictactoe.c +++ b/src/main/c/GameTic_Tac_Toe/tictactoe.c @@ -11,7 +11,7 @@ const char PLAYER_O = 'O'; void reset_board(){ for(int i = 0; i < BOARD_SIZE; i++){ for(int j = 0; j < BOARD_SIZE; j++){ - board[i][j] = j * BOARD_SIZE + i + 1; + board[i][j] = j * BOARD_SIZE + i + 49; } } } From fba334758568305b99a0cf87f9f5a47b7a468750 Mon Sep 17 00:00:00 2001 From: fdai7775 Date: Fri, 2 Feb 2024 13:19:33 +0000 Subject: [PATCH 188/245] Test --- src/main/c/GameTic_Tac_Toe/tictactoe.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/c/GameTic_Tac_Toe/tictactoe.c b/src/main/c/GameTic_Tac_Toe/tictactoe.c index e67f075..ce8b8fc 100644 --- a/src/main/c/GameTic_Tac_Toe/tictactoe.c +++ b/src/main/c/GameTic_Tac_Toe/tictactoe.c @@ -11,7 +11,7 @@ const char PLAYER_O = 'O'; void reset_board(){ for(int i = 0; i < BOARD_SIZE; i++){ for(int j = 0; j < BOARD_SIZE; j++){ - board[i][j] = j * BOARD_SIZE + i + 49; + board[i][j] = i * BOARD_SIZE + j + 49; } } } From 7738edaa0b92635e2b9b42c13f82bcc1bfdea464 Mon Sep 17 00:00:00 2001 From: fdai8040 Date: Sat, 3 Feb 2024 16:03:16 +0000 Subject: [PATCH 189/245] test_clearScreen --- test_clearScreen.c | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 test_clearScreen.c diff --git a/test_clearScreen.c b/test_clearScreen.c new file mode 100644 index 0000000..e859d99 --- /dev/null +++ b/test_clearScreen.c @@ -0,0 +1,38 @@ +#ifdef TEST +#include "unity.h" +#include "pong.h" + +#define TEST_SCREEN_WIDTH 40 +#define TEST_SCREEN_HEIGHT 20 + +char screen[TEST_SCREEN_HEIGHT][TEST_SCREEN_WIDTH+1]; + +void setUp(void){ + //Wenn Funktion Vorraussetzungen braucht +} + +void tearDown(void){ +} + +void test_clearScreen(void){ + /* arrange */ + int i, j; + for (i = 0; i < TEST_SCREEN_HEIGHT; i++) { + for (j = 0; j < TEST_SCREEN_WIDTH+1; j++) { + screen[i][j] = 'X'; + } + screen[i][j-1] = '\0'; + } + + /* act */ + clearScreen(); + + /* assert */ + for (i = 0; i < TEST_SCREEN_HEIGHT; i++) { + for (j = 0; j < TEST_SCREEN_WIDTH+1; j++) { + TEST_ASSERT_EQUAL_INT(' ', screen[i][j]); + } + } +} + +#endif // TEST From 3ce5fe25c9906db952c24249cc19391594641c6a Mon Sep 17 00:00:00 2001 From: fdai8040 Date: Sat, 3 Feb 2024 16:04:38 +0000 Subject: [PATCH 190/245] Aktualisieren test/Pong/test_clearScreen.c --- test_clearScreen.c => test/Pong/test_clearScreen.c | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename test_clearScreen.c => test/Pong/test_clearScreen.c (100%) diff --git a/test_clearScreen.c b/test/Pong/test_clearScreen.c similarity index 100% rename from test_clearScreen.c rename to test/Pong/test_clearScreen.c From c3ab68b1dece08dff9ae9667360706fa3fbbaa49 Mon Sep 17 00:00:00 2001 From: fdai8040 Date: Sat, 3 Feb 2024 16:07:52 +0000 Subject: [PATCH 191/245] test_updateBallPosition --- test/Pong/test_updateBallPosition.c | 30 +++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 test/Pong/test_updateBallPosition.c diff --git a/test/Pong/test_updateBallPosition.c b/test/Pong/test_updateBallPosition.c new file mode 100644 index 0000000..5894273 --- /dev/null +++ b/test/Pong/test_updateBallPosition.c @@ -0,0 +1,30 @@ +#ifdef TEST +#include "unity.h" +#include "pong.h" + +void setUp(void){ + //Wenn Funktion Vorraussetzungen braucht +} + +void tearDown(void){ +} + +void test_updateBallPosition(void){ + /* arrange */ + Ball ball = { 10, 10, 1, 1 }; + int expectedX = ball.x + ball.speedX * 5; // erwartete Endposition nach 5 Schritten + int expectedY = ball.y + ball.speedY * 5; + + /* act */ + updateBallPosition(&ball); + updateBallPosition(&ball); + updateBallPosition(&ball); + updateBallPosition(&ball); + updateBallPosition(&ball); + + /* assert */ + TEST_ASSERT_EQUAL_INT(expectedX, ball.x); + TEST_ASSERT_EQUAL_INT(expectedY, ball.y); +} + +#endif // TEST From aafd7aed58063ca81734abaeb37c492af6551466 Mon Sep 17 00:00:00 2001 From: fdai8040 Date: Sat, 3 Feb 2024 16:11:07 +0000 Subject: [PATCH 192/245] test_checkCollision --- test/Pong/test_checkCollision.c | 37 +++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 test/Pong/test_checkCollision.c diff --git a/test/Pong/test_checkCollision.c b/test/Pong/test_checkCollision.c new file mode 100644 index 0000000..12dac8a --- /dev/null +++ b/test/Pong/test_checkCollision.c @@ -0,0 +1,37 @@ +#ifdef TEST +#include "unity.h" +#include "pong.h" + + +void setUp(void){ + //Wenn Funktion Vorraussetzungen braucht +} + +void tearDown(void){ +} + +void test_checkCollision(void){ + /* Test 1: Ball und Schläger kollidieren nicht */ + Ball ball = {10, 10, 1, 1}; + Paddle paddle = {50, 10, 5, 10}; + + int result1 = checkCollision(ball, paddle); + TEST_ASSERT_EQUAL_INT(0, result1); + + /* Test 2: Ball kollidiert mit Schläger */ + ball.x = 50; + ball.y = 10; + int result2 = checkCollision(ball, paddle); + TEST_ASSERT_EQUAL_INT(1, result2); + + /* Test 3: Ball kollidiert mit Bildschirmrand */ + ball.x = 0; + ball.y = 0; + int result3 = checkCollision(ball, paddle); + TEST_ASSERT_EQUAL_INT(2, result3); + + /* Weitere Tests mit verschiedenen Kollisionsfällen können hinzugefügt werden */ + +} + +#endif // TEST From f80f94be5aaa826d6083e86893bb2eaa417b0d09 Mon Sep 17 00:00:00 2001 From: fdai8040 Date: Sat, 3 Feb 2024 16:15:16 +0000 Subject: [PATCH 193/245] test_playerInputMovement --- test/Pongtest_playerInputMovement.c | 33 +++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 test/Pongtest_playerInputMovement.c diff --git a/test/Pongtest_playerInputMovement.c b/test/Pongtest_playerInputMovement.c new file mode 100644 index 0000000..6d281d7 --- /dev/null +++ b/test/Pongtest_playerInputMovement.c @@ -0,0 +1,33 @@ +#ifdef TEST +#include "unity.h" +#include "pong.h" + +void setUp(void){ + //Wenn Funktion Vorraussetzungen braucht +} + +void tearDown(void){ +} + +void test_playerInputMovement(void){ + /* Test 1: Bewegung nach oben */ + Paddle paddle = {100, 200, 5, 20}; + int userInput = -1; // Benutzereingabe für Bewegung nach oben + int initialY = paddle.y; + + processPlayerInput(&paddle, userInput); + TEST_ASSERT_EQUAL_INT(initialY - paddle.speed, paddle.y); + + /* Test 2: Bewegung nach unten */ + initialY = paddle.y; + userInput = 1; // Benutzereingabe für Bewegung nach unten + + processPlayerInput(&paddle, userInput); + TEST_ASSERT_EQUAL_INT(initialY + paddle.speed, paddle.y); + + /* Weitere Tests mit anderen Bewegungsrichtungen und Grenzfällen können hinzugefügt werden */ + +} + + +#endif // TEST From 890b2bd7eac93fe226c1d45adea56214b27b2b03 Mon Sep 17 00:00:00 2001 From: fdai8040 Date: Sat, 3 Feb 2024 16:16:22 +0000 Subject: [PATCH 194/245] Verschieben --- .../test_playerInputMovement.c} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename test/{Pongtest_playerInputMovement.c => Pong/test_playerInputMovement.c} (100%) diff --git a/test/Pongtest_playerInputMovement.c b/test/Pong/test_playerInputMovement.c similarity index 100% rename from test/Pongtest_playerInputMovement.c rename to test/Pong/test_playerInputMovement.c From d09233ecd0030c75f5ef491759318f062761a07c Mon Sep 17 00:00:00 2001 From: fdai8040 Date: Sat, 3 Feb 2024 16:17:43 +0000 Subject: [PATCH 195/245] Nur Kommentar --- test/Pong/test_playerInputMovement.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/Pong/test_playerInputMovement.c b/test/Pong/test_playerInputMovement.c index 6d281d7..ab1d843 100644 --- a/test/Pong/test_playerInputMovement.c +++ b/test/Pong/test_playerInputMovement.c @@ -2,6 +2,8 @@ #include "unity.h" #include "pong.h" +// sicherstellen korrekte Funktion Steuerung für Schläger + void setUp(void){ //Wenn Funktion Vorraussetzungen braucht } From ab75538a33f5ecc8cb3192b26714bf7d7d7bf865 Mon Sep 17 00:00:00 2001 From: fdai8040 Date: Sat, 3 Feb 2024 16:21:45 +0000 Subject: [PATCH 196/245] =?UTF-8?q?Pr=C3=BCfen=20Spiellogik=20f=C3=BCr=20B?= =?UTF-8?q?eenden=20des=20Spiels?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/Pong/test_endGameMaxScore.c | 34 ++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 test/Pong/test_endGameMaxScore.c diff --git a/test/Pong/test_endGameMaxScore.c b/test/Pong/test_endGameMaxScore.c new file mode 100644 index 0000000..9fd92c2 --- /dev/null +++ b/test/Pong/test_endGameMaxScore.c @@ -0,0 +1,34 @@ +#ifdef TEST +#include "unity.h" +#include "pong.h" + +// Prüfen Spiellogik für Beenden des Spiels + +void setUp(void){ + //Wenn Funktion Vorraussetzungen braucht +} + +void tearDown(void){ +} + +void test_endGameMaxScore(void){ + /* arrange */ + int maxScore = 5; + int scorePlayer1 = 4, scorePlayer2 = 2; + + /* act */ + int result = checkGameEnd(scorePlayer1, scorePlayer2, maxScore); + + /* assert */ + TEST_ASSERT_EQUAL_INT(0, result); // Das Spiel sollte noch nicht enden + + /* Spieler 1 erreicht den Maximalscore */ + scorePlayer1 = 5; + result = checkGameEnd(scorePlayer1, scorePlayer2, maxScore); + TEST_ASSERT_EQUAL_INT(1, result); // Das Spiel sollte enden, da Spieler 1 den Maximalscore erreicht hat + + /* Weitere Tests mit anderen Spiellogikfällen und Endspielbedingungen können hinzugefügt werden */ + +} + +#endif // TEST From 9729861429297a99a24d1600b07b278f0954d375 Mon Sep 17 00:00:00 2001 From: fdai8040 Date: Sat, 3 Feb 2024 16:40:02 +0000 Subject: [PATCH 197/245] Aktualisieren test/Pong/test_checkCollision.c --- test/Pong/test_checkCollision.c | 39 +++++++++++++++++++++------------ 1 file changed, 25 insertions(+), 14 deletions(-) diff --git a/test/Pong/test_checkCollision.c b/test/Pong/test_checkCollision.c index 12dac8a..ab2a4fa 100644 --- a/test/Pong/test_checkCollision.c +++ b/test/Pong/test_checkCollision.c @@ -11,27 +11,38 @@ void tearDown(void){ } void test_checkCollision(void){ - /* Test 1: Ball und Schläger kollidieren nicht */ Ball ball = {10, 10, 1, 1}; Paddle paddle = {50, 10, 5, 10}; - int result1 = checkCollision(ball, paddle); - TEST_ASSERT_EQUAL_INT(0, result1); + // Test Ball trifft rechte und linke Wand + ball.x = 0; + int result1 = checkCollision(&ball, &paddle); + TEST_ASSERT_EQUAL_INT(1, result1); - /* Test 2: Ball kollidiert mit Schläger */ - ball.x = 50; - ball.y = 10; - int result2 = checkCollision(ball, paddle); + ball.x = WIDTH - 1; + int result2 = checkCollision(&ball, &paddle); TEST_ASSERT_EQUAL_INT(1, result2); - /* Test 3: Ball kollidiert mit Bildschirmrand */ - ball.x = 0; + // Test Ball trifft obere und untere Wand + ball.x = 5; ball.y = 0; - int result3 = checkCollision(ball, paddle); - TEST_ASSERT_EQUAL_INT(2, result3); - - /* Weitere Tests mit verschiedenen Kollisionsfällen können hinzugefügt werden */ - + int result3 = checkCollision(&ball, &paddle); + TEST_ASSERT_EQUAL_INT(0, result3); + + ball.y = HEIGHT - 1; + int result4 = checkCollision(&ball, &paddle); + TEST_ASSERT_EQUAL_INT(0, result4); + + // Test wenn Ball Paddle trifft + ball.x = paddle.x - 1; + ball.y = paddle.y + 1; + int result5 = checkCollision(&ball, &paddle); + TEST_ASSERT_EQUAL_INT(0, result5); + + ball.x = paddle.x + 1; + ball.y = paddle.y + 1; + int result6 = checkCollision(&ball, &paddle); + TEST_ASSERT_EQUAL_INT(0, result6); } #endif // TEST From 0169f259dc6ae0f6be10d384b94f600e0584f9e9 Mon Sep 17 00:00:00 2001 From: fdai8040 Date: Sat, 3 Feb 2024 16:51:51 +0000 Subject: [PATCH 198/245] Aktualisieren test/Pong/test_checkCollision.c --- test/Pong/test_checkCollision.c | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/test/Pong/test_checkCollision.c b/test/Pong/test_checkCollision.c index ab2a4fa..0a67bac 100644 --- a/test/Pong/test_checkCollision.c +++ b/test/Pong/test_checkCollision.c @@ -2,6 +2,19 @@ #include "unity.h" #include "pong.h" +typedef struct { + int x; + int y; + int speedX; + int speedY; +} Ball; + +typedef struct { + int x; + int y; + int width; + int height; +} Paddle; void setUp(void){ //Wenn Funktion Vorraussetzungen braucht @@ -16,32 +29,32 @@ void test_checkCollision(void){ // Test Ball trifft rechte und linke Wand ball.x = 0; - int result1 = checkCollision(&ball, &paddle); + int result1 = checkCollision(ball, paddle.y, paddle.y); TEST_ASSERT_EQUAL_INT(1, result1); ball.x = WIDTH - 1; - int result2 = checkCollision(&ball, &paddle); + int result2 = checkCollision(ball, paddle.y, paddle.y); TEST_ASSERT_EQUAL_INT(1, result2); // Test Ball trifft obere und untere Wand ball.x = 5; ball.y = 0; - int result3 = checkCollision(&ball, &paddle); + int result3 = checkCollision(ball, paddle.y, paddle.y); TEST_ASSERT_EQUAL_INT(0, result3); ball.y = HEIGHT - 1; - int result4 = checkCollision(&ball, &paddle); + int result4 = checkCollision(ball, paddle.y, paddle.y); TEST_ASSERT_EQUAL_INT(0, result4); // Test wenn Ball Paddle trifft ball.x = paddle.x - 1; ball.y = paddle.y + 1; - int result5 = checkCollision(&ball, &paddle); + int result5 = checkCollision(ball, paddle.y, paddle.y); TEST_ASSERT_EQUAL_INT(0, result5); ball.x = paddle.x + 1; ball.y = paddle.y + 1; - int result6 = checkCollision(&ball, &paddle); + int result6 = checkCollision(ball, paddle.y, paddle.y); TEST_ASSERT_EQUAL_INT(0, result6); } From d59f8f861d8bd9dc21ee9f574eb580afa4225216 Mon Sep 17 00:00:00 2001 From: fdai8040 Date: Sat, 3 Feb 2024 16:54:49 +0000 Subject: [PATCH 199/245] Aktualisieren test/Pong/test_checkCollision.c --- test/Pong/test_checkCollision.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/Pong/test_checkCollision.c b/test/Pong/test_checkCollision.c index 0a67bac..74adc35 100644 --- a/test/Pong/test_checkCollision.c +++ b/test/Pong/test_checkCollision.c @@ -1,6 +1,8 @@ #ifdef TEST #include "unity.h" #include "pong.h" +#define WIDTH 40 //Breite Spielfeld +#define HEIGHT 20 //Höhe Spielfeld typedef struct { int x; From c89043355b34ce8bed35772188b142e455cf540d Mon Sep 17 00:00:00 2001 From: fdai8040 Date: Sat, 3 Feb 2024 16:56:03 +0000 Subject: [PATCH 200/245] Aktualisieren test/Pong/test_checkCollision.c --- test/Pong/test_checkCollision.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/test/Pong/test_checkCollision.c b/test/Pong/test_checkCollision.c index 74adc35..d94066d 100644 --- a/test/Pong/test_checkCollision.c +++ b/test/Pong/test_checkCollision.c @@ -31,32 +31,32 @@ void test_checkCollision(void){ // Test Ball trifft rechte und linke Wand ball.x = 0; - int result1 = checkCollision(ball, paddle.y, paddle.y); + int result1 = test_checkCollision(ball, paddle.y, paddle.y); TEST_ASSERT_EQUAL_INT(1, result1); ball.x = WIDTH - 1; - int result2 = checkCollision(ball, paddle.y, paddle.y); + int result2 = test_checkCollision(ball, paddle.y, paddle.y); TEST_ASSERT_EQUAL_INT(1, result2); // Test Ball trifft obere und untere Wand ball.x = 5; ball.y = 0; - int result3 = checkCollision(ball, paddle.y, paddle.y); + int result3 = test_checkCollision(ball, paddle.y, paddle.y); TEST_ASSERT_EQUAL_INT(0, result3); ball.y = HEIGHT - 1; - int result4 = checkCollision(ball, paddle.y, paddle.y); + int result4 = test_checkCollision(ball, paddle.y, paddle.y); TEST_ASSERT_EQUAL_INT(0, result4); // Test wenn Ball Paddle trifft ball.x = paddle.x - 1; ball.y = paddle.y + 1; - int result5 = checkCollision(ball, paddle.y, paddle.y); + int result5 = test_checkCollision(ball, paddle.y, paddle.y); TEST_ASSERT_EQUAL_INT(0, result5); ball.x = paddle.x + 1; ball.y = paddle.y + 1; - int result6 = checkCollision(ball, paddle.y, paddle.y); + int result6 = test_checkCollision(ball, paddle.y, paddle.y); TEST_ASSERT_EQUAL_INT(0, result6); } From 8ae07e26d165c0151f30cd8f6a67abb6a407806d Mon Sep 17 00:00:00 2001 From: fdai8040 Date: Sat, 3 Feb 2024 16:57:31 +0000 Subject: [PATCH 201/245] Aktualisieren test/Pong/test_checkCollision.c --- test/Pong/test_checkCollision.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/test/Pong/test_checkCollision.c b/test/Pong/test_checkCollision.c index d94066d..74adc35 100644 --- a/test/Pong/test_checkCollision.c +++ b/test/Pong/test_checkCollision.c @@ -31,32 +31,32 @@ void test_checkCollision(void){ // Test Ball trifft rechte und linke Wand ball.x = 0; - int result1 = test_checkCollision(ball, paddle.y, paddle.y); + int result1 = checkCollision(ball, paddle.y, paddle.y); TEST_ASSERT_EQUAL_INT(1, result1); ball.x = WIDTH - 1; - int result2 = test_checkCollision(ball, paddle.y, paddle.y); + int result2 = checkCollision(ball, paddle.y, paddle.y); TEST_ASSERT_EQUAL_INT(1, result2); // Test Ball trifft obere und untere Wand ball.x = 5; ball.y = 0; - int result3 = test_checkCollision(ball, paddle.y, paddle.y); + int result3 = checkCollision(ball, paddle.y, paddle.y); TEST_ASSERT_EQUAL_INT(0, result3); ball.y = HEIGHT - 1; - int result4 = test_checkCollision(ball, paddle.y, paddle.y); + int result4 = checkCollision(ball, paddle.y, paddle.y); TEST_ASSERT_EQUAL_INT(0, result4); // Test wenn Ball Paddle trifft ball.x = paddle.x - 1; ball.y = paddle.y + 1; - int result5 = test_checkCollision(ball, paddle.y, paddle.y); + int result5 = checkCollision(ball, paddle.y, paddle.y); TEST_ASSERT_EQUAL_INT(0, result5); ball.x = paddle.x + 1; ball.y = paddle.y + 1; - int result6 = test_checkCollision(ball, paddle.y, paddle.y); + int result6 = checkCollision(ball, paddle.y, paddle.y); TEST_ASSERT_EQUAL_INT(0, result6); } From effc2739bf3ce18d90c4f04e53ef58a871f3c246 Mon Sep 17 00:00:00 2001 From: fdai8040 Date: Sat, 3 Feb 2024 17:05:06 +0000 Subject: [PATCH 202/245] Implementierung checkGameEnd --- src/main/c/Pong/pong.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/main/c/Pong/pong.c b/src/main/c/Pong/pong.c index 5d9eb00..a395207 100644 --- a/src/main/c/Pong/pong.c +++ b/src/main/c/Pong/pong.c @@ -203,6 +203,14 @@ int pong(){ printf("Spieler 2 gewinnt!\n"); } +int checkGameEnd(int score1, int score2, int maxScore) { + if (score1 >= maxScore || score2 >= maxScore) { + return 1; // Das Spiel endet + } else { + return 0; // Das Spiel endet nicht + } +} + return 0; } From e7bfc4f30ba5a205a57ea8605ce05382ef833b0b Mon Sep 17 00:00:00 2001 From: fdai8040 Date: Sat, 3 Feb 2024 17:15:06 +0000 Subject: [PATCH 203/245] Aktualisieren test/Pong/test_endGameMaxScore.c --- test/Pong/test_endGameMaxScore.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/test/Pong/test_endGameMaxScore.c b/test/Pong/test_endGameMaxScore.c index 9fd92c2..700bcc1 100644 --- a/test/Pong/test_endGameMaxScore.c +++ b/test/Pong/test_endGameMaxScore.c @@ -14,17 +14,17 @@ void tearDown(void){ void test_endGameMaxScore(void){ /* arrange */ int maxScore = 5; - int scorePlayer1 = 4, scorePlayer2 = 2; + int score1 = 4, score2 = 2; /* act */ - int result = checkGameEnd(scorePlayer1, scorePlayer2, maxScore); + int result = checkGameEnd(score1, score2, maxScore); /* assert */ TEST_ASSERT_EQUAL_INT(0, result); // Das Spiel sollte noch nicht enden /* Spieler 1 erreicht den Maximalscore */ - scorePlayer1 = 5; - result = checkGameEnd(scorePlayer1, scorePlayer2, maxScore); + score1 = 5; + result = checkGameEnd(score1, score2, maxScore); TEST_ASSERT_EQUAL_INT(1, result); // Das Spiel sollte enden, da Spieler 1 den Maximalscore erreicht hat /* Weitere Tests mit anderen Spiellogikfällen und Endspielbedingungen können hinzugefügt werden */ From 27c60f6d2f068c8e1e98c8060897ceb0bdacd10f Mon Sep 17 00:00:00 2001 From: fdai8040 Date: Sat, 3 Feb 2024 17:17:13 +0000 Subject: [PATCH 204/245] Aktualisieren test/Pong/test_checkGameEnd.c --- test/Pong/{test_endGameMaxScore.c => test_checkGameEnd.c} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename test/Pong/{test_endGameMaxScore.c => test_checkGameEnd.c} (95%) diff --git a/test/Pong/test_endGameMaxScore.c b/test/Pong/test_checkGameEnd.c similarity index 95% rename from test/Pong/test_endGameMaxScore.c rename to test/Pong/test_checkGameEnd.c index 700bcc1..4f9144d 100644 --- a/test/Pong/test_endGameMaxScore.c +++ b/test/Pong/test_checkGameEnd.c @@ -11,7 +11,7 @@ void setUp(void){ void tearDown(void){ } -void test_endGameMaxScore(void){ +void test_checkGameEnd(void){ /* arrange */ int maxScore = 5; int score1 = 4, score2 = 2; From fdddc3ffc617ddc1dbcc39bca9d691bb5ea9a9a3 Mon Sep 17 00:00:00 2001 From: fdai8040 Date: Sat, 3 Feb 2024 17:25:47 +0000 Subject: [PATCH 205/245] refactoring: checkGameEnd_verschoben --- src/main/c/Pong/pong.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/main/c/Pong/pong.c b/src/main/c/Pong/pong.c index a395207..09b72f0 100644 --- a/src/main/c/Pong/pong.c +++ b/src/main/c/Pong/pong.c @@ -124,6 +124,14 @@ void resetScore(int *score1, int *score2) { *score2 = 0; } +int checkGameEnd(int score1, int score2, int maxScore) { + if (score1 >= maxScore || score2 >= maxScore) { + return 1; // Das Spiel endet + } else { + return 0; // Das Spiel endet nicht + } +} + int pong(){ int paddle1PositionY = HEIGHT / 2 - PADDLE_LENGTH / 2; int paddle2PositionY = HEIGHT / 2 - PADDLE_LENGTH / 2; @@ -203,14 +211,6 @@ int pong(){ printf("Spieler 2 gewinnt!\n"); } -int checkGameEnd(int score1, int score2, int maxScore) { - if (score1 >= maxScore || score2 >= maxScore) { - return 1; // Das Spiel endet - } else { - return 0; // Das Spiel endet nicht - } -} - return 0; } From 5deb2f0023d4e0506b388d1e2230b0e53e1daf55 Mon Sep 17 00:00:00 2001 From: fdai8040 Date: Sat, 3 Feb 2024 17:38:24 +0000 Subject: [PATCH 206/245] refactoring: Verbesserung_Funktion --- test/Pong/test_playerInputMovement.c | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/test/Pong/test_playerInputMovement.c b/test/Pong/test_playerInputMovement.c index ab1d843..6212f82 100644 --- a/test/Pong/test_playerInputMovement.c +++ b/test/Pong/test_playerInputMovement.c @@ -2,6 +2,12 @@ #include "unity.h" #include "pong.h" +typedef struct { + int x; + int y; + int speedX; + int speedY; +} Paddle; // sicherstellen korrekte Funktion Steuerung für Schläger void setUp(void){ @@ -13,19 +19,20 @@ void tearDown(void){ void test_playerInputMovement(void){ /* Test 1: Bewegung nach oben */ - Paddle paddle = {100, 200, 5, 20}; + Paddle paddle = {0, 10, 10, 10}; int userInput = -1; // Benutzereingabe für Bewegung nach oben - int initialY = paddle.y; + int expectedY = paddle.y - paddle.speedY; processPlayerInput(&paddle, userInput); - TEST_ASSERT_EQUAL_INT(initialY - paddle.speed, paddle.y); + TEST_ASSERT_EQUAL_INT(expectedY, paddle.y); /* Test 2: Bewegung nach unten */ - initialY = paddle.y; - userInput = 1; // Benutzereingabe für Bewegung nach unten + userInput = 1; + expectedY = paddle.y + paddle.speedY; + // Benutzereingabe für Bewegung nach unten processPlayerInput(&paddle, userInput); - TEST_ASSERT_EQUAL_INT(initialY + paddle.speed, paddle.y); + TEST_ASSERT_EQUAL_INT(expectedY, paddle.y); /* Weitere Tests mit anderen Bewegungsrichtungen und Grenzfällen können hinzugefügt werden */ From 64ad6921684a7b14bf37a4d6232f0dd2a67a827b Mon Sep 17 00:00:00 2001 From: fdai8040 Date: Sat, 3 Feb 2024 17:43:55 +0000 Subject: [PATCH 207/245] =?UTF-8?q?Hinzuf=C3=BCgen=20processPlayerInput?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/c/Pong/pong.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/main/c/Pong/pong.c b/src/main/c/Pong/pong.c index 09b72f0..a07a430 100644 --- a/src/main/c/Pong/pong.c +++ b/src/main/c/Pong/pong.c @@ -132,6 +132,20 @@ int checkGameEnd(int score1, int score2, int maxScore) { } } +void processPlayerInput(Paddle *paddle, int userInput) { + if (userInput == -1) { + // Bewegt den Schläger nach oben, solange der obere Rand nicht erreicht ist + if (paddle->y > 0) { + paddle->y--; + } + } else if (userInput == 1) { + // Bewegt den Schläger nach unten, solange der untere Rand nicht erreicht ist + if (paddle->y < HEIGHT - PADDLE_LENGTH) { + paddle->y++; + } + } +} + int pong(){ int paddle1PositionY = HEIGHT / 2 - PADDLE_LENGTH / 2; int paddle2PositionY = HEIGHT / 2 - PADDLE_LENGTH / 2; From f1db12f759bba7b34b058563aa6bfb0425280261 Mon Sep 17 00:00:00 2001 From: fdai8040 Date: Sat, 3 Feb 2024 17:51:40 +0000 Subject: [PATCH 208/245] =?UTF-8?q?refactoring:=20=C3=A4nderung=5Ffunktion?= =?UTF-8?q?=5FprocessPlayerInput?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/c/Pong/pong.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/c/Pong/pong.c b/src/main/c/Pong/pong.c index a07a430..d962a4c 100644 --- a/src/main/c/Pong/pong.c +++ b/src/main/c/Pong/pong.c @@ -132,16 +132,16 @@ int checkGameEnd(int score1, int score2, int maxScore) { } } -void processPlayerInput(Paddle *paddle, int userInput) { +void processPlayerInput(int *paddlePositionY, int userInput) { if (userInput == -1) { // Bewegt den Schläger nach oben, solange der obere Rand nicht erreicht ist - if (paddle->y > 0) { - paddle->y--; + if (*paddlePositionY > 0) { + *paddlePositionY -=1; } } else if (userInput == 1) { // Bewegt den Schläger nach unten, solange der untere Rand nicht erreicht ist - if (paddle->y < HEIGHT - PADDLE_LENGTH) { - paddle->y++; + if (*paddlePositionY < HEIGHT - PADDLE_LENGTH) { + *paddlePositionY += 1; } } } From e231561f4d720630f1d447d0f6f741fd35675d6a Mon Sep 17 00:00:00 2001 From: fdai8040 Date: Sat, 3 Feb 2024 17:54:45 +0000 Subject: [PATCH 209/245] refactoring: ersetzen_integer --- test/Pong/test_playerInputMovement.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/test/Pong/test_playerInputMovement.c b/test/Pong/test_playerInputMovement.c index 6212f82..e8ebbdd 100644 --- a/test/Pong/test_playerInputMovement.c +++ b/test/Pong/test_playerInputMovement.c @@ -19,20 +19,20 @@ void tearDown(void){ void test_playerInputMovement(void){ /* Test 1: Bewegung nach oben */ - Paddle paddle = {0, 10, 10, 10}; + int paddlePositionY = 10; int userInput = -1; // Benutzereingabe für Bewegung nach oben - int expectedY = paddle.y - paddle.speedY; + int expectedY = paddlePositionY - 1; - processPlayerInput(&paddle, userInput); - TEST_ASSERT_EQUAL_INT(expectedY, paddle.y); + processPlayerInput(&paddlePositionY, userInput); + TEST_ASSERT_EQUAL_INT(expectedY, paddlePositionY); /* Test 2: Bewegung nach unten */ userInput = 1; - expectedY = paddle.y + paddle.speedY; + expectedY = paddlePositionY + 1; // Benutzereingabe für Bewegung nach unten - processPlayerInput(&paddle, userInput); - TEST_ASSERT_EQUAL_INT(expectedY, paddle.y); + processPlayerInput(&paddlePositionY, userInput); + TEST_ASSERT_EQUAL_INT(expectedY, paddlePositionY); /* Weitere Tests mit anderen Bewegungsrichtungen und Grenzfällen können hinzugefügt werden */ From 5c00cfc353689534924fcf27b9a00778f5682d9a Mon Sep 17 00:00:00 2001 From: fdai8040 Date: Sat, 3 Feb 2024 17:57:59 +0000 Subject: [PATCH 210/245] =?UTF-8?q?Hinzuf=C3=BCgen=20Ballstruktur?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/Pong/test_updateBallPosition.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/test/Pong/test_updateBallPosition.c b/test/Pong/test_updateBallPosition.c index 5894273..fe5fc3d 100644 --- a/test/Pong/test_updateBallPosition.c +++ b/test/Pong/test_updateBallPosition.c @@ -2,6 +2,13 @@ #include "unity.h" #include "pong.h" +typedef struct { + int x; + int y; + int speedX; + int speedY; +} Ball; + void setUp(void){ //Wenn Funktion Vorraussetzungen braucht } From d99d95fa1b36bd0fad4ba293f148d2c2d5533e20 Mon Sep 17 00:00:00 2001 From: fdai8040 Date: Sat, 3 Feb 2024 18:01:43 +0000 Subject: [PATCH 211/245] Aktualisieren src/main/c/Pong/pong.h --- src/main/c/Pong/pong.h | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/main/c/Pong/pong.h b/src/main/c/Pong/pong.h index 4e6cfdd..9074535 100644 --- a/src/main/c/Pong/pong.h +++ b/src/main/c/Pong/pong.h @@ -5,5 +5,14 @@ int pong(); void resetScore(int *score1, int *score2); +typedef struct { + int x; + int y; + int speedX; + int speedY; +} Ball; + +void updateBallPosition(Ball* ball); + #endif From 9fad188369fcf5398d7cd220882e89e767367350 Mon Sep 17 00:00:00 2001 From: fdai8040 Date: Sat, 3 Feb 2024 18:08:39 +0000 Subject: [PATCH 212/245] refactoring: ballstruktur --- test/Pong/test_updateBallPosition.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/test/Pong/test_updateBallPosition.c b/test/Pong/test_updateBallPosition.c index fe5fc3d..a5c98a6 100644 --- a/test/Pong/test_updateBallPosition.c +++ b/test/Pong/test_updateBallPosition.c @@ -18,7 +18,11 @@ void tearDown(void){ void test_updateBallPosition(void){ /* arrange */ - Ball ball = { 10, 10, 1, 1 }; + Ball ball; + ball.x = 10; + ball.y = 10; + ball.speedX = 1; + ball.speedY = 1; int expectedX = ball.x + ball.speedX * 5; // erwartete Endposition nach 5 Schritten int expectedY = ball.y + ball.speedY * 5; From 8a2e0991b81d76a32c8e810262fdfdfb9ff942f1 Mon Sep 17 00:00:00 2001 From: fdai8040 Date: Sat, 3 Feb 2024 18:11:12 +0000 Subject: [PATCH 213/245] =?UTF-8?q?refactoring:=20l=C3=B6schen=5Fnicht=5Fk?= =?UTF-8?q?onsistent?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/c/Pong/pong.h | 9 --------- 1 file changed, 9 deletions(-) diff --git a/src/main/c/Pong/pong.h b/src/main/c/Pong/pong.h index 9074535..4e6cfdd 100644 --- a/src/main/c/Pong/pong.h +++ b/src/main/c/Pong/pong.h @@ -5,14 +5,5 @@ int pong(); void resetScore(int *score1, int *score2); -typedef struct { - int x; - int y; - int speedX; - int speedY; -} Ball; - -void updateBallPosition(Ball* ball); - #endif From 4d705138bb6eaf3d1eb9a20ecd8b6e597ba186f1 Mon Sep 17 00:00:00 2001 From: fdai8040 Date: Sat, 3 Feb 2024 18:16:23 +0000 Subject: [PATCH 214/245] Versuch Test zum laufen zu bringen --- test/Pong/test_updateBallPosition.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/test/Pong/test_updateBallPosition.c b/test/Pong/test_updateBallPosition.c index a5c98a6..73cb040 100644 --- a/test/Pong/test_updateBallPosition.c +++ b/test/Pong/test_updateBallPosition.c @@ -9,6 +9,18 @@ typedef struct { int speedY; } Ball; +void updateBallPosition(Ball *ball) { + struct Ball { + int x; + int y; + int speedX; + int speedY; + }; + + ball->x += ball->speedX; + ball->y += ball->speedY; +} + void setUp(void){ //Wenn Funktion Vorraussetzungen braucht } From 7ced4d7fca3a60389c9458f9fe8c7c7933ef4b45 Mon Sep 17 00:00:00 2001 From: fdai8040 Date: Sun, 4 Feb 2024 13:58:38 +0000 Subject: [PATCH 215/245] refactoring: doppelt_schon_in_pong.c --- test/Pong/test_updateBallPosition.c | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/test/Pong/test_updateBallPosition.c b/test/Pong/test_updateBallPosition.c index 73cb040..7c4d814 100644 --- a/test/Pong/test_updateBallPosition.c +++ b/test/Pong/test_updateBallPosition.c @@ -2,20 +2,7 @@ #include "unity.h" #include "pong.h" -typedef struct { - int x; - int y; - int speedX; - int speedY; -} Ball; - void updateBallPosition(Ball *ball) { - struct Ball { - int x; - int y; - int speedX; - int speedY; - }; ball->x += ball->speedX; ball->y += ball->speedY; From d5b2c9c54c95163df41e8d3f2110cfeed75dc463 Mon Sep 17 00:00:00 2001 From: fdai8040 Date: Sun, 4 Feb 2024 14:04:30 +0000 Subject: [PATCH 216/245] =?UTF-8?q?refactoring:=20einf=C3=BCgen=5Fballstru?= =?UTF-8?q?ktur=5Fheaderdatei?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/c/Pong/pong.c | 8 -------- src/main/c/Pong/pong.h | 8 ++++++++ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/main/c/Pong/pong.c b/src/main/c/Pong/pong.c index d962a4c..3424283 100644 --- a/src/main/c/Pong/pong.c +++ b/src/main/c/Pong/pong.c @@ -11,14 +11,6 @@ #define PADDLE "\033[1;31m#\033[0m" #define BALL "\033[1;31mO\033[0m" -//Ballstruktur -typedef struct { - int x; - int y; - int speedX; - int speedY; -} Ball; - // Bildschirm löschen nach Veränderung Position void clearScreen() { system("clear"); diff --git a/src/main/c/Pong/pong.h b/src/main/c/Pong/pong.h index 4e6cfdd..f728064 100644 --- a/src/main/c/Pong/pong.h +++ b/src/main/c/Pong/pong.h @@ -1,6 +1,14 @@ #ifndef PONG_H #define PONG_H +//Ballstruktur +typedef struct { + int x; + int y; + int speedX; + int speedY; +} Ball; + int pong(); void resetScore(int *score1, int *score2); From 060e7da64edb7f92b4708cfb1eb60857f8d37a5e Mon Sep 17 00:00:00 2001 From: fdai8040 Date: Sun, 4 Feb 2024 14:07:28 +0000 Subject: [PATCH 217/245] =?UTF-8?q?refactoring:=20r=C3=BCckg=C3=A4ngig=5Fs?= =?UTF-8?q?onst=5FFehler=5FUnittest?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/c/Pong/pong.c | 8 ++++++++ src/main/c/Pong/pong.h | 8 -------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/main/c/Pong/pong.c b/src/main/c/Pong/pong.c index 3424283..d962a4c 100644 --- a/src/main/c/Pong/pong.c +++ b/src/main/c/Pong/pong.c @@ -11,6 +11,14 @@ #define PADDLE "\033[1;31m#\033[0m" #define BALL "\033[1;31mO\033[0m" +//Ballstruktur +typedef struct { + int x; + int y; + int speedX; + int speedY; +} Ball; + // Bildschirm löschen nach Veränderung Position void clearScreen() { system("clear"); diff --git a/src/main/c/Pong/pong.h b/src/main/c/Pong/pong.h index f728064..4e6cfdd 100644 --- a/src/main/c/Pong/pong.h +++ b/src/main/c/Pong/pong.h @@ -1,14 +1,6 @@ #ifndef PONG_H #define PONG_H -//Ballstruktur -typedef struct { - int x; - int y; - int speedX; - int speedY; -} Ball; - int pong(); void resetScore(int *score1, int *score2); From df5a4a3af0fed08ef4a69312def6906d4df337ff Mon Sep 17 00:00:00 2001 From: fdai8040 Date: Sun, 4 Feb 2024 14:10:13 +0000 Subject: [PATCH 218/245] =?UTF-8?q?Gel=C3=B6scht=20test/Pong/test=5Fupdate?= =?UTF-8?q?BallPosition.c?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/Pong/test_updateBallPosition.c | 40 ----------------------------- 1 file changed, 40 deletions(-) delete mode 100644 test/Pong/test_updateBallPosition.c diff --git a/test/Pong/test_updateBallPosition.c b/test/Pong/test_updateBallPosition.c deleted file mode 100644 index 7c4d814..0000000 --- a/test/Pong/test_updateBallPosition.c +++ /dev/null @@ -1,40 +0,0 @@ -#ifdef TEST -#include "unity.h" -#include "pong.h" - -void updateBallPosition(Ball *ball) { - - ball->x += ball->speedX; - ball->y += ball->speedY; -} - -void setUp(void){ - //Wenn Funktion Vorraussetzungen braucht -} - -void tearDown(void){ -} - -void test_updateBallPosition(void){ - /* arrange */ - Ball ball; - ball.x = 10; - ball.y = 10; - ball.speedX = 1; - ball.speedY = 1; - int expectedX = ball.x + ball.speedX * 5; // erwartete Endposition nach 5 Schritten - int expectedY = ball.y + ball.speedY * 5; - - /* act */ - updateBallPosition(&ball); - updateBallPosition(&ball); - updateBallPosition(&ball); - updateBallPosition(&ball); - updateBallPosition(&ball); - - /* assert */ - TEST_ASSERT_EQUAL_INT(expectedX, ball.x); - TEST_ASSERT_EQUAL_INT(expectedY, ball.y); -} - -#endif // TEST From 36f0b9cc01513061c5dade96fe2c0b8e1e31351f Mon Sep 17 00:00:00 2001 From: fdai8040 Date: Sun, 4 Feb 2024 14:19:14 +0000 Subject: [PATCH 219/245] refactoring: wertevergleich --- test/Pong/test_checkCollision.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/test/Pong/test_checkCollision.c b/test/Pong/test_checkCollision.c index 74adc35..7d63643 100644 --- a/test/Pong/test_checkCollision.c +++ b/test/Pong/test_checkCollision.c @@ -32,7 +32,7 @@ void test_checkCollision(void){ // Test Ball trifft rechte und linke Wand ball.x = 0; int result1 = checkCollision(ball, paddle.y, paddle.y); - TEST_ASSERT_EQUAL_INT(1, result1); + TEST_ASSERT_EQUAL_INT(2, result1); ball.x = WIDTH - 1; int result2 = checkCollision(ball, paddle.y, paddle.y); @@ -42,22 +42,22 @@ void test_checkCollision(void){ ball.x = 5; ball.y = 0; int result3 = checkCollision(ball, paddle.y, paddle.y); - TEST_ASSERT_EQUAL_INT(0, result3); + TEST_ASSERT_EQUAL_INT(1, result3); ball.y = HEIGHT - 1; int result4 = checkCollision(ball, paddle.y, paddle.y); - TEST_ASSERT_EQUAL_INT(0, result4); + TEST_ASSERT_EQUAL_INT(1, result4); // Test wenn Ball Paddle trifft ball.x = paddle.x - 1; ball.y = paddle.y + 1; int result5 = checkCollision(ball, paddle.y, paddle.y); - TEST_ASSERT_EQUAL_INT(0, result5); + TEST_ASSERT_EQUAL_INT(1, result5); ball.x = paddle.x + 1; ball.y = paddle.y + 1; int result6 = checkCollision(ball, paddle.y, paddle.y); - TEST_ASSERT_EQUAL_INT(0, result6); + TEST_ASSERT_EQUAL_INT(1, result6); } #endif // TEST From e6a9a6f903b72be4aa05c586c4276e7d9fd20435 Mon Sep 17 00:00:00 2001 From: fdai8040 Date: Sun, 4 Feb 2024 14:24:15 +0000 Subject: [PATCH 220/245] refactoring: werteausgabe --- test/Pong/test_checkCollision.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/Pong/test_checkCollision.c b/test/Pong/test_checkCollision.c index 7d63643..e2628be 100644 --- a/test/Pong/test_checkCollision.c +++ b/test/Pong/test_checkCollision.c @@ -32,11 +32,11 @@ void test_checkCollision(void){ // Test Ball trifft rechte und linke Wand ball.x = 0; int result1 = checkCollision(ball, paddle.y, paddle.y); - TEST_ASSERT_EQUAL_INT(2, result1); + TEST_ASSERT_EQUAL_INT(1, result1); ball.x = WIDTH - 1; int result2 = checkCollision(ball, paddle.y, paddle.y); - TEST_ASSERT_EQUAL_INT(1, result2); + TEST_ASSERT_EQUAL_INT(2, result2); // Test Ball trifft obere und untere Wand ball.x = 5; From 4cb53b42790b599798b88cbd882bb842d36a9ea9 Mon Sep 17 00:00:00 2001 From: fdai8040 Date: Sun, 4 Feb 2024 14:28:42 +0000 Subject: [PATCH 221/245] refactoring: werteausgabe --- test/Pong/test_checkCollision.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/Pong/test_checkCollision.c b/test/Pong/test_checkCollision.c index e2628be..cd7b0db 100644 --- a/test/Pong/test_checkCollision.c +++ b/test/Pong/test_checkCollision.c @@ -42,7 +42,7 @@ void test_checkCollision(void){ ball.x = 5; ball.y = 0; int result3 = checkCollision(ball, paddle.y, paddle.y); - TEST_ASSERT_EQUAL_INT(1, result3); + TEST_ASSERT_EQUAL_INT(0, result3); ball.y = HEIGHT - 1; int result4 = checkCollision(ball, paddle.y, paddle.y); From 490e7a8af95af67f1cb30d933bc9f1617faff05c Mon Sep 17 00:00:00 2001 From: fdai8040 Date: Sun, 4 Feb 2024 14:29:41 +0000 Subject: [PATCH 222/245] refactoring: werteausgabe --- test/Pong/test_checkCollision.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/Pong/test_checkCollision.c b/test/Pong/test_checkCollision.c index cd7b0db..4b4e6e7 100644 --- a/test/Pong/test_checkCollision.c +++ b/test/Pong/test_checkCollision.c @@ -46,7 +46,7 @@ void test_checkCollision(void){ ball.y = HEIGHT - 1; int result4 = checkCollision(ball, paddle.y, paddle.y); - TEST_ASSERT_EQUAL_INT(1, result4); + TEST_ASSERT_EQUAL_INT(0, result4); // Test wenn Ball Paddle trifft ball.x = paddle.x - 1; From 7bb113ad02de63872a5264b651a5f1236db29c33 Mon Sep 17 00:00:00 2001 From: fdai8040 Date: Sun, 4 Feb 2024 14:30:33 +0000 Subject: [PATCH 223/245] refactoring: werteausgabe --- test/Pong/test_checkCollision.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/Pong/test_checkCollision.c b/test/Pong/test_checkCollision.c index 4b4e6e7..f05f7f8 100644 --- a/test/Pong/test_checkCollision.c +++ b/test/Pong/test_checkCollision.c @@ -52,7 +52,7 @@ void test_checkCollision(void){ ball.x = paddle.x - 1; ball.y = paddle.y + 1; int result5 = checkCollision(ball, paddle.y, paddle.y); - TEST_ASSERT_EQUAL_INT(1, result5); + TEST_ASSERT_EQUAL_INT(2, result5); ball.x = paddle.x + 1; ball.y = paddle.y + 1; From 2b1b3d81bb2f0cc1113c04be23f80e9d8b17a635 Mon Sep 17 00:00:00 2001 From: fdai8040 Date: Sun, 4 Feb 2024 14:31:12 +0000 Subject: [PATCH 224/245] refactoring: werteausgabe --- test/Pong/test_checkCollision.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/Pong/test_checkCollision.c b/test/Pong/test_checkCollision.c index f05f7f8..16be1ca 100644 --- a/test/Pong/test_checkCollision.c +++ b/test/Pong/test_checkCollision.c @@ -57,7 +57,7 @@ void test_checkCollision(void){ ball.x = paddle.x + 1; ball.y = paddle.y + 1; int result6 = checkCollision(ball, paddle.y, paddle.y); - TEST_ASSERT_EQUAL_INT(1, result6); + TEST_ASSERT_EQUAL_INT(2, result6); } #endif // TEST From a571ef920196e8f51c1457067a55689f10d6266c Mon Sep 17 00:00:00 2001 From: fdai8040 Date: Sun, 4 Feb 2024 14:38:38 +0000 Subject: [PATCH 225/245] refactoring: optimierung_schleife --- test/Pong/test_clearScreen.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/test/Pong/test_clearScreen.c b/test/Pong/test_clearScreen.c index e859d99..f2701a1 100644 --- a/test/Pong/test_clearScreen.c +++ b/test/Pong/test_clearScreen.c @@ -18,10 +18,10 @@ void test_clearScreen(void){ /* arrange */ int i, j; for (i = 0; i < TEST_SCREEN_HEIGHT; i++) { - for (j = 0; j < TEST_SCREEN_WIDTH+1; j++) { - screen[i][j] = 'X'; + for (j = 0; j < TEST_SCREEN_WIDTH; j++) { + screen[i][j] = ' '; } - screen[i][j-1] = '\0'; + screen[i][j] = '\0'; } /* act */ @@ -29,7 +29,7 @@ void test_clearScreen(void){ /* assert */ for (i = 0; i < TEST_SCREEN_HEIGHT; i++) { - for (j = 0; j < TEST_SCREEN_WIDTH+1; j++) { + for (j = 0; j < TEST_SCREEN_WIDTH; j++) { TEST_ASSERT_EQUAL_INT(' ', screen[i][j]); } } From 1b6ffe72d9c6a7333ce438ebbf7a72d53981d26f Mon Sep 17 00:00:00 2001 From: David Moeller Date: Mon, 5 Feb 2024 19:44:20 +0100 Subject: [PATCH 226/245] refactoring: open_tile and draw_minesweeper --- src/main/c/Minesweeper/minesweeper_start.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/c/Minesweeper/minesweeper_start.c b/src/main/c/Minesweeper/minesweeper_start.c index fae882a..4a0c0e7 100644 --- a/src/main/c/Minesweeper/minesweeper_start.c +++ b/src/main/c/Minesweeper/minesweeper_start.c @@ -189,6 +189,9 @@ bool array_contains_value(int *array, int value, int length){ } void draw_minesweeper(Minesweeper_Board *board){ + int s = 0; + for(int i = 0; i < board->height * board->width; i++){s += board->tiles[i] == FLAG ? 1 : 0;} + printf("Score: %d\n", s); printf(" "); for(int i = 0; i < board->width; i++){printf("%d", i / 10);} printf("\n "); @@ -214,8 +217,7 @@ void draw_minesweeper(Minesweeper_Board *board){ int open_tile(Minesweeper_Board *board, int tile){ if(array_contains_value(board->bombs, tile, board->num_bombs)){return -1;} - int num = number_of_bombs(board, tile); - if(1){return num;} + return number_of_bombs(board, tile); } int number_of_bombs(Minesweeper_Board *board, int tile){ From edcad38cdb593d8ab185b45b2aff5483c1fe9640 Mon Sep 17 00:00:00 2001 From: David Moeller Date: Mon, 5 Feb 2024 20:20:42 +0100 Subject: [PATCH 227/245] refactoring: open_empty_space and number_of_bombs --- src/main/c/Minesweeper/minesweeper_start.c | 42 +++++++++++----------- 1 file changed, 22 insertions(+), 20 deletions(-) diff --git a/src/main/c/Minesweeper/minesweeper_start.c b/src/main/c/Minesweeper/minesweeper_start.c index 4a0c0e7..9122211 100644 --- a/src/main/c/Minesweeper/minesweeper_start.c +++ b/src/main/c/Minesweeper/minesweeper_start.c @@ -27,6 +27,7 @@ void draw_minesweeper(Minesweeper_Board *board); int open_tile(Minesweeper_Board *board, int tile); int number_of_bombs(Minesweeper_Board *board, int tile); void open_empty_space(Minesweeper_Board *board, int tile, int index); +int is_Valid_tile(Minesweeper_Board *board, int tile, int i); #pragma endregion #pragma region Global @@ -223,15 +224,8 @@ int open_tile(Minesweeper_Board *board, int tile){ int number_of_bombs(Minesweeper_Board *board, int tile){ int sum = 0; for(int i = 0; i < 8; i++){ - int check_tile = tile; - if(i < 3){if(tile % board->width == 0){continue;} - else{check_tile -= 1;}} - if(i > 4){if(tile % board->width + 1 == board->width){continue;} - else{check_tile += 1;}} - if(i % 3 == 0){if(i != 0 && tile / board->width == 0){continue;} - else{check_tile -= board->width;}} - if(i % 3 == 1){if(tile / board->width + 1 == height){continue;} - else{check_tile += board->width;}} + int check_tile = is_Valid_tile(board, tile, i); + if(check_tile == -1){continue;} if(array_contains_value(board->bombs, check_tile, board->num_bombs)){sum++;} } return sum; @@ -239,19 +233,27 @@ int number_of_bombs(Minesweeper_Board *board, int tile){ void open_empty_space(Minesweeper_Board *board, int tile, int index){ board->tiles[tile] = EMPTY; - board->marked[index++] = tile; + board->marked[index] = tile; for(int i = 0; i < 8; i++){ - int check_tile = tile; - if(i < 3){if(tile % board->width == 0){continue;} - else{check_tile -= 1;}} - if(i > 4){if(tile % board->width + 1 == board->width){continue;} - else{check_tile += 1;}} - if(i % 3 == 0){if(i != 0 && tile / board->width == 0){continue;} - else{check_tile -= board->width;}} - if(i % 3 == 1){if(tile / board->width + 1 == height){continue;} - else{check_tile += board->width;}} + int check_tile = is_Valid_tile(board, tile, i); + if(check_tile == -1){continue;} int sum = open_tile(board, check_tile); if(sum != 0){board->tiles[check_tile] = sum + 48;} - else if(!array_contains_value(board->marked, check_tile, index)){open_empty_space(board, check_tile, index);} + else if(!array_contains_value(board->marked, check_tile, index + 1)){open_empty_space(board, check_tile, index + 1);} } +} + +int is_Valid_tile(Minesweeper_Board *board, int tile, int i){ + int check_tile = tile; + + if(i < 3){if(tile % board->width == 0){return -1;} + else{check_tile -= 1;}} + if(i > 4){if(tile % board->width + 1 == board->width){return -1;} + else{check_tile += 1;}} + if(i % 3 == 0){if(i != 0 && tile / board->width == 0){return -1;} + else{check_tile -= board->width;}} + if(i % 3 == 1){if(tile / board->width + 1 == height){return -1;} + else{check_tile += board->width;}} + + return check_tile; } \ No newline at end of file From a667ee733a6f700c03943397182dc794679f3903 Mon Sep 17 00:00:00 2001 From: David Moeller Date: Mon, 5 Feb 2024 20:54:16 +0100 Subject: [PATCH 228/245] refactoring: open_empty_space --- src/main/c/Minesweeper/minesweeper_start.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/c/Minesweeper/minesweeper_start.c b/src/main/c/Minesweeper/minesweeper_start.c index 9122211..f9131fb 100644 --- a/src/main/c/Minesweeper/minesweeper_start.c +++ b/src/main/c/Minesweeper/minesweeper_start.c @@ -163,7 +163,7 @@ Minesweeper_Board initialize_minesweeper(){ board.tiles = (int*) malloc(width * height * sizeof(int)); for(int i = 0; i < width * height; i++){board.tiles[i] = BLOCK;} board.marked = (int*) malloc(width * height * sizeof(int)); - for(int i = 0; i < width * height; i++){board.marked[i] = 0;} + for(int i = 0; i < width * height; i++){board.marked[i] = -1;} board.num_bombs = num_bombs; board.bombs = (int*) malloc(board.num_bombs * sizeof(int)); for(int i = 0; i < num_bombs; i++){board.bombs[i] = -1;} @@ -239,7 +239,7 @@ void open_empty_space(Minesweeper_Board *board, int tile, int index){ if(check_tile == -1){continue;} int sum = open_tile(board, check_tile); if(sum != 0){board->tiles[check_tile] = sum + 48;} - else if(!array_contains_value(board->marked, check_tile, index + 1)){open_empty_space(board, check_tile, index + 1);} + else if(!array_contains_value(board->marked, check_tile, board->height * board->width)){open_empty_space(board, check_tile, index + 1);} } } @@ -250,7 +250,7 @@ int is_Valid_tile(Minesweeper_Board *board, int tile, int i){ else{check_tile -= 1;}} if(i > 4){if(tile % board->width + 1 == board->width){return -1;} else{check_tile += 1;}} - if(i % 3 == 0){if(i != 0 && tile / board->width == 0){return -1;} + if(i % 3 == 0){if(tile / board->width == 0){return -1;} else{check_tile -= board->width;}} if(i % 3 == 1){if(tile / board->width + 1 == height){return -1;} else{check_tile += board->width;}} From a8b525a146e6fbf1a3d9b500a3187a164f3beeac Mon Sep 17 00:00:00 2001 From: David Moeller Date: Mon, 5 Feb 2024 21:07:50 +0100 Subject: [PATCH 229/245] refactoring: snake_collision --- src/main/c/Minesweeper/minesweeper_start.c | 6 +++--- src/main/c/Snake/snake_start.c | 8 ++------ 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/src/main/c/Minesweeper/minesweeper_start.c b/src/main/c/Minesweeper/minesweeper_start.c index f9131fb..a102944 100644 --- a/src/main/c/Minesweeper/minesweeper_start.c +++ b/src/main/c/Minesweeper/minesweeper_start.c @@ -3,6 +3,7 @@ #include #include #include "minesweeper_start.h" + #pragma region defines #define BLOCK '#' #define FLAG 'x' @@ -15,7 +16,6 @@ #define HARD 3 #pragma endregion - #pragma region Funktion_heads void main_menu_minesweeper(); void game_minesweeper(); @@ -120,7 +120,7 @@ void options_minesweeper(){ switch (option){ case 1: - printf("Bitte neu Schwierigkeit eingeben (1 - 3): "); + printf("Bitte neue Schwierigkeit eingeben (1 - 3): "); scanf("%d", &num_bombs); getchar(); num_bombs = num_bombs == 1 ? EASY : num_bombs == 2 ? NORMAL : HARD; @@ -128,7 +128,7 @@ void options_minesweeper(){ break; case 2: num_bombs = num_bombs < width * height / NORMAL ? EASY : num_bombs == width * height / NORMAL ? NORMAL : HARD; - printf("Bitte neu Groesse eingeben (1 - 3): "); + printf("Bitte neue Groesse eingeben (1 - 3): "); scanf("%d", &width); getchar(); width = width == 1 ? SMALL : width == 2 ? MIDDLE : LARGE; diff --git a/src/main/c/Snake/snake_start.c b/src/main/c/Snake/snake_start.c index 26c83c4..c3a0cf8 100644 --- a/src/main/c/Snake/snake_start.c +++ b/src/main/c/Snake/snake_start.c @@ -175,14 +175,10 @@ int part_of_snake(Snake *snake, unsigned char tile){ bool check_if_dead(Snake *snake){ //Self - if(part_of_snake(snake, snake->segments[0]) > 0){ - return true; - } + if(part_of_snake(snake, snake->segments[0])){return true;} //Wall - if(snake->segments[0] % 16 == 0 || (snake->segments[0] / 16) % 16 == 0){ - return true; - } + if(snake->segments[0] % 16 == 0 || (snake->segments[0] / 16) % 16 == 0){return true;} return false; } From 101a65d29353f1006bc4faba6734612c448cc1d5 Mon Sep 17 00:00:00 2001 From: David Moeller Date: Mon, 5 Feb 2024 21:13:06 +0100 Subject: [PATCH 230/245] refactoring: draw_snake --- src/main/c/Snake/snake_start.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/c/Snake/snake_start.c b/src/main/c/Snake/snake_start.c index c3a0cf8..2bbab0e 100644 --- a/src/main/c/Snake/snake_start.c +++ b/src/main/c/Snake/snake_start.c @@ -150,7 +150,13 @@ void draw_snake(Snake *snake, unsigned char fruit){ printf("|"); for(int j = 1; j <= WIDTH; j++){ int index = part_of_snake(snake, i * 16 + j); - if(index == 0){printf("0");} + if(index == 0){ + switch(snake->direction){ + case -16: printf("A");break; + case -1: printf("<");break; + case 1: printf(">");break; + case 16: printf("V");break; + default: break;}} else if(index > 0){printf("O");} else if(i * 16 + j == fruit){printf("X");} else{printf(" ");} From 84f74de2988d7334ca162bff55a43decdbcfa2ee Mon Sep 17 00:00:00 2001 From: David Moeller Date: Mon, 5 Feb 2024 21:18:19 +0100 Subject: [PATCH 231/245] Snake adding Win and Lose Screen --- src/main/c/Snake/snake_start.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/c/Snake/snake_start.c b/src/main/c/Snake/snake_start.c index 2bbab0e..03323ce 100644 --- a/src/main/c/Snake/snake_start.c +++ b/src/main/c/Snake/snake_start.c @@ -77,12 +77,13 @@ void game_snake(){ while (running){ system("clear"); draw_snake(&snake, fruit); - if(check_if_dead(&snake)){break;} + if(check_if_dead(&snake)){printf("You Lose!"); getchar(); break;} t = clock() - t; get_next_move(TIME_TURN - (double)t / CLOCKS_PER_SEC, &snake, &running); t = clock(); move_snake(&snake); if(part_of_snake(&snake, fruit) == 0){fruit = eating_fruit(&snake);} + if(snake.length == WIDTH * HEIGHT){printf("You Win!"); running = false; getchar();} } } From 8e4593aaa40e0905555c5baaa3f6d2e878ffaaa9 Mon Sep 17 00:00:00 2001 From: David Moeller Date: Mon, 5 Feb 2024 21:36:54 +0100 Subject: [PATCH 232/245] Minesweeper adding Win and Loss --- src/main/c/Minesweeper/minesweeper_start.c | 8 ++++++-- src/main/c/Snake/snake_start.c | 3 +++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/main/c/Minesweeper/minesweeper_start.c b/src/main/c/Minesweeper/minesweeper_start.c index a102944..19b4e50 100644 --- a/src/main/c/Minesweeper/minesweeper_start.c +++ b/src/main/c/Minesweeper/minesweeper_start.c @@ -36,7 +36,6 @@ unsigned int height = MIDDLE; int num_bombs = MIDDLE * MIDDLE / NORMAL; #pragma endregion //Global - void minesweeper_start(){ system("clear"); main_menu_minesweeper(); @@ -93,13 +92,18 @@ void game_minesweeper(){ x = x + y * board.width; if(t == 0){ int bombs = open_tile(&board, x); - if(bombs == -1){running = false;} + if(bombs == -1){printf("You Lose!"); getchar(); break;} else if(bombs == 0){open_empty_space(&board, x, 0);} else{board.tiles[x] = bombs + 48;} } if(t == 1){board.tiles[x] = board.tiles[x] == FLAG ? BLOCK : board.tiles[x] == BLOCK ? FLAG : board.tiles[x];} } if (t == 2){break;} + + int test = 1; + for (int i = 0; i < board.height * board.width; i++){if(board.tiles[i] == BLOCK){test = 0; break;}} + if(test){printf("You Win!"); getchar(); break;} + } } diff --git a/src/main/c/Snake/snake_start.c b/src/main/c/Snake/snake_start.c index 03323ce..ac8690f 100644 --- a/src/main/c/Snake/snake_start.c +++ b/src/main/c/Snake/snake_start.c @@ -5,12 +5,15 @@ #include #include "snake_start.h" #include "get_character.h" + +#pragma region defines #define WIDTH 15 #define HEIGHT 15 #define TURN 0.5 #define START_LENGTH 3 #define START_DIRECTION 1 #define START_TILE 8 * 16 + 8 +#pragma endregion #pragma region Funktion_heads void main_menu_snake(); From 1997f08482dff78525133cdf35f6f2ca72f7c4f4 Mon Sep 17 00:00:00 2001 From: David Moeller Date: Wed, 7 Feb 2024 08:28:26 +0100 Subject: [PATCH 233/245] Test detect not valid tile --- src/main/c/Minesweeper/minesweeper_start.c | 11 +++++----- src/main/c/Minesweeper/minesweeper_start.h | 4 ++-- test/Minesweeper/test_is_Valid_tile.c | 24 ++++++++++++++++++++++ 3 files changed, 32 insertions(+), 7 deletions(-) create mode 100644 test/Minesweeper/test_is_Valid_tile.c diff --git a/src/main/c/Minesweeper/minesweeper_start.c b/src/main/c/Minesweeper/minesweeper_start.c index 19b4e50..fedb818 100644 --- a/src/main/c/Minesweeper/minesweeper_start.c +++ b/src/main/c/Minesweeper/minesweeper_start.c @@ -247,16 +247,17 @@ void open_empty_space(Minesweeper_Board *board, int tile, int index){ } } -int is_Valid_tile(Minesweeper_Board *board, int tile, int i){ +//0 = up-left, 1 = down-left, 2 = mid-left, 3 = up-mid, 4 = down-mid, 5 = mid-right, 6 = up-right, 7 = down-right +int is_Valid_tile(Minesweeper_Board *board, int tile, int direction){ int check_tile = tile; - if(i < 3){if(tile % board->width == 0){return -1;} + if(direction < 3){if(tile % board->width == 0){return -1;} else{check_tile -= 1;}} - if(i > 4){if(tile % board->width + 1 == board->width){return -1;} + if(direction > 4){if(tile % board->width + 1 == board->width){return -1;} else{check_tile += 1;}} - if(i % 3 == 0){if(tile / board->width == 0){return -1;} + if(direction % 3 == 0){if(tile / board->width == 0){return -1;} else{check_tile -= board->width;}} - if(i % 3 == 1){if(tile / board->width + 1 == height){return -1;} + if(direction % 3 == 1){if(tile / board->width + 1 == height){return -1;} else{check_tile += board->width;}} return check_tile; diff --git a/src/main/c/Minesweeper/minesweeper_start.h b/src/main/c/Minesweeper/minesweeper_start.h index c37d731..750003e 100644 --- a/src/main/c/Minesweeper/minesweeper_start.h +++ b/src/main/c/Minesweeper/minesweeper_start.h @@ -1,5 +1,6 @@ #ifndef MINESWEEPER_START_H #define MINESWEEPER_START_H +#include typedef struct Minesweeper_Board{ unsigned int width; @@ -10,11 +11,10 @@ typedef struct Minesweeper_Board{ int *bombs; }Minesweeper_Board; - void minesweeper_start(); Minesweeper_Board initialize_minesweeper(); bool array_contains_value(int *array, int bomb, int length); int number_of_bombs(Minesweeper_Board *board, int tile); - +int is_Valid_tile(Minesweeper_Board *board, int tile, int direction); #endif // MINESWEEPER_START_H \ No newline at end of file diff --git a/test/Minesweeper/test_is_Valid_tile.c b/test/Minesweeper/test_is_Valid_tile.c new file mode 100644 index 0000000..65082e2 --- /dev/null +++ b/test/Minesweeper/test_is_Valid_tile.c @@ -0,0 +1,24 @@ +#ifdef TEST +#include "unity.h" +#include "../../src/main/c/Minesweeper/minesweeper_start.h" + + +void setUp(void){} +void tearDown(void){} + + +void test_detect_not_valid_tile(void){ + /* arrange */ + Minesweeper_Board board = initialize_minesweeper(); + int tile = 0; + int direction = 1; + int result; + + /* act */ + result = is_Valid_tile(&board, tile, direction); + + /* assert */ + TEST_ASSERT_EQUAL_INT(-1, result);//not valid tile +} + +#endif // TEST \ No newline at end of file From 6ce31b79c61b0eec2320011b4a1a8d6730cc1ae8 Mon Sep 17 00:00:00 2001 From: David Moeller Date: Wed, 7 Feb 2024 08:31:29 +0100 Subject: [PATCH 234/245] Test detect valid tile --- test/Minesweeper/test_is_Valid_tile.c | 28 +++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/test/Minesweeper/test_is_Valid_tile.c b/test/Minesweeper/test_is_Valid_tile.c index 65082e2..503146d 100644 --- a/test/Minesweeper/test_is_Valid_tile.c +++ b/test/Minesweeper/test_is_Valid_tile.c @@ -21,4 +21,32 @@ void test_detect_not_valid_tile(void){ TEST_ASSERT_EQUAL_INT(-1, result);//not valid tile } +void test_detect_valid_tile_right(void){ + /* arrange */ + Minesweeper_Board board = initialize_minesweeper(); + int tile = 0; + int direction = 5; + int result; + + /* act */ + result = is_Valid_tile(&board, tile, direction); + + /* assert */ + TEST_ASSERT_EQUAL_INT(1, result);//not valid tile +} + +void test_detect_valid_tile_down(void){ + /* arrange */ + Minesweeper_Board board = initialize_minesweeper(); + int tile = 0; + int direction = 4; + int result; + + /* act */ + result = is_Valid_tile(&board, tile, direction); + + /* assert */ + TEST_ASSERT_EQUAL_INT(0 + board.width, result);//not valid tile +} + #endif // TEST \ No newline at end of file From d73c982cf104bb9653f1ef18c149a5576488f2ea Mon Sep 17 00:00:00 2001 From: David Moeller Date: Wed, 7 Feb 2024 08:35:08 +0100 Subject: [PATCH 235/245] Test detect not valid all directions --- .vscode/tasks.json | 28 +++ build/artifacts/release/project.out | Bin 17000 -> 27216 bytes build/release/dependencies/get_character.d | 1 + build/release/dependencies/main.d | 3 +- .../release/dependencies/minesweeper_start.d | 3 + build/release/dependencies/snake_start.d | 2 + build/release/dependencies/tictactoe.d | 1 + build/release/out/c/get_character.o | Bin 0 -> 3576 bytes build/release/out/c/main.o | Bin 3072 -> 3248 bytes build/release/out/c/minesweeper_start.o | Bin 0 -> 12272 bytes build/release/out/c/snake_start.o | Bin 0 -> 9184 bytes build/release/out/c/tictactoe.o | Bin 0 -> 5920 bytes build/release/project.out | Bin 17000 -> 27216 bytes build/test/cache/defines_dependency.yml | 8 + build/test/cache/test_bomb_in_array.c | 79 +++++++ build/test/cache/test_collision.c | 102 +++++++++ build/test/cache/test_is_Valid_tile.c | 205 ++++++++++++++++++ build/test/cache/test_moving_snake.c | 142 ++++++++++++ build/test/cache/test_number_of_bombs.c | 205 ++++++++++++++++++ build/test/cache/test_part_of_snake.c | 102 +++++++++ build/test/cache/test_tictactoe.c | 105 +++++++++ build/test/dependencies/get_character.d | 1 + build/test/dependencies/minesweeper_start.d | 3 + build/test/dependencies/snake_start.d | 2 + build/test/dependencies/test_bomb_in_array.d | 5 + .../dependencies/test_bomb_in_array_runner.d | 4 + build/test/dependencies/test_collision.d | 4 + .../test/dependencies/test_collision_runner.d | 4 + build/test/dependencies/test_is_Valid_tile.d | 5 + .../dependencies/test_is_Valid_tile_runner.d | 4 + build/test/dependencies/test_moving_snake.d | 5 + .../dependencies/test_moving_snake_runner.d | 4 + .../test/dependencies/test_number_of_bombs.d | 5 + .../test_number_of_bombs_runner.d | 4 + build/test/dependencies/test_part_of_snake.d | 5 + .../dependencies/test_part_of_snake_runner.d | 4 + build/test/dependencies/test_tictactoe.d | 4 + .../test/dependencies/test_tictactoe_runner.d | 4 + build/test/out/c/get_character.o | Bin 0 -> 8552 bytes build/test/out/c/minesweeper_start.o | Bin 0 -> 23696 bytes build/test/out/c/snake_start.o | Bin 0 -> 18016 bytes build/test/out/c/test_bomb_in_array.o | Bin 0 -> 9752 bytes build/test/out/c/test_bomb_in_array_runner.o | Bin 0 -> 11176 bytes build/test/out/c/test_collision.o | Bin 0 -> 10792 bytes build/test/out/c/test_collision_runner.o | Bin 0 -> 11296 bytes build/test/out/c/test_is_Valid_tile.o | Bin 0 -> 13608 bytes build/test/out/c/test_is_Valid_tile_runner.o | Bin 0 -> 11880 bytes build/test/out/c/test_moving_snake.o | Bin 0 -> 13544 bytes build/test/out/c/test_moving_snake_runner.o | Bin 0 -> 11424 bytes build/test/out/c/test_number_of_bombs.o | Bin 0 -> 13392 bytes .../test/out/c/test_number_of_bombs_runner.o | Bin 0 -> 11720 bytes build/test/out/c/test_part_of_snake.o | Bin 0 -> 11152 bytes build/test/out/c/test_part_of_snake_runner.o | Bin 0 -> 11320 bytes build/test/out/c/test_tictactoe_runner.o | Bin 0 -> 11336 bytes build/test/out/test_bomb_in_array.out | Bin 0 -> 76336 bytes build/test/out/test_collision.out | Bin 0 -> 76976 bytes build/test/out/test_is_Valid_tile.out | Bin 0 -> 77528 bytes build/test/out/test_moving_snake.out | Bin 0 -> 77304 bytes build/test/out/test_number_of_bombs.out | Bin 0 -> 77552 bytes build/test/out/test_part_of_snake.out | Bin 0 -> 77160 bytes .../preprocess/files/test_bomb_in_array.c | 79 +++++++ build/test/preprocess/files/test_collision.c | 102 +++++++++ .../preprocess/files/test_is_Valid_tile.c | 205 ++++++++++++++++++ .../test/preprocess/files/test_moving_snake.c | 142 ++++++++++++ .../preprocess/files/test_number_of_bombs.c | 205 ++++++++++++++++++ .../preprocess/files/test_part_of_snake.c | 102 +++++++++ build/test/preprocess/files/test_tictactoe.c | 105 +++++++++ .../preprocess/includes/test_bomb_in_array.c | 3 + .../test/preprocess/includes/test_collision.c | 4 + .../preprocess/includes/test_is_Valid_tile.c | 3 + .../preprocess/includes/test_moving_snake.c | 4 + .../includes/test_number_of_bombs.c | 3 + .../preprocess/includes/test_part_of_snake.c | 4 + .../test/preprocess/includes/test_tictactoe.c | 3 + build/test/results/test_bomb_in_array.pass | 22 ++ build/test/results/test_collision.pass | 26 +++ build/test/results/test_is_Valid_tile.pass | 38 ++++ build/test/results/test_moving_snake.pass | 30 +++ build/test/results/test_number_of_bombs.pass | 34 +++ build/test/results/test_part_of_snake.pass | 26 +++ build/test/results/test_template.pass | 2 +- .../test/runners/test_bomb_in_array_runner.c | 83 +++++++ build/test/runners/test_collision_runner.c | 85 ++++++++ .../test/runners/test_is_Valid_tile_runner.c | 91 ++++++++ build/test/runners/test_moving_snake_runner.c | 87 ++++++++ .../runners/test_number_of_bombs_runner.c | 89 ++++++++ .../test/runners/test_part_of_snake_runner.c | 85 ++++++++ build/test/runners/test_tictactoe_runner.c | 85 ++++++++ test/Minesweeper/test_is_Valid_tile.c | 44 +++- 89 files changed, 2841 insertions(+), 3 deletions(-) create mode 100644 .vscode/tasks.json create mode 100644 build/release/dependencies/get_character.d create mode 100644 build/release/dependencies/minesweeper_start.d create mode 100644 build/release/dependencies/snake_start.d create mode 100644 build/release/dependencies/tictactoe.d create mode 100644 build/release/out/c/get_character.o create mode 100644 build/release/out/c/minesweeper_start.o create mode 100644 build/release/out/c/snake_start.o create mode 100644 build/release/out/c/tictactoe.o create mode 100644 build/test/cache/test_bomb_in_array.c create mode 100644 build/test/cache/test_collision.c create mode 100644 build/test/cache/test_is_Valid_tile.c create mode 100644 build/test/cache/test_moving_snake.c create mode 100644 build/test/cache/test_number_of_bombs.c create mode 100644 build/test/cache/test_part_of_snake.c create mode 100644 build/test/cache/test_tictactoe.c create mode 100644 build/test/dependencies/get_character.d create mode 100644 build/test/dependencies/minesweeper_start.d create mode 100644 build/test/dependencies/snake_start.d create mode 100644 build/test/dependencies/test_bomb_in_array.d create mode 100644 build/test/dependencies/test_bomb_in_array_runner.d create mode 100644 build/test/dependencies/test_collision.d create mode 100644 build/test/dependencies/test_collision_runner.d create mode 100644 build/test/dependencies/test_is_Valid_tile.d create mode 100644 build/test/dependencies/test_is_Valid_tile_runner.d create mode 100644 build/test/dependencies/test_moving_snake.d create mode 100644 build/test/dependencies/test_moving_snake_runner.d create mode 100644 build/test/dependencies/test_number_of_bombs.d create mode 100644 build/test/dependencies/test_number_of_bombs_runner.d create mode 100644 build/test/dependencies/test_part_of_snake.d create mode 100644 build/test/dependencies/test_part_of_snake_runner.d create mode 100644 build/test/dependencies/test_tictactoe.d create mode 100644 build/test/dependencies/test_tictactoe_runner.d create mode 100644 build/test/out/c/get_character.o create mode 100644 build/test/out/c/minesweeper_start.o create mode 100644 build/test/out/c/snake_start.o create mode 100644 build/test/out/c/test_bomb_in_array.o create mode 100644 build/test/out/c/test_bomb_in_array_runner.o create mode 100644 build/test/out/c/test_collision.o create mode 100644 build/test/out/c/test_collision_runner.o create mode 100644 build/test/out/c/test_is_Valid_tile.o create mode 100644 build/test/out/c/test_is_Valid_tile_runner.o create mode 100644 build/test/out/c/test_moving_snake.o create mode 100644 build/test/out/c/test_moving_snake_runner.o create mode 100644 build/test/out/c/test_number_of_bombs.o create mode 100644 build/test/out/c/test_number_of_bombs_runner.o create mode 100644 build/test/out/c/test_part_of_snake.o create mode 100644 build/test/out/c/test_part_of_snake_runner.o create mode 100644 build/test/out/c/test_tictactoe_runner.o create mode 100755 build/test/out/test_bomb_in_array.out create mode 100755 build/test/out/test_collision.out create mode 100755 build/test/out/test_is_Valid_tile.out create mode 100755 build/test/out/test_moving_snake.out create mode 100755 build/test/out/test_number_of_bombs.out create mode 100755 build/test/out/test_part_of_snake.out create mode 100644 build/test/preprocess/files/test_bomb_in_array.c create mode 100644 build/test/preprocess/files/test_collision.c create mode 100644 build/test/preprocess/files/test_is_Valid_tile.c create mode 100644 build/test/preprocess/files/test_moving_snake.c create mode 100644 build/test/preprocess/files/test_number_of_bombs.c create mode 100644 build/test/preprocess/files/test_part_of_snake.c create mode 100644 build/test/preprocess/files/test_tictactoe.c create mode 100644 build/test/preprocess/includes/test_bomb_in_array.c create mode 100644 build/test/preprocess/includes/test_collision.c create mode 100644 build/test/preprocess/includes/test_is_Valid_tile.c create mode 100644 build/test/preprocess/includes/test_moving_snake.c create mode 100644 build/test/preprocess/includes/test_number_of_bombs.c create mode 100644 build/test/preprocess/includes/test_part_of_snake.c create mode 100644 build/test/preprocess/includes/test_tictactoe.c create mode 100644 build/test/results/test_bomb_in_array.pass create mode 100644 build/test/results/test_collision.pass create mode 100644 build/test/results/test_is_Valid_tile.pass create mode 100644 build/test/results/test_moving_snake.pass create mode 100644 build/test/results/test_number_of_bombs.pass create mode 100644 build/test/results/test_part_of_snake.pass create mode 100644 build/test/runners/test_bomb_in_array_runner.c create mode 100644 build/test/runners/test_collision_runner.c create mode 100644 build/test/runners/test_is_Valid_tile_runner.c create mode 100644 build/test/runners/test_moving_snake_runner.c create mode 100644 build/test/runners/test_number_of_bombs_runner.c create mode 100644 build/test/runners/test_part_of_snake_runner.c create mode 100644 build/test/runners/test_tictactoe_runner.c diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 0000000..08d9005 --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,28 @@ +{ + "tasks": [ + { + "type": "cppbuild", + "label": "C/C++: gcc build active file", + "command": "/usr/bin/gcc", + "args": [ + "-fdiagnostics-color=always", + "-g", + "${file}", + "-o", + "${fileDirname}/${fileBasenameNoExtension}" + ], + "options": { + "cwd": "${fileDirname}" + }, + "problemMatcher": [ + "$gcc" + ], + "group": { + "kind": "build", + "isDefault": true + }, + "detail": "Task generated by Debugger." + } + ], + "version": "2.0.0" +} \ No newline at end of file diff --git a/build/artifacts/release/project.out b/build/artifacts/release/project.out index 7e9f67263f51db4eadc14cd5936440bb3f23086e..2b21304b688344c6c05790118e49cce2e28dc54e 100755 GIT binary patch literal 27216 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 XN9C&&X}FG-9uEjSOwCA;5oP}y?UXae literal 17000 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 literal 0 HcmV?d00001 diff --git a/build/release/out/c/main.o b/build/release/out/c/main.o index b7d643634397335a1da69338ecc14490046ed8e8..517a416d0b3b6b5658484e0eb84728afe3feaf1d 100644 GIT binary patch delta 735 zcmZpW*dRGUgYm;eO>@Ru6BB!wxypSf{#54K!2kp=K*VeL$;ynXj53ow8Pgo|60=hk zic1oUN>cL}I8F3|3o=u4Ob{aGdcK)?sm0}~sRgM;2w_75J=coN5(d?j$&MU`lX;o) zg_RkBX1nqUv@tpJvN20B^00GE{>Ugf*?^N}@*1WmjLMTIGEZj=n!J%&oG}GNPIh2% zmjT%y54N8n7hw@ZWb$@YK*fdJ$N z5dI6|0KtUGjO^l*J=g^-S)n>-KqTNQ??d@>(8PJ6>K9B-WEZbrf+i~pm0f`*{u|0) zgC-7h_Xad^MW{Jj(8PtI;tCM)$?Mra0%L3;hdJj1kk^5rVDdu_bEafQV5EuxBUJ;& zEa24OOo8g&F?k`UIadHXL03jc&yi+m>y3#c4W>;%{um^ zB3fg~g)v8|8^U)8VKtj7s|Q6))>)zzg}~s&lndgMQ1OC2Lp>f9?L#kGYQG^} z21Zg7HkqH_spS9`<~&U>h<57p6%4%56ReH> tHAcKqXv1!A0{U>%O%i+6iX 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 literal 0 HcmV?d00001 diff --git a/build/release/out/c/snake_start.o b/build/release/out/c/snake_start.o new file mode 100644 index 0000000000000000000000000000000000000000..de4954f93412bd8a8758977e408e7f510757cd91 GIT binary patch literal 9184 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 literal 0 HcmV?d00001 diff --git a/build/release/out/c/tictactoe.o b/build/release/out/c/tictactoe.o new file mode 100644 index 0000000000000000000000000000000000000000..a10f2f1f99b111007985a518e4a8fa071c39aaa0 GIT binary patch literal 5920 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 XN9C&&X}FG-9uEjSOwCA;5oP}y?UXae literal 17000 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 literal 0 HcmV?d00001 diff --git a/build/test/out/c/minesweeper_start.o b/build/test/out/c/minesweeper_start.o new file mode 100644 index 0000000000000000000000000000000000000000..90e6d3f08937520f8ecb4c6072521866ef6fb22a GIT binary patch literal 23696 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 literal 0 HcmV?d00001 diff --git a/build/test/out/c/snake_start.o b/build/test/out/c/snake_start.o new file mode 100644 index 0000000000000000000000000000000000000000..cba181337a069c8bbe42fb6c79ab350b66cb705c GIT binary patch literal 18016 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

)HvV`7>DOAJCK`31qcf~` z3>$=0DNfE&*L?^|2J^oOI|fPCM{_tNy8l~&={5lwJ=A^>jVnpleHh9HYySwfFXsu( z;ZW-B?*)c7rJs=HX&G(sJUK-B(vJh6Jy`vB=|AgG7?IWfzRLPvq56&jWwOWVM98w9 zEd2&#FfR1?FQEE9sYqwpe~Dj%4BFJ|S5o~WT7!Ch+=m!!{EsaVE%>NDjz5N^tS{$f zu(q-0dHj(C68>*EOt=q+?;U!5TxRsO1Ca6DL_EU0YW`~?-}f7={)L62{yA}Sj(Yw7 E0b>n+2LJ#7 literal 0 HcmV?d00001 diff --git a/build/test/out/c/test_bomb_in_array.o b/build/test/out/c/test_bomb_in_array.o new file mode 100644 index 0000000000000000000000000000000000000000..651d6c6463a7184d2748ee5bb961fac1bb8b4640 GIT binary patch literal 9752 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 mzHL8# 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 F|8MSr?Y95` literal 0 HcmV?d00001 diff --git a/build/test/out/c/test_is_Valid_tile.o b/build/test/out/c/test_is_Valid_tile.o new file mode 100644 index 0000000000000000000000000000000000000000..aeddeac346154c937d2cd76ff9bf05cd06cf7578 GIT binary patch literal 13608 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 HmDm4YmQ)2t literal 0 HcmV?d00001 diff --git a/build/test/out/c/test_is_Valid_tile_runner.o b/build/test/out/c/test_is_Valid_tile_runner.o new file mode 100644 index 0000000000000000000000000000000000000000..f1c95db4940b1d59320901b129fb4d17a04c8d10 GIT binary patch literal 11880 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 CkeJ*6 literal 0 HcmV?d00001 diff --git a/build/test/out/c/test_moving_snake.o b/build/test/out/c/test_moving_snake.o new file mode 100644 index 0000000000000000000000000000000000000000..829d7f100b29cbef82a871d32e7c629da7685ef8 GIT binary patch literal 13544 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 literal 0 HcmV?d00001 diff --git a/build/test/out/c/test_number_of_bombs.o b/build/test/out/c/test_number_of_bombs.o new file mode 100644 index 0000000000000000000000000000000000000000..1d66c5f844070b517acb523d1ecfd9bf9ad1fbec GIT binary patch literal 13392 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 ZxS0i)k?=d!;^RkYWAJNAOySJO{|^~J|E&N3 literal 0 HcmV?d00001 diff --git a/build/test/out/c/test_number_of_bombs_runner.o b/build/test/out/c/test_number_of_bombs_runner.o new file mode 100644 index 0000000000000000000000000000000000000000..d3a3c43195d9faacc1ab1f766bafde05911f7082 GIT binary patch literal 11720 zcmcgy4RBo5b-qulXRUrL>&Jhxf-R>4+XU@ew)}65Y+16D2us8kV8A@T-F>@Syn0W0 z@2zYn1za?wF)pn=%{2DJEkF5VGBBY|nFK-_C1yg}OlFcaL!2g|l#)TT&^Dw=J*0_y z&bjCAK3!IsPCL`9*}eCC=ey^gd+zUhtNZ(h2dWH1sAPy;qAV#?h{3hxaxWEo#Zs|E z{9@6{cg6-!{p>|k>C2_Ta`DXJONv>!IE&S1FJHZSb@pZa`ZRta7NO5R3t&VZoPM)o z@YKCm22U0Leel%S?BMBs$jK2X&X$T2nVvBeQuZt2;%qlqAAI;masv_5!Rx^?Qs*&CqRbIU8Lno+f`qUu+_ z1=aS7svo0jxT0zXROIpDOQ07bbb`=wixVlwx4f*C@+MM2BCT*w0@h@~PCFUP_PwH; zvBG@8p~|X$;Mjh8Jn!bLtmktT&$ZH??>p&`_J{$@2MjEZ4>B?Fs*Y$6(IY98-EjVym|MHUQ`XP4vMaWlrRKaWUZU~wl1<5CzTuP3E2L_#Qq_t%@yh2v7Vx#bP$+es5Y!riskK%J+hVATzS z@MS3+A>U@Ckc!_5240XuQd`q@AMhG6`tkQQF2cM%-UfvFI4WW|`sf$WtNM5|2u$lO z7e4?+;${`MRWy;YQ;j}A^)%QLd592MK3y(1tf2W6y9o5p!KYa?T%ejafC~*zLXoO8 zw68#I3mUKa6Qk+7#CZw6TNfj?+^BiUi2ni1z$HYvY&2tCmVP9qxYYevN=;JwiIkR0 z>1AVy4-I!n=^u>cD6N&!D^gl7rGJ#tRw=zIrCurhlavOf^oFtUo8Zc*pcPc}ma*!G z;93kjcpe;v9{(|9Qu%yUD`HakYE<~^sPMI@@b#$hji_)bD!d?tr5GP$fr(467DGfy zqBRxKcnz-1GItr)Fh+7mN#dA_-$7^#F^X!7oV0g^REOwNY{7+Dp)K)!A_t zx8qnW5lkAPr-v)qq0vYBAKBg!ar% zQD46c>Iku*)u^wRT%^=2j8xqU)Of2AYm72#xh`y%b&J3ZEF#RXp@!?gKFp0CX~V?k zZ))2KL2E2~1k1D)^oTYwk^Gdz=GD-%7G{$HSU^j}8elIbPfYL?aP$?zLER)8`nq(k zy($>#WeIUpn+nF7wxL#xQSb6U+XDudC!lMx>ucIdI9hHqBT+yzE9ROhk%eeal&H$c zC(yXK0X}rR$b*FkOo-?iUIL-e0_2$Z1WYW$_;uq#_@?VC%Bf<$kV)cwBIy@h*YN|9 zECzlu@1_gIjFUXRb+fg(r>l^6i^sciZZVn4hyN2wGCVQq%q2?0g?uWROQ+v$c$;cd zB&TdYNjzsFNNz}MNvu!iu$Xq740w|3TA$e1o#;+ZIc~=DlSMZlo=66MTHV3s-pwr8 zF}R{ZhXW_PXJRrjj`6dsAfE%k3PFZNSkl2JMD9yk5N0w?7Rs=MsVNJtB98Ccg#bWU zg+b^S;m$TNG~6!@l}i(LI1U&X1S@%uizfoh@%=(Rz=m-k;pnWD0}4WHiD538e#Bh- zh-o~vYkJr8ZZkH02$E?Wx(SMq^_uPRqPhAhv+gg=<)LXl6~Du*J!Hn;Hfx6ujdO0A zcichT*z{N8kH|l>F8(NBRaGzt`igMZbi;!%_QQGC*-ue}pm^D=6$)!;#PS_GV@-y> zK+XVOVXgGIop*r*L9|lEtO)WSc7VOF;HB(B|M5wxs2v2dWvV%0`$rw0CW0#>!5_-Gp6@_Q7*q^c(d7!phmFzJHi=*?rd zB}aYl9_MH%`fdh8)?SzvzIQ_G+dtOP*S)1KtZhGAJT(1~(72RWbH`5i`Fiiqb2BDok+BNBWAxurr@4_Zv?kGjN zUe8#adc4&)t9}jd^=#RhUE!LW% z$g8D5eU?$e-at#_S{5c7L>AV~=AP(YBbPmRKobySNK+I1FTxTKa*GU zAfs`iVG>r+Ee1|z15QJn@oJlbBftuA*TI#QvnR-|TzI_PVU`qOOQU@!%S#S-XcaeX zb3ab!NOaUvkcM~`%MlV2v`?1SB^j2}dHSsfWu&X(+cq z{CgqCL~|1Ihv8Gn%TLXNKRFM65pcAhfgF>v`PE376#R8*9{k($;6DW%?YHsNqB#%P ztMl;Rng?%$`pP$;l+xCD@LT4=@0kamo(He^g0y@>L^eTLk>7a` zmT#HXzTuHQyN9ijfq?`42d#s<_YC)2;GymB^^UoC>_yK2JUi z;RztOb=vp$I61fp`8yc?G0KPQFr0n3^eoQ}<8Tp64DF0uJ;L(2loN?XGuOj@YofxbW zOxXWu+*%^|HK0@Nb~29kao1M(x(FY~Na33_z8cq^jN>`f5#f(&{GFh~bX$bK8f0bv zsK(C{TL^qng$eDy7e0#rQH_5;k{~@C;r|}UivO6#KSyjKo`~>qE-3ypjAJ~njo|7; z#QCnyRwxSfQwQSs*7rOH7Lq!d6yAvjA<>IV$Q3@$e4GQAuz7|^UPs@OUwVrMSR#UB zyE|A`^G?}+miu!+4{e^~~XZ#%v|67*TPp-_iFer+0M-x-p~Huso~Evp3?9w+-^?8^K3uR@J}-Tehn`$ z{zn?#%Cd^LiqA^+=d&9BH;k)!r}z)CKQkIXZORJY(eQ7x{P!Aufc<=3!#~dL{)dLI zVAGK-?n1scbG<*xk?F9{oH`tWEr{QYeysY6f?Ek-L z_$bR)H2eq5U%=y_#y7)wi-y}Quh8%U_jk93Z(w{_!qv7{*+yV_h%=`y5Jj?t?G<*y5pVaU}%zswH$GOAb z)bKqV&%e`fbfW%JadaE+^D14V@xQ?KuaEH6 z-4N?+)c9X#es6@Y?n1~P()f3?d@#bt5VvtWa~l6m?x(BqLo^QQL5=?r=6_tnUt{~9 z((uo+|6kPbGmJmSI95kLGuSAk?`Zs@gvAduelO#%Yy8tZul`lzZ(_dur;_qL>K5k3 z`NFFFxt{s$jH_|?ng3pm&-BupAmrmmCH35+>?>UD(>mV41ndrXiI83mSAHJRaMj#%aAE@9GD9BvG9OnZ-znIM&^aE81iimbq~Ir*gzrg# zv>7K=%)w81Sr0f=wo@tJnF1PCX2`eQ9K3OkV)!OrRe|G<$MLE3S~tt|Z{!ae)HWgSo*$51`@C~Li3(0>g^ZZxT9^4=&2 z<)`r>71AtE0^DP;u6n*^wYZLPUS1%{^lQB##&!4xz|rRawthF%MVryN3StR(hJ^B$ z@?RmlprHGNx@XwnCM~c!cN=hVi|U0>G@YaW!hrWCycjWlXiBxO;`e^Qbem}BpP6`0 zQ);5X_bxhy^&jAN*P{?gI`?+aRr3D~4lE>9AN|Mo5W4>#0!+6FkhsY0FVzM{=N5ol zsr?ylU&RUA$LD#y{d)mJo61ipQuXmUZr9fZ_kAX<-t_xqb)eqDl2%Vb4MVZR+*Uas4Zb$hltsuK=$U|H~Zz zC%7KQAK#Uz`f6M%wT)HIUVj4-L^Rw=zZe&|!B`X|@O M8kbZ>&h_~JH!mk`ga7~l literal 0 HcmV?d00001 diff --git a/build/test/out/c/test_part_of_snake.o b/build/test/out/c/test_part_of_snake.o new file mode 100644 index 0000000000000000000000000000000000000000..934775c5b1b8b495bc3667d95cf83cb28f302bfe GIT binary patch literal 11152 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 literal 0 HcmV?d00001 diff --git a/build/test/out/c/test_tictactoe_runner.o b/build/test/out/c/test_tictactoe_runner.o new file mode 100644 index 0000000000000000000000000000000000000000..104bf356c3171e4eed3f87c46771844535fbfb70 GIT binary patch literal 11336 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 Hdj0iqjn literal 0 HcmV?d00001 diff --git a/build/test/out/test_bomb_in_array.out b/build/test/out/test_bomb_in_array.out new file mode 100755 index 0000000000000000000000000000000000000000..a8ba57a86c3d2593620868fc6f6bdfe20ffccc3a GIT binary patch literal 76336 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

+l^DxyMM-P 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 literal 0 HcmV?d00001 diff --git a/build/test/out/test_is_Valid_tile.out b/build/test/out/test_is_Valid_tile.out new file mode 100755 index 0000000000000000000000000000000000000000..38aa2788d7360501d5442b9e0a9a2f80490ef4d1 GIT binary patch literal 77528 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 XV}RWB$=rp--*LUhoOU8OkKX?PAmW|+ literal 0 HcmV?d00001 diff --git a/build/test/out/test_moving_snake.out b/build/test/out/test_moving_snake.out new file mode 100755 index 0000000000000000000000000000000000000000..e3f2dcfe6181dacbc5329119630837112ca9c3a3 GIT binary patch literal 77304 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 WGIvII429b?|%UA6y>4- literal 0 HcmV?d00001 diff --git a/build/test/out/test_number_of_bombs.out b/build/test/out/test_number_of_bombs.out new file mode 100755 index 0000000000000000000000000000000000000000..44d20d7079f4cf8048a25cf338b92f6903375d61 GIT binary patch literal 77552 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 LX4;A1JbM2FS8BRz literal 0 HcmV?d00001 diff --git a/build/test/out/test_part_of_snake.out b/build/test/out/test_part_of_snake.out new file mode 100755 index 0000000000000000000000000000000000000000..87a85748e90f5005e0a99dc13bc94e3c95b260c4 GIT binary patch literal 77160 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 Date: Wed, 7 Feb 2024 08:42:31 +0100 Subject: [PATCH 236/245] Test detect valid tile all --- test/Minesweeper/test_is_Valid_tile.c | 52 ++++++++++++++++++++------- 1 file changed, 40 insertions(+), 12 deletions(-) diff --git a/test/Minesweeper/test_is_Valid_tile.c b/test/Minesweeper/test_is_Valid_tile.c index 058be3b..13e8980 100644 --- a/test/Minesweeper/test_is_Valid_tile.c +++ b/test/Minesweeper/test_is_Valid_tile.c @@ -11,7 +11,7 @@ void test_detect_not_valid_tile_left(void){ /* arrange */ Minesweeper_Board board = initialize_minesweeper(); int tile = 0; - int direction = 1; + int direction = 2; int result; /* act */ @@ -35,10 +35,10 @@ void test_detect_not_valid_tile_up(void){ TEST_ASSERT_EQUAL_INT(-1, result);//not valid tile } -void test_detect_valid_tile_right(void){ +void test_detect_not_valid_tile_right(void){ /* arrange */ Minesweeper_Board board = initialize_minesweeper(); - int tile = 0; + int tile = board.width * board.height - 1; int direction = 5; int result; @@ -46,13 +46,13 @@ void test_detect_valid_tile_right(void){ result = is_Valid_tile(&board, tile, direction); /* assert */ - TEST_ASSERT_EQUAL_INT(1, result);//not valid tile + TEST_ASSERT_EQUAL_INT(-1, result);//not valid tile } -void test_detect_valid_tile_down(void){ +void test_detect_not_valid_tile_down(void){ /* arrange */ Minesweeper_Board board = initialize_minesweeper(); - int tile = 0; + int tile = board.width * board.height - 1; int direction = 4; int result; @@ -60,27 +60,55 @@ void test_detect_valid_tile_down(void){ result = is_Valid_tile(&board, tile, direction); /* assert */ - TEST_ASSERT_EQUAL_INT(0 + board.width, result);//not valid tile + TEST_ASSERT_EQUAL_INT(-1, result);//not valid tile } -void test_detect_not_valid_tile_right(void){ +void test_detect_valid_tile_left(void){ /* arrange */ Minesweeper_Board board = initialize_minesweeper(); int tile = board.width * board.height - 1; - int direction = 5; + int direction = 2; int result; /* act */ result = is_Valid_tile(&board, tile, direction); /* assert */ - TEST_ASSERT_EQUAL_INT(-1, result);//not valid tile + TEST_ASSERT_EQUAL_INT(board.width * board.height - 2, result);//not valid tile } -void test_detect_not_valid_tile_down(void){ +void test_detect_valid_tile_up(void){ /* arrange */ Minesweeper_Board board = initialize_minesweeper(); int tile = board.width * board.height - 1; + int direction = 3; + int result; + + /* act */ + result = is_Valid_tile(&board, tile, direction); + + /* assert */ + TEST_ASSERT_EQUAL_INT(board.width * (board.height - 1) - 1, result);//not valid tile +} + +void test_detect_valid_tile_right(void){ + /* arrange */ + Minesweeper_Board board = initialize_minesweeper(); + int tile = 0; + int direction = 5; + int result; + + /* act */ + result = is_Valid_tile(&board, tile, direction); + + /* assert */ + TEST_ASSERT_EQUAL_INT(1, result);//not valid tile +} + +void test_detect_valid_tile_down(void){ + /* arrange */ + Minesweeper_Board board = initialize_minesweeper(); + int tile = 0; int direction = 4; int result; @@ -88,7 +116,7 @@ void test_detect_not_valid_tile_down(void){ result = is_Valid_tile(&board, tile, direction); /* assert */ - TEST_ASSERT_EQUAL_INT(-1, result);//not valid tile + TEST_ASSERT_EQUAL_INT(0 + board.width, result);//not valid tile } #endif // TEST \ No newline at end of file From 442cded1c672c5ef45061b137b4b32a9a92ba399 Mon Sep 17 00:00:00 2001 From: David Moeller Date: Wed, 7 Feb 2024 09:19:24 +0100 Subject: [PATCH 237/245] preperations merge --- .vscode/settings.json | 9 ++ build/release/dependencies/main.d | 2 +- build/release/dependencies/pong.d | 1 + build/release/out/c/main.o | Bin 3248 -> 3312 bytes build/release/out/c/pong.o | Bin 0 -> 6320 bytes build/release/out/c/tictactoe.o | Bin 5920 -> 5920 bytes build/release/project.out | Bin 27216 -> 0 bytes build/test/cache/defines_dependency.yml | 2 + build/test/cache/test_checkCollision.c | 143 ++++++++++++++++++ build/test/cache/test_checkGameEnd.c | 69 +++++++++ build/test/cache/test_clearScreen.c | 73 +++++++++ build/test/cache/test_is_Valid_tile.c | 90 +++++++++-- build/test/cache/test_playerInputMovement.c | 83 ++++++++++ build/test/cache/test_pong.c | 51 +++++++ build/test/cache/test_tictactoe.c | 105 ------------- build/test/dependencies/pong.d | 1 + build/test/dependencies/test_checkCollision.d | 4 + .../dependencies/test_checkCollision_runner.d | 4 + build/test/dependencies/test_checkGameEnd.d | 4 + .../dependencies/test_checkGameEnd_runner.d | 4 + build/test/dependencies/test_clearScreen.d | 4 + .../dependencies/test_clearScreen_runner.d | 4 + .../dependencies/test_playerInputMovement.d | 5 + .../test_playerInputMovement_runner.d | 4 + build/test/dependencies/test_pong.d | 4 + build/test/dependencies/test_pong_runner.d | 4 + build/test/dependencies/test_tictactoe.d | 5 +- build/test/out/c/pong.o | Bin 0 -> 15192 bytes build/test/out/c/test_checkCollision.o | Bin 0 -> 11104 bytes build/test/out/c/test_checkCollision_runner.o | Bin 0 -> 11040 bytes build/test/out/c/test_checkGameEnd.o | Bin 0 -> 9912 bytes build/test/out/c/test_checkGameEnd_runner.o | Bin 0 -> 11024 bytes build/test/out/c/test_clearScreen.o | Bin 0 -> 10104 bytes build/test/out/c/test_clearScreen_runner.o | Bin 0 -> 11016 bytes build/test/out/c/test_is_Valid_tile.o | Bin 13608 -> 14936 bytes build/test/out/c/test_is_Valid_tile_runner.o | Bin 11880 -> 12192 bytes build/test/out/c/test_playerInputMovement.o | Bin 0 -> 10048 bytes .../out/c/test_playerInputMovement_runner.o | Bin 0 -> 11064 bytes build/test/out/c/test_pong.o | Bin 0 -> 9672 bytes build/test/out/c/test_pong_runner.o | Bin 0 -> 10992 bytes build/test/out/c/test_tictactoe.o | Bin 0 -> 1488 bytes build/test/out/c/test_tictactoe_runner.o | Bin 11336 -> 10144 bytes build/test/out/test_checkCollision.out | Bin 0 -> 70360 bytes build/test/out/test_checkGameEnd.out | Bin 0 -> 69960 bytes build/test/out/test_clearScreen.out | Bin 0 -> 70104 bytes build/test/out/test_is_Valid_tile.out | Bin 77528 -> 77952 bytes build/test/out/test_playerInputMovement.out | Bin 0 -> 70048 bytes build/test/out/test_pong.out | Bin 0 -> 69848 bytes build/test/out/test_tictactoe.out | Bin 0 -> 62360 bytes .../preprocess/files/test_checkCollision.c | 143 ++++++++++++++++++ .../test/preprocess/files/test_checkGameEnd.c | 69 +++++++++ .../test/preprocess/files/test_clearScreen.c | 73 +++++++++ .../preprocess/files/test_is_Valid_tile.c | 90 +++++++++-- .../files/test_playerInputMovement.c | 83 ++++++++++ build/test/preprocess/files/test_pong.c | 51 +++++++ build/test/preprocess/files/test_tictactoe.c | 105 ------------- .../preprocess/includes/test_checkCollision.c | 3 + .../preprocess/includes/test_checkGameEnd.c | 3 + .../preprocess/includes/test_clearScreen.c | 3 + .../includes/test_playerInputMovement.c | 3 + build/test/preprocess/includes/test_pong.c | 3 + .../test/preprocess/includes/test_tictactoe.c | 4 +- build/test/results/test_bomb_in_array.pass | 2 +- build/test/results/test_checkCollision.pass | 18 +++ build/test/results/test_checkGameEnd.pass | 18 +++ build/test/results/test_clearScreen.pass | 19 +++ build/test/results/test_collision.pass | 2 +- build/test/results/test_is_Valid_tile.pass | 22 ++- build/test/results/test_moving_snake.pass | 2 +- build/test/results/test_number_of_bombs.pass | 2 +- build/test/results/test_part_of_snake.pass | 2 +- .../results/test_playerInputMovement.pass | 18 +++ build/test/results/test_pong.pass | 18 +++ build/test/results/test_template.pass | 2 +- build/test/results/test_tictactoe.pass | 14 ++ .../test/runners/test_checkCollision_runner.c | 81 ++++++++++ build/test/runners/test_checkGameEnd_runner.c | 81 ++++++++++ build/test/runners/test_clearScreen_runner.c | 81 ++++++++++ .../test/runners/test_is_Valid_tile_runner.c | 16 +- .../runners/test_playerInputMovement_runner.c | 81 ++++++++++ build/test/runners/test_pong_runner.c | 81 ++++++++++ build/test/runners/test_tictactoe_runner.c | 40 +---- 82 files changed, 1611 insertions(+), 297 deletions(-) create mode 100644 .vscode/settings.json create mode 100644 build/release/dependencies/pong.d create mode 100644 build/release/out/c/pong.o delete mode 100755 build/release/project.out create mode 100644 build/test/cache/test_checkCollision.c create mode 100644 build/test/cache/test_checkGameEnd.c create mode 100644 build/test/cache/test_clearScreen.c create mode 100644 build/test/cache/test_playerInputMovement.c create mode 100644 build/test/cache/test_pong.c create mode 100644 build/test/dependencies/pong.d create mode 100644 build/test/dependencies/test_checkCollision.d create mode 100644 build/test/dependencies/test_checkCollision_runner.d create mode 100644 build/test/dependencies/test_checkGameEnd.d create mode 100644 build/test/dependencies/test_checkGameEnd_runner.d create mode 100644 build/test/dependencies/test_clearScreen.d create mode 100644 build/test/dependencies/test_clearScreen_runner.d create mode 100644 build/test/dependencies/test_playerInputMovement.d create mode 100644 build/test/dependencies/test_playerInputMovement_runner.d create mode 100644 build/test/dependencies/test_pong.d create mode 100644 build/test/dependencies/test_pong_runner.d create mode 100644 build/test/out/c/pong.o create mode 100644 build/test/out/c/test_checkCollision.o create mode 100644 build/test/out/c/test_checkCollision_runner.o create mode 100644 build/test/out/c/test_checkGameEnd.o create mode 100644 build/test/out/c/test_checkGameEnd_runner.o create mode 100644 build/test/out/c/test_clearScreen.o create mode 100644 build/test/out/c/test_clearScreen_runner.o create mode 100644 build/test/out/c/test_playerInputMovement.o create mode 100644 build/test/out/c/test_playerInputMovement_runner.o create mode 100644 build/test/out/c/test_pong.o create mode 100644 build/test/out/c/test_pong_runner.o create mode 100644 build/test/out/c/test_tictactoe.o create mode 100755 build/test/out/test_checkCollision.out create mode 100755 build/test/out/test_checkGameEnd.out create mode 100755 build/test/out/test_clearScreen.out create mode 100755 build/test/out/test_playerInputMovement.out create mode 100755 build/test/out/test_pong.out create mode 100755 build/test/out/test_tictactoe.out create mode 100644 build/test/preprocess/files/test_checkCollision.c create mode 100644 build/test/preprocess/files/test_checkGameEnd.c create mode 100644 build/test/preprocess/files/test_clearScreen.c create mode 100644 build/test/preprocess/files/test_playerInputMovement.c create mode 100644 build/test/preprocess/files/test_pong.c create mode 100644 build/test/preprocess/includes/test_checkCollision.c create mode 100644 build/test/preprocess/includes/test_checkGameEnd.c create mode 100644 build/test/preprocess/includes/test_clearScreen.c create mode 100644 build/test/preprocess/includes/test_playerInputMovement.c create mode 100644 build/test/preprocess/includes/test_pong.c create mode 100644 build/test/results/test_checkCollision.pass create mode 100644 build/test/results/test_checkGameEnd.pass create mode 100644 build/test/results/test_clearScreen.pass create mode 100644 build/test/results/test_playerInputMovement.pass create mode 100644 build/test/results/test_pong.pass create mode 100644 build/test/results/test_tictactoe.pass create mode 100644 build/test/runners/test_checkCollision_runner.c create mode 100644 build/test/runners/test_checkGameEnd_runner.c create mode 100644 build/test/runners/test_clearScreen_runner.c create mode 100644 build/test/runners/test_playerInputMovement_runner.c create mode 100644 build/test/runners/test_pong_runner.c diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..ef6068e --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,9 @@ +{ + "files.associations": { + "*.embeddedhtml": "html", + "unistd.h": "c", + "fcntl.h": "c", + "stdio.h": "c", + "types.h": "c" + } +} \ No newline at end of file diff --git a/build/release/dependencies/main.d b/build/release/dependencies/main.d index d6a73f0..cab5c66 100644 --- a/build/release/dependencies/main.d +++ b/build/release/dependencies/main.d @@ -1,3 +1,3 @@ build/release/out/c/main.o: src/main/c/main.c \ src/main/c/Snake/snake_start.h \ - src/main/c/Minesweeper/minesweeper_start.h + src/main/c/Minesweeper/minesweeper_start.h src/main/c/Pong/pong.h diff --git a/build/release/dependencies/pong.d b/build/release/dependencies/pong.d new file mode 100644 index 0000000..4a40a82 --- /dev/null +++ b/build/release/dependencies/pong.d @@ -0,0 +1 @@ +build/release/out/c/pong.o: src/main/c/Pong/pong.c diff --git a/build/release/out/c/main.o b/build/release/out/c/main.o index 517a416d0b3b6b5658484e0eb84728afe3feaf1d..17adbcd0132e8cf0674f4e218b4d66bb3f62607c 100644 GIT binary patch delta 555 zcmZ8dF-QYZ482^xz5A_7YsKRRu?3N;Xe)v@Nf8kdL3%hj2s(+2t&=DS4nSv{nsN^O*e z5u-7RV1^b&Hn*{cGulP3o{ObO)3lk+$i6<^5ey7ayJ4bEHr}Pcz5YoloCl6+9uENv z>9D|Kpqtj=ie-^kZLY;Q-oy({;@S?y-Vn7u#>6i649jiyBB6*4Ut0lc6**HeXXzBtvynCOzE&ZVhX$tV#^O`r1sj zBQN^=x0j!^@V3|O6j9T{lM%5K9&^#6G*CAz+u!o4r8-r6W!CeMS)# z>F7D)oA>a|lm0UvO3J)9>ke+np)yLL4E3WL%II1BUmp)ADT}#qhVm$}KS4E|k(cUM YjCVxa9a&TtW9-1??8aUYL3z56^yl$m6-~K zl^Gcr7+m=T+L)Yq*_fpmdDuB7Gcrj|KEU*XQF-!8=IM+Z03^hfX0IW6A-fk z@t^+?@OiQ#t9ZRE$aWxL0b(H_hRODT1c3mg3xxlII6yD~Lczruq57wwiL*k*XP}AS zhw|q@XeGEoyig4b&@>26Hslbu6otyJK$HCq<*z{#hk0wmWJL~f!7XUA!jmU*{09c^ zL{4+g2OysVLBZsUoaRi)jKHuLo2g`MZQn6@B9}QZ&`)yN1LKmD+n&jT z39LSWTZ7SKawoSvW5(o@Kr&)7Cyzbn0#LvK!HLO%Jm#DkP>V_@PXzJ`I3RMBlLfit E0VHH+9smFU diff --git a/build/release/out/c/pong.o b/build/release/out/c/pong.o new file mode 100644 index 0000000000000000000000000000000000000000..6cbb7e4c0e4f3d95c44470b792c003530fef5985 GIT binary patch literal 6320 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 E2me8d!vFvP literal 0 HcmV?d00001 diff --git a/build/release/out/c/tictactoe.o b/build/release/out/c/tictactoe.o index a10f2f1f99b111007985a518e4a8fa071c39aaa0..39f5d2119a6c48354933229f58b392d3551d59d4 100644 GIT binary patch delta 149 zcmZ3Ww?J=05F7Un1|Wz%3?es&viUO!N`jcKd;)Du&b({^JnS5k7Ya*nzQFN-iBWR% zMs5~H_T0qGJdpAuJT~l%l9L%l${7|o&uq8f}ElXr^RGkQ$^DO%5XU~;9HJ?8;#kbMjcOp_0a#RCA}@+Un2 delta 153 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 XN9C&&X}FG-9uEjSOwCA;5oP}y?UXae diff --git a/build/test/cache/defines_dependency.yml b/build/test/cache/defines_dependency.yml index 717335e..6dae52a 100644 --- a/build/test/cache/defines_dependency.yml +++ b/build/test/cache/defines_dependency.yml @@ -9,3 +9,5 @@ src/main/c/Minesweeper/minesweeper_start.c: - TEST src/main/c/GameTic_Tac_Toe/tictactoe.c: - TEST +src/main/c/Pong/pong.c: +- TEST diff --git a/build/test/cache/test_checkCollision.c b/build/test/cache/test_checkCollision.c new file mode 100644 index 0000000..79e7083 --- /dev/null +++ b/build/test/cache/test_checkCollision.c @@ -0,0 +1,143 @@ +#include "src/main/c/Pong/pong.h" +#include "/var/lib/gems/2.7.0/gems/ceedling-0.31.1/vendor/unity/src/unity.h" + + + + + + + + +typedef struct { + + int x; + + int y; + + int speedX; + + int speedY; + +} Ball; + + + +typedef struct { + + int x; + + int y; + + int width; + + int height; + +} Paddle; + + + +void setUp(void){ + + + +} + + + +void tearDown(void){ + +} + + + +void test_checkCollision(void){ + + Ball ball = {10, 10, 1, 1}; + + Paddle paddle = {50, 10, 5, 10}; + + + + + + ball.x = 0; + + int result1 = checkCollision(ball, paddle.y, paddle.y); + + UnityAssertEqualNumber((UNITY_INT)((1)), (UNITY_INT)((result1)), ( + + ((void *)0) + + ), (UNITY_UINT)(35), UNITY_DISPLAY_STYLE_INT); + + + + ball.x = 40 - 1; + + int result2 = checkCollision(ball, paddle.y, paddle.y); + + UnityAssertEqualNumber((UNITY_INT)((2)), (UNITY_INT)((result2)), ( + + ((void *)0) + + ), (UNITY_UINT)(39), UNITY_DISPLAY_STYLE_INT); + + + + + + ball.x = 5; + + ball.y = 0; + + int result3 = checkCollision(ball, paddle.y, paddle.y); + + UnityAssertEqualNumber((UNITY_INT)((0)), (UNITY_INT)((result3)), ( + + ((void *)0) + + ), (UNITY_UINT)(45), UNITY_DISPLAY_STYLE_INT); + + + + ball.y = 20 - 1; + + int result4 = checkCollision(ball, paddle.y, paddle.y); + + UnityAssertEqualNumber((UNITY_INT)((0)), (UNITY_INT)((result4)), ( + + ((void *)0) + + ), (UNITY_UINT)(49), UNITY_DISPLAY_STYLE_INT); + + + + + + ball.x = paddle.x - 1; + + ball.y = paddle.y + 1; + + int result5 = checkCollision(ball, paddle.y, paddle.y); + + UnityAssertEqualNumber((UNITY_INT)((2)), (UNITY_INT)((result5)), ( + + ((void *)0) + + ), (UNITY_UINT)(55), UNITY_DISPLAY_STYLE_INT); + + + + ball.x = paddle.x + 1; + + ball.y = paddle.y + 1; + + int result6 = checkCollision(ball, paddle.y, paddle.y); + + UnityAssertEqualNumber((UNITY_INT)((2)), (UNITY_INT)((result6)), ( + + ((void *)0) + + ), (UNITY_UINT)(60), UNITY_DISPLAY_STYLE_INT); + +} diff --git a/build/test/cache/test_checkGameEnd.c b/build/test/cache/test_checkGameEnd.c new file mode 100644 index 0000000..3c0d662 --- /dev/null +++ b/build/test/cache/test_checkGameEnd.c @@ -0,0 +1,69 @@ +#include "src/main/c/Pong/pong.h" +#include "/var/lib/gems/2.7.0/gems/ceedling-0.31.1/vendor/unity/src/unity.h" + + + + + + + + +void setUp(void){ + + + +} + + + +void tearDown(void){ + +} + + + +void test_checkGameEnd(void){ + + + + int maxScore = 5; + + int score1 = 4, score2 = 2; + + + + + + int result = checkGameEnd(score1, score2, maxScore); + + + + + + UnityAssertEqualNumber((UNITY_INT)((0)), (UNITY_INT)((result)), ( + + ((void *)0) + + ), (UNITY_UINT)(23), UNITY_DISPLAY_STYLE_INT); + + + + + + score1 = 5; + + result = checkGameEnd(score1, score2, maxScore); + + UnityAssertEqualNumber((UNITY_INT)((1)), (UNITY_INT)((result)), ( + + ((void *)0) + + ), (UNITY_UINT)(28), UNITY_DISPLAY_STYLE_INT); + + + + + + + +} diff --git a/build/test/cache/test_clearScreen.c b/build/test/cache/test_clearScreen.c new file mode 100644 index 0000000..74ec6bf --- /dev/null +++ b/build/test/cache/test_clearScreen.c @@ -0,0 +1,73 @@ +#include "src/main/c/Pong/pong.h" +#include "/var/lib/gems/2.7.0/gems/ceedling-0.31.1/vendor/unity/src/unity.h" + + + + + + + + + + +char screen[20][40 +1]; + + + +void setUp(void){ + + + +} + + + +void tearDown(void){ + +} + + + +void test_clearScreen(void){ + + + + int i, j; + + for (i = 0; i < 20; i++) { + + for (j = 0; j < 40; j++) { + + screen[i][j] = ' '; + + } + + screen[i][j] = '\0'; + + } + + + + + + clearScreen(); + + + + + + for (i = 0; i < 20; i++) { + + for (j = 0; j < 40; j++) { + + UnityAssertEqualNumber((UNITY_INT)((' ')), (UNITY_INT)((screen[i][j])), ( + + ((void *)0) + + ), (UNITY_UINT)(33), UNITY_DISPLAY_STYLE_INT); + + } + + } + +} diff --git a/build/test/cache/test_is_Valid_tile.c b/build/test/cache/test_is_Valid_tile.c index 6ad87c9..5911aa4 100644 --- a/build/test/cache/test_is_Valid_tile.c +++ b/build/test/cache/test_is_Valid_tile.c @@ -22,7 +22,7 @@ void test_detect_not_valid_tile_left(void){ int tile = 0; - int direction = 1; + int direction = 2; int result; @@ -78,13 +78,13 @@ void test_detect_not_valid_tile_up(void){ -void test_detect_valid_tile_right(void){ +void test_detect_not_valid_tile_right(void){ Minesweeper_Board board = initialize_minesweeper(); - int tile = 0; + int tile = board.width * board.height - 1; int direction = 5; @@ -100,7 +100,7 @@ void test_detect_valid_tile_right(void){ - UnityAssertEqualNumber((UNITY_INT)((1)), (UNITY_INT)((result)), ( + UnityAssertEqualNumber((UNITY_INT)((-1)), (UNITY_INT)((result)), ( ((void *)0) @@ -110,13 +110,13 @@ void test_detect_valid_tile_right(void){ -void test_detect_valid_tile_down(void){ +void test_detect_not_valid_tile_down(void){ Minesweeper_Board board = initialize_minesweeper(); - int tile = 0; + int tile = board.width * board.height - 1; int direction = 4; @@ -132,7 +132,7 @@ void test_detect_valid_tile_down(void){ - UnityAssertEqualNumber((UNITY_INT)((0 + board.width)), (UNITY_INT)((result)), ( + UnityAssertEqualNumber((UNITY_INT)((-1)), (UNITY_INT)((result)), ( ((void *)0) @@ -142,7 +142,7 @@ void test_detect_valid_tile_down(void){ -void test_detect_not_valid_tile_right(void){ +void test_detect_valid_tile_left(void){ @@ -150,7 +150,7 @@ void test_detect_not_valid_tile_right(void){ int tile = board.width * board.height - 1; - int direction = 5; + int direction = 2; int result; @@ -164,7 +164,7 @@ void test_detect_not_valid_tile_right(void){ - UnityAssertEqualNumber((UNITY_INT)((-1)), (UNITY_INT)((result)), ( + UnityAssertEqualNumber((UNITY_INT)((board.width * board.height - 2)), (UNITY_INT)((result)), ( ((void *)0) @@ -174,7 +174,7 @@ void test_detect_not_valid_tile_right(void){ -void test_detect_not_valid_tile_down(void){ +void test_detect_valid_tile_up(void){ @@ -182,7 +182,7 @@ void test_detect_not_valid_tile_down(void){ int tile = board.width * board.height - 1; - int direction = 4; + int direction = 3; int result; @@ -196,10 +196,74 @@ void test_detect_not_valid_tile_down(void){ - UnityAssertEqualNumber((UNITY_INT)((-1)), (UNITY_INT)((result)), ( + UnityAssertEqualNumber((UNITY_INT)((board.width * (board.height - 1) - 1)), (UNITY_INT)((result)), ( ((void *)0) ), (UNITY_UINT)(91), UNITY_DISPLAY_STYLE_INT); } + + + +void test_detect_valid_tile_right(void){ + + + + Minesweeper_Board board = initialize_minesweeper(); + + int tile = 0; + + int direction = 5; + + int result; + + + + + + result = is_Valid_tile(&board, tile, direction); + + + + + + UnityAssertEqualNumber((UNITY_INT)((1)), (UNITY_INT)((result)), ( + + ((void *)0) + + ), (UNITY_UINT)(105), UNITY_DISPLAY_STYLE_INT); + +} + + + +void test_detect_valid_tile_down(void){ + + + + Minesweeper_Board board = initialize_minesweeper(); + + int tile = 0; + + int direction = 4; + + int result; + + + + + + result = is_Valid_tile(&board, tile, direction); + + + + + + UnityAssertEqualNumber((UNITY_INT)((0 + board.width)), (UNITY_INT)((result)), ( + + ((void *)0) + + ), (UNITY_UINT)(119), UNITY_DISPLAY_STYLE_INT); + +} diff --git a/build/test/cache/test_playerInputMovement.c b/build/test/cache/test_playerInputMovement.c new file mode 100644 index 0000000..d38ca76 --- /dev/null +++ b/build/test/cache/test_playerInputMovement.c @@ -0,0 +1,83 @@ +#include "src/main/c/Pong/pong.h" +#include "/var/lib/gems/2.7.0/gems/ceedling-0.31.1/vendor/unity/src/unity.h" + + + + +typedef struct { + + int x; + + int y; + + int speedX; + + int speedY; + +} Paddle; + + + + + +void setUp(void){ + + + +} + + + +void tearDown(void){ + +} + + + +void test_playerInputMovement(void){ + + + + int paddlePositionY = 10; + + int userInput = -1; + + int expectedY = paddlePositionY - 1; + + + + processPlayerInput(&paddlePositionY, userInput); + + UnityAssertEqualNumber((UNITY_INT)((expectedY)), (UNITY_INT)((paddlePositionY)), ( + + ((void *)0) + + ), (UNITY_UINT)(27), UNITY_DISPLAY_STYLE_INT); + + + + + + userInput = 1; + + expectedY = paddlePositionY + 1; + + + + + + processPlayerInput(&paddlePositionY, userInput); + + UnityAssertEqualNumber((UNITY_INT)((expectedY)), (UNITY_INT)((paddlePositionY)), ( + + ((void *)0) + + ), (UNITY_UINT)(35), UNITY_DISPLAY_STYLE_INT); + + + + + + + +} diff --git a/build/test/cache/test_pong.c b/build/test/cache/test_pong.c new file mode 100644 index 0000000..7e1dfbf --- /dev/null +++ b/build/test/cache/test_pong.c @@ -0,0 +1,51 @@ +#include "src/main/c/Pong/pong.h" +#include "/var/lib/gems/2.7.0/gems/ceedling-0.31.1/vendor/unity/src/unity.h" + + + + + + +void setUp(void){ + + + +} + +void tearDown(void){ + +} + + + + + +void test_input_all_5(void){ + + + + int a = 4, b = 5; + + + + + + resetScore( &a, &b ); + + + + + + UnityAssertEqualNumber((UNITY_INT)((0)), (UNITY_INT)((a)), ( + + ((void *)0) + + ), (UNITY_UINT)(21), UNITY_DISPLAY_STYLE_INT); + + UnityAssertEqualNumber((UNITY_INT)((0)), (UNITY_INT)((b)), ( + + ((void *)0) + + ), (UNITY_UINT)(22), UNITY_DISPLAY_STYLE_INT); + +} diff --git a/build/test/cache/test_tictactoe.c b/build/test/cache/test_tictactoe.c index 7971f22..e69de29 100644 --- a/build/test/cache/test_tictactoe.c +++ b/build/test/cache/test_tictactoe.c @@ -1,105 +0,0 @@ -#include "src/main/c/GameTic_Tac_Toe/tictactoe.h" -#include "/var/lib/gems/2.7.0/gems/ceedling-0.31.1/vendor/unity/src/unity.h" - - - - - - - - -void setUp(void){ - - - -} - -void tearDown(void){ - -} - - - - - -void test_if_not_identical(void){ - - - - char result; - - char a = 'a', b = 'b', c = 'c'; - - - - result = checkLine(a, b, c); - - - - - - UnityAssertEqualNumber((UNITY_INT)(UNITY_INT8 )((' ')), (UNITY_INT)(UNITY_INT8 )((result)), ( - - ((void *)0) - - ), (UNITY_UINT)(22), UNITY_DISPLAY_STYLE_CHAR); - -} - - - - - -void test_if_identical(void){ - - - - char result; - - char a = 'a', b = 'a', c = 'a'; - - - - result = checkLine(a, b, c); - - - - - - UnityAssertEqualNumber((UNITY_INT)(UNITY_INT8 )((a)), (UNITY_INT)(UNITY_INT8 )((result)), ( - - ((void *)0) - - ), (UNITY_UINT)(34), UNITY_DISPLAY_STYLE_CHAR); - -} - - - -void test_checkLine_horizontalerGewinner(void) { - - - - char result; - - char a = 'X', b = 'X', c = 'X'; - - - - - - result = checkLine(a, b, c); - - - - - - UnityAssertEqualNumber((UNITY_INT)(UNITY_INT8 )(('X')), (UNITY_INT)(UNITY_INT8 )((result)), ( - - ((void *)0) - - ), (UNITY_UINT)(46), UNITY_DISPLAY_STYLE_CHAR); - -} - -} diff --git a/build/test/dependencies/pong.d b/build/test/dependencies/pong.d new file mode 100644 index 0000000..9bafeb3 --- /dev/null +++ b/build/test/dependencies/pong.d @@ -0,0 +1 @@ +build/test/out/c/pong.o: src/main/c/Pong/pong.c diff --git a/build/test/dependencies/test_checkCollision.d b/build/test/dependencies/test_checkCollision.d new file mode 100644 index 0000000..598f40e --- /dev/null +++ b/build/test/dependencies/test_checkCollision.d @@ -0,0 +1,4 @@ +build/test/out/c/test_checkCollision.o: test/Pong/test_checkCollision.c \ + /var/lib/gems/2.7.0/gems/ceedling-0.31.1/vendor/unity/src/unity.h \ + /var/lib/gems/2.7.0/gems/ceedling-0.31.1/vendor/unity/src/unity_internals.h \ + src/main/c/Pong/pong.h diff --git a/build/test/dependencies/test_checkCollision_runner.d b/build/test/dependencies/test_checkCollision_runner.d new file mode 100644 index 0000000..8caa0f9 --- /dev/null +++ b/build/test/dependencies/test_checkCollision_runner.d @@ -0,0 +1,4 @@ +build/test/out/c/test_checkCollision_runner.o: \ + build/test/runners/test_checkCollision_runner.c \ + /var/lib/gems/2.7.0/gems/ceedling-0.31.1/vendor/unity/src/unity.h \ + /var/lib/gems/2.7.0/gems/ceedling-0.31.1/vendor/unity/src/unity_internals.h diff --git a/build/test/dependencies/test_checkGameEnd.d b/build/test/dependencies/test_checkGameEnd.d new file mode 100644 index 0000000..0d4bf78 --- /dev/null +++ b/build/test/dependencies/test_checkGameEnd.d @@ -0,0 +1,4 @@ +build/test/out/c/test_checkGameEnd.o: test/Pong/test_checkGameEnd.c \ + /var/lib/gems/2.7.0/gems/ceedling-0.31.1/vendor/unity/src/unity.h \ + /var/lib/gems/2.7.0/gems/ceedling-0.31.1/vendor/unity/src/unity_internals.h \ + src/main/c/Pong/pong.h diff --git a/build/test/dependencies/test_checkGameEnd_runner.d b/build/test/dependencies/test_checkGameEnd_runner.d new file mode 100644 index 0000000..74bebf4 --- /dev/null +++ b/build/test/dependencies/test_checkGameEnd_runner.d @@ -0,0 +1,4 @@ +build/test/out/c/test_checkGameEnd_runner.o: \ + build/test/runners/test_checkGameEnd_runner.c \ + /var/lib/gems/2.7.0/gems/ceedling-0.31.1/vendor/unity/src/unity.h \ + /var/lib/gems/2.7.0/gems/ceedling-0.31.1/vendor/unity/src/unity_internals.h diff --git a/build/test/dependencies/test_clearScreen.d b/build/test/dependencies/test_clearScreen.d new file mode 100644 index 0000000..7f5431c --- /dev/null +++ b/build/test/dependencies/test_clearScreen.d @@ -0,0 +1,4 @@ +build/test/out/c/test_clearScreen.o: test/Pong/test_clearScreen.c \ + /var/lib/gems/2.7.0/gems/ceedling-0.31.1/vendor/unity/src/unity.h \ + /var/lib/gems/2.7.0/gems/ceedling-0.31.1/vendor/unity/src/unity_internals.h \ + src/main/c/Pong/pong.h diff --git a/build/test/dependencies/test_clearScreen_runner.d b/build/test/dependencies/test_clearScreen_runner.d new file mode 100644 index 0000000..0f74b3c --- /dev/null +++ b/build/test/dependencies/test_clearScreen_runner.d @@ -0,0 +1,4 @@ +build/test/out/c/test_clearScreen_runner.o: \ + build/test/runners/test_clearScreen_runner.c \ + /var/lib/gems/2.7.0/gems/ceedling-0.31.1/vendor/unity/src/unity.h \ + /var/lib/gems/2.7.0/gems/ceedling-0.31.1/vendor/unity/src/unity_internals.h diff --git a/build/test/dependencies/test_playerInputMovement.d b/build/test/dependencies/test_playerInputMovement.d new file mode 100644 index 0000000..a22d018 --- /dev/null +++ b/build/test/dependencies/test_playerInputMovement.d @@ -0,0 +1,5 @@ +build/test/out/c/test_playerInputMovement.o: \ + test/Pong/test_playerInputMovement.c \ + /var/lib/gems/2.7.0/gems/ceedling-0.31.1/vendor/unity/src/unity.h \ + /var/lib/gems/2.7.0/gems/ceedling-0.31.1/vendor/unity/src/unity_internals.h \ + src/main/c/Pong/pong.h diff --git a/build/test/dependencies/test_playerInputMovement_runner.d b/build/test/dependencies/test_playerInputMovement_runner.d new file mode 100644 index 0000000..c2f9cb9 --- /dev/null +++ b/build/test/dependencies/test_playerInputMovement_runner.d @@ -0,0 +1,4 @@ +build/test/out/c/test_playerInputMovement_runner.o: \ + build/test/runners/test_playerInputMovement_runner.c \ + /var/lib/gems/2.7.0/gems/ceedling-0.31.1/vendor/unity/src/unity.h \ + /var/lib/gems/2.7.0/gems/ceedling-0.31.1/vendor/unity/src/unity_internals.h diff --git a/build/test/dependencies/test_pong.d b/build/test/dependencies/test_pong.d new file mode 100644 index 0000000..de38849 --- /dev/null +++ b/build/test/dependencies/test_pong.d @@ -0,0 +1,4 @@ +build/test/out/c/test_pong.o: test/Pong/test_pong.c \ + /var/lib/gems/2.7.0/gems/ceedling-0.31.1/vendor/unity/src/unity.h \ + /var/lib/gems/2.7.0/gems/ceedling-0.31.1/vendor/unity/src/unity_internals.h \ + src/main/c/Pong/pong.h diff --git a/build/test/dependencies/test_pong_runner.d b/build/test/dependencies/test_pong_runner.d new file mode 100644 index 0000000..ae30bd9 --- /dev/null +++ b/build/test/dependencies/test_pong_runner.d @@ -0,0 +1,4 @@ +build/test/out/c/test_pong_runner.o: \ + build/test/runners/test_pong_runner.c \ + /var/lib/gems/2.7.0/gems/ceedling-0.31.1/vendor/unity/src/unity.h \ + /var/lib/gems/2.7.0/gems/ceedling-0.31.1/vendor/unity/src/unity_internals.h diff --git a/build/test/dependencies/test_tictactoe.d b/build/test/dependencies/test_tictactoe.d index 9b5c05c..f4ff40e 100644 --- a/build/test/dependencies/test_tictactoe.d +++ b/build/test/dependencies/test_tictactoe.d @@ -1,4 +1 @@ -build/test/out/c/test_tictactoe.o: test/test_tictactoe.c \ - /var/lib/gems/2.7.0/gems/ceedling-0.31.1/vendor/unity/src/unity.h \ - /var/lib/gems/2.7.0/gems/ceedling-0.31.1/vendor/unity/src/unity_internals.h \ - src/main/c/GameTic_Tac_Toe/tictactoe.h +build/test/out/c/test_tictactoe.o: test/test_tictactoe.c diff --git a/build/test/out/c/pong.o b/build/test/out/c/pong.o new file mode 100644 index 0000000000000000000000000000000000000000..7ed86630a048f1c84e507c672c30c67d0387f924 GIT binary patch literal 15192 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 literal 0 HcmV?d00001 diff --git a/build/test/out/c/test_checkCollision.o b/build/test/out/c/test_checkCollision.o new file mode 100644 index 0000000000000000000000000000000000000000..dd26e7b704226fe3cdef5e944336f530f58280ba GIT binary patch literal 11104 zcmb_i4RBo5b-r&`>s@JO{jFq6Hn!I;HgYGg^pQo#lC{IvVD+IY3A zzI{)&=?o?{p*5Q6*v$|iKQlCGCNR?uB?B|0A%Vm+(7;TcCX+D@ZCyiJlR^u%8!|wK zo^$WHtEZ#&z;t?N_PzUk_uO;NJ@?$Z@7>*#sgc2eVF+Ceu}>@_%?c6UvRLnx)n3se zn#Gm+_3uv(o&Lp{yUtap4xM_d_r=u38tCw1>J4?fjOt%Zy`^sNbV+nowf#CI(T56M z1Rxd;UR{{HI<(+j99l?S9yXou4>`>Me@M%&Wz5&d~Dm=fCI$u`U?pKJt$+b6PpFq=37g9eh zYwE11X(9E_smsRc)WwC=)l<(y<&BRU?}dfbg|gC{{YuN@MWv|glPi5~A@y2W>7I&8 z&-~rFODlw^f<_@CGTCZn-FN9h7pTZ;U_;YRz`=3248x}iFJTdigy9Z1oEEX--e9P@ z02N6F!!1~cPAGd1d}OD3Ar%HA!P|g}z(>4PwK4J>+-0|_8|rbc2yCs!hF;aOtpT+R ziR!9QuHY&?RqgBl0m$G3aJd8@X#+emq~=gS`B$ZG28CEa;UfzMR0gFb()fLSvF;28yuNZ+1UU@B4o1uv*6sSdY&5#;JH`jJo7 z)#E)H=>&mj1RH{w73de`TQsr_0EykcSWQD!%HE@8W1>MSJ6-nxP*FMAig`dXs=lyT zuU#YaEchc3e-1v4qV_4-^G0x?_64ZQF12gdU~5yj>K)J@e#kIB4Oxi0n`oBTMtN=W zF|D$Gy}WLe*G)cVtE~6QYrnh>$m@{2o|V@>gRdYctw#7~M&y6MUJJtT1)~xDBJ`?4 z5!Lo{g&GukO`%qW{@G}`2L=^a=wFOhL|YZQs8EMO|Ekaqg)S-7tI+ET4Jq`dvGRxD z%D9lLHvG1+0pk+H;H`vx0HTT8fogm<5JOIZ@A|>_{NOo1_`VRC!48503ic2jQgAoH5wTXPZ!5bRMGVFGifU=8 z&?1aRV{=_B8mwDe*Jw0_8(_SFRU%loE4n+nGdc_j95jsKm;sfljbb>K1g)X#MKrn( z`aqClMl`BqQ6#+5*L4SoMq);=&M#3-ePJK3sRuQ%y77jFYPW!XNUUz9BZTH}Y1;!) zt6TI4_Kz5}BilfN(oZGWxDm$NRAuaoqDt@!l%QX+tFxD*n2`#p?kjK&*db|pV zh#ox>s}sg8Z8{(~v|*HbTff-fhI(85E(Bmg+Wf-9u{~014bIfsgjlZTp?=JX8{wnU zN`AWmQpNv(p*g&-1L2^!9~P%!d{DO%uJYj+v1^yyR1uHYSS&lbGoRL(7Z0+FP9V$NPFsCwmdQ^{;Py|A07!)2PKTowq^1q>T$xeazM>9!IpxtWYT4Ru(P(u4_*MYdD0@+BZ)Nt9g2 zOS|Ua@JLE2TCB}l?hJ6C5VYiqR6S8LZN~w(&@j$hs8Lj_`2!GaHbTaIq2_%d<5XzF zzEI6~LbZ{Yy*5?Z|{RJ$kCyq7Amy|OV7_Si!UE}7(YfK#iOwEn z2TfEO*(At-g}jw5mBWDQ%(Ul#?|E+)A`Ia#4?{)=I`wpmj2cHJwIBciGmH5QP9Y>Z z)YZM;%F|rH#Ee^|Qbo66#DSXAj%~vX z$gD8Uc`GkUbFhYQSGU8s@+Rk0V3u|SlgFH#Ys*YqT(6=8OQ-;ANF2*$+!-M=EWWI3 z$(py-^!r@JX%;dBM_BY+(KiJ-Ip|okwn)wtXYFLhn$KmD z1I4sA3+tnl96vaDTXNhfe%3x(c|svoVQLPHPR93l-W=bV=uULR+h<*`VDHV^Foawh zpyi}z_QDq1-qRg#&&J!QtEon50>&bksa%l}wCKMl9VZ)jTXorb82BxAq-KnG=;Z zR+*1#mSm>FoMAv|pTNCPOvxmxu#hp`VM$EO^@Ed2`y$MO%ru>ia#@t;S1!s*X}*7` z?^d0b1GWn@4Z8$wI9mAMJLm)RkcMVMZ}E7_SYTo}0S^d9fpmNQU1R*?H; z)|!>WQM*B9|0!@PieOKGEsT7n>4atoqTW34`%+IX#%B~)rEd!LL@VoJ#?EDD)TXSG z^P1l#=+X|E+48|B>4Ng*4-ewN{{6e+TPLTyg6pY;+}`O))Ok-=N1~%U(X~zS^3(@k z7vYHkmp*>SKM&6U_>duse4T@uardplINo5atqn)cz|+Zfz~KiAJU9xGs%yAEuz%%> zeh>hNZFt;-MZ(z$Bg6gEE0*~jW%S%u!J71GRL3O;atV2+pBUIq!i+%-OzOXLg@!hV;7aut% zz^x-*V}0L3{3^I(iPJ;hE~rGXJ+oLgDhi zRP-|WRg`jEez%YJ>p$Y-{r-I3$NS}<_VIrCfAsNw`5Kxh?oZOk`{ng}GG?l-<4|>m zB3})kaaux+*a$`QSE!RbTk-KRl9%TIz@xk50@Q@qCa+45|4lIA1CDOWn$G zeuC^?VSFF)?=wC?{_CHT^nATa`d3i9=Jh&nV*DU}F+kbM_^rfuGrmarb^dGpI*)sq zd>6&xAmdZYthj^mSBalu{BJ1!S;ns=KTC{%obXA;KS2I3Fy10RA7cC<$^Ql8@t_jR zlZ;=lXz@M9-$eLj#*dT#7a0E|oj;8KW6FpBW_&yO`4Qvs2NW!|)KAZs-jCWC{{zBX z82^2xMr>#NXUP9v#($3dImq~K()0U_zmELQGX4r-m+?O%`Oh)_Eb)KJ_+OJhUuL}C zcOGN>+k~HH{3X(_v#8W`V5 z`qwjl73ukH#_y*1bTPh}^dDyYS1Aq|#=lN_PBMN2={d`IgYZ`wzlQvOobiv6p7V_N z$nJkI{zLNfUB)}4|2@X{lf2$jzl;2Nnepc-5B2x0j`L>X|DDN4 zD4xG!e3~4Mk$tV_66uLE{=X=%^gL_%-y=P{nEX@Z{{hBdPkJU8e~I*1jMw8YFg{1} zUt+vP{(qD4GsHj5_+OGg7a9LJ$-m9`b2P3G82>KCH%#q1K5fL;5s&6jwSF$z%;d*N zzMJt!3GZk8qvXdS#{VbHyUq9?Q`|hppCdi@G5%%ZzrgsP5dSsC|D5=5F@782Z_{1J zAxi$d!sLq-|DP~<5--0~V4TUMY|`(LTECWmkmi~5aS}jtWKuG{jMsi1VZ5G4ktm&* zg_AS5yNEbM&$BIM&4n-4iWvap@eq#-1QO_6(dW;Q`YB zONoOPj4e%9S!XZR`0sEu9c4NEc@0h&Xk?cU7$FcRTq5F5oT1Q`!Sk zW!^ujnuI&IeGdLAp}^0Xpc!{PGvw zPv1{Nqpthq=JY|SpR6GJ2yo~k3zN|O*s?`4o N`TreXU##-}{|ol^|F-}D literal 0 HcmV?d00001 diff --git a/build/test/out/c/test_checkCollision_runner.o b/build/test/out/c/test_checkCollision_runner.o new file mode 100644 index 0000000000000000000000000000000000000000..747c52eec47f696ed8bc57d970a5b8429d1d2e87 GIT binary patch literal 11040 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 literal 0 HcmV?d00001 diff --git a/build/test/out/c/test_checkGameEnd.o b/build/test/out/c/test_checkGameEnd.o new file mode 100644 index 0000000000000000000000000000000000000000..1a23238d25487be748aedb7d06debc4349798264 GIT binary patch literal 9912 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 VlB7WH({S~lBmWPV)IK@>{{hhhsviIV literal 0 HcmV?d00001 diff --git a/build/test/out/c/test_clearScreen.o b/build/test/out/c/test_clearScreen.o new file mode 100644 index 0000000000000000000000000000000000000000..53e83a8803085c541dd97be11e26a7c226ac7efd GIT binary patch literal 10104 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 literal 0 HcmV?d00001 diff --git a/build/test/out/c/test_is_Valid_tile.o b/build/test/out/c/test_is_Valid_tile.o index aeddeac346154c937d2cd76ff9bf05cd06cf7578..ac4d5d3ad495fc54bf3ee1dcc05c98c852680e99 100644 GIT binary patch delta 3808 zcmZ8k3rtg281A`%r3C~5y}ekWr9g`!wZMGLO#xRKIGy;4Q)8@;ISo{#Kh=K7sbu#V2O|E7I9{SMUyeNFwre`o0=_5cW&>0==DFz?Y-yw{{QW%qGqz5?8DlU=O~u-D zz3DthqnbYTYx8QHx8uA9=V$$f5n=zO5p`hZlm*M4*7Fg))i?!v`2Mz(e^03|K7eEIhDel-|UA!ijo^Chd@>B@B_8k7=b?~;;67H0G0b8uR4tQkk zVedfKC|NnemDHgMrSfCoi8jtcD`)$4Y_g6`1y8!HOvY@f?`-gKcB_un`?iIBzt^$) zxOc<83f8MC>wTv|h%49XSiNsO*fV71w2syL_Nc!8$2wN;n}VHGPs4SUmgsQ3+6o<> zqO;$n!}a-=$~j(gf^FxEWiwaM&n_{ZjE zry$qvR_39y3$qs4j)xk%th|IelL`AgwAy9KVua7^)4}G5h1kp_B@U(DAjTf>WXj5F zlxiSs8Tc~gv~*+-5q5|K&6)Y^3+Uhy;xXAxjE+KxOXOjH|0HZo3}ia;l>}_Cf@e|a zYFOiNE8_WHOxUGx(ov>dMd@0?u7qJ(vLY1s5cXRr$#Sy`P?IIIYN*e0E4y&HZW7D2 z(8YBaMtMls+rYAARMny@K|7ZCg+#(0I`+0eveeTiOv!d{0C z9_vR$1B5kTbw>&A#rZXY&jEXmtZc_jLWHe^O3r?bi}@d6Uw}H!UdB7lgqu_J=olIANX8nZpvEclhjcx^egJ2jZe$<3ju;R{}g}8_%{*YG@doOs#L}I;1*Z}y(L}DE# zYzXT)Mq-JVg0G0Z7dmvYekN=HLb_N{SfA)gqj;ntF6t65CU#=)h0450UB!eAKwVy> zE+1i^;9tgTB$jwN@)LV6^y*?AAZ!4Jjg7=QPuO&fb%Dgn$9iuOdoR?Cjnp+j*Z{P0 zR@@t-`1_(dL=P>{HCFZ?)Ih^z!g_HRRS;aavz}>f&;3E1Kf*;ZB{f2ju5K9>T z0N_dOBMu^=HiC>x59g zTp{j1{*D|TYLV(8_JEDxVjmV0T!{{5x^u!G7Zu~in=Q7m8vlfX-Q&hfx5J+t&^^v2 zE-fCH`8KXtf(a@-+{dB$#3sRR&v@y60(5$&Nacwj6-;G?P+Bm>v^h~T`2*?;CUUHk zW2@D-L_T`JR5(E@PJ`0IDNAgspg8UT delta 2893 zcmZ9OZERCj7{_<+x|eQ6=zyJGI=7W|eHmNtDy-|Gnca+F1=I~`*arzqFcA#lC48{^z>9!*y89g4JU6**&;R$F z=l?wCoaWw(>poerBV=5+`kR&tfi5G^pT362LaBeL z{|Ez1Tnk+J@oQ!H+O^m?T?X%j#iAy?VZsfeEZ}Ra7W>m1CpH*}Rz~q zJmpzOdX4A4z}wTl$8oR67%svQZ>_k57H^$+pgz55X!9JasW+0^<}YPmRV0drgk6W$ zACcZ|*t)K}Ud83&FK8XRYe!L2?Z!WKH8@l2#r~>N_1lH5o{5fSZ>@h5vVK%-K(=0* z`^dzha!yhAgGcst3>iiLETB~d)Ig6->aPH3Wxu*(fq3`+ex&Ic> z!nq;1r%Ut2VtWC&?=o~vm+&-%goUmK%Xy39O!Rk1>}W_Nb>0Pbf}#rb?Ns+q)Mp>l z$Ec1?Os|FMx6E@y4>CH8KEF&JrxW)hqa&nWW%|n{ws4E-ab)~bT*Ro~5_{lmw9Hz{ z5TdGe7e(l4lx8dCd6H2dQjOBMQi?r|v&C`Z<)OTmssR191ThHDyg>_{T!DS z9ikd^XS)6j++mqKPfONBQJUV#9b|Pq!Sv6_V-eGxSRIz;AZ6Rc=vNp}UZ+Xj$LKG# zhMzJ$Oyl!Rk3lp^b2(L#Wz>tPqDN?LA2J$3pQ0c~Cv~a29znmN@6l>cWwa8RCYjto zbA627COydX64G0kz68D*mY9g18B#36a`k%@yJuKtH@UB8@floJk?-Q3iqTJwFIdbo z=xUbcO>#WT=pw9EbePud8lz`0&}^yvBh6AQ#*Jpne3dGhL%XV1X$PV$me__q^|=!L zEz;DdWEYEEg-pvFGeGLkjCR8pk;#>`LpK=BJz8?t-=ya@G*`NQq?A#Yx~ecz5ovCr zYyn17II6t%>W&z#%^9id1=6*beyqLD;=^!Td9TfkrqE^Oy$&*}PxE2sr5~-|vG_0s z3cRi`n!-qdS26Xc*W?3z`bpP)Md;t*WAR}`Tl0M-7)_zCHQ!esqgQC3-e6uI+e=%t ziN%MJDe(G;(G;=;Uf(dfmCo=F%&VHb{$TN8^hEQ0JzzA2l%o1eC2V60K!DwF0UvY@`v8NmxW3h^OojvpVV>lU$8TTtO7VC5_oM5Z1$a*JZUVEd6 zU`>0cb2I6KIME(g+L+QplkC_7=!myF&q{mLJU(+<+;7~Gx%bChF~6$OU5T-Hr_?!38g)+>uM_f#Cw zpXy%$>nCUhw)^k?>2~WEL>Rir!*#|n-C&F&SO!L|*iLF8)BRD`eu#e8;e)^81 zD5Ir#vcBPCz8B&t7ai9_EhZu;&~zYms-QMJjN$#+xKrHs#7EvY)YMCW$dCV`I zK-h5%YL1fWDe0b)6cLQlr$8Kb*c`J4q}Kp4z0{(#qIs=$a0wtrkK~Hgk?THddC&`k z_DLtUh8OT~$d4QHmH@TYgtex;LFmv@fk`dYUmS8J|KpPM4B<;3hrhT%#7}X9PpTx8Ctj7eHj9Q99m24VkRhrKlQpFV#)XWy~ zp-PxD;3^%=nb4-&ITKR~-+YAD6fb?urEx?d%o}(>p+np)^C5Xd+Plq}{+^ooq7=4& TF2=r)w7V#kHAibWZ`S0$9x}Ea delta 572 zcmX|7F=!M)6y5*V%Vp239-FYYo9wX(m}I%V-B?7<9Jt3J3WCULl_DWQ35tzkWm1SJ zSXn5qO%bqBxgs(_FnEZZMGC=GLBUoy3n8UgIkS7ohk5V6dH>J+nXQ%n(u;um!MoZo zD)u!Q%ROAkg*#keBQ&q zFrjHI)LYywVWXb#*;(w?6XQ=Q@3BEqgI8zKj1tnZ9<}HZK13~kYvotP0dHGq#tH9R i*pT#49uOzS-e`WnYtUT7xL?Ut2W_b)gIx7Mq5mH_5PgXN diff --git a/build/test/out/c/test_playerInputMovement.o b/build/test/out/c/test_playerInputMovement.o new file mode 100644 index 0000000000000000000000000000000000000000..0c89b5eaf74fc479ad2bdca61211a1b8f1503638 GIT binary patch literal 10048 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 D+bt}K literal 0 HcmV?d00001 diff --git a/build/test/out/c/test_playerInputMovement_runner.o b/build/test/out/c/test_playerInputMovement_runner.o new file mode 100644 index 0000000000000000000000000000000000000000..870cc108415fbb7b4be46ed220ddb284278fc349 GIT binary patch literal 11064 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 Q3h6&f{y*x`#j2|RANoDb+W-In literal 0 HcmV?d00001 diff --git a/build/test/out/c/test_pong_runner.o b/build/test/out/c/test_pong_runner.o new file mode 100644 index 0000000000000000000000000000000000000000..77ffebfcff6b8cf3a37413281d2202974b940a5a GIT binary patch literal 10992 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 literal 0 HcmV?d00001 diff --git a/build/test/out/c/test_tictactoe.o b/build/test/out/c/test_tictactoe.o new file mode 100644 index 0000000000000000000000000000000000000000..a704cef39b432ce02f8192860fae3f3a5397f402 GIT binary patch literal 1488 zcmbVL&2AGh5T0~P`8@z9BreMdkgzw2q7smbRtiuK1@#hv5K^^q-0ZelyIR}OT;SC> zapqCr31FPq%GSFRexDpx@`Rsi&|K-nevWj(bjGygl)?VHaXjihji1p0?Z%|k zM)18E7rZJMx>?2Yz4PHN*&W1W7L(&lEdNzJi* zMU=)w%UT84JX5(37gAt=9oKw-{n6-o{AfHeLYvi*NY5<2-q(JYb_cZoc!j$*Y@@!7 z>k2Ns3SfJ_TP(u$FR{JdhTnhMa-!DG+nTlJ*ND-E-6GtfO`_##n~?~vHbF!pxV8b` zY2u9m167L>Cxlv8E1i2w^K%V!n&}MaL@6}+#LSN7h2Y-CRG>_j_CWy^I9ZB)#>wKO zoj((X;>^!@r5DWuT@JaAG&`g4hUtcK;lJ|0@xyoUzx;>Dw_U$1|B2fl)dfi}cxxv- z{}4kK>#kFlR_gp80q*%;k1*cG-*E}{e0A|WuMaTj?Rs9n4Q$E%gqVHJ;U6<}{1{_( z317HP3%NG`gX8~l~qfXXYAMsB$p~A0pdH`INv0>#Ia+86FbC)q!5<9yS?*~yFIhJ z=fr6VQ7mW(g$Aj#p$Z~tMM0=Y6|^d}l%ymo5o-T{st5|=n>O@Ah^C^5g3|Y9-rTJx z=YEcKJM;U!H*em&`PiAY@8}umEz>k6lg8GuB9bg)p)VE7QC^I)X4b^c*UtNFr0?zz zUhqqKvD8;A9@%wTYW_FHb7=J3^A|2$ICmBw_u&IMkCAiV1JZ;0?p@1k6&|}zyQbsn zZaVH7aW`j%dSUD=N0Pk!yFMA%3c*#wC^C4WUGoADxo~ z!`!o1104askGdJSsuE3!J_nXp%||Wna$p4qbpov9phbXH9E1c|&A}1@)^N}+z||bA z6ksg}BAkIJ2Yo`afrB9dHgd2-fKAQwz|UI*=$*9?z^DLy-0Lv``Z;g~xF+a_F6itgMn612nJB# z!_h~-XkG;a^#DjMS}a}*MXsBax{a)k8@s#41}ex0TQG+?Bg*#_%hhxEeDXaB>W{*& zo>d>?HJ5@5)jxnDuTnjC4oVx)c#Br~iWbPiY->bV`KnfrdW2pRC?I673sfi28v?Zm z^rqHiLn9%9-qKnSEfMH#f!YOnN1&Agy(>^up!Wpo6X-*2<}bmOA;wor*BhiHe++CpdD-G(lFm&u*ioBaw)m2AX$iFNZPU4JX=tZ1UX-n%qt;j z;dNShq_9}5BP7k!O6m%dD+=u}tzNsVrZMQNnOjq@HB{DtOJ&W>SF<{}Cb%lt4!A0Bf*&Wg$ zvt!{=jGV4J=@byU3m6u1K?eH=cU-7BZX#hOp$xBj-iQt-2Gh2Ti~}SrEXTF;aaZr{ zALtQ=ilwaKjsgb;!Ad$u#R*3@Z99{8uwfiRc*9kRp#}}_c+lUp-rs!CuWj)ACU-*eYdhCN5wa*|GoFP~Ss9FKciy&5%N>T%97tQ{)_gW* z+R)itGO4>v?;q4{(@5xJuFX)VH=Qw=9v?N*7AQe*^jJR0ob)~uv^QsRF(cEncg&2t z-MKuRlyqk_XS=8}f&t&|+Py|P!)z0xhvo`&k8N*9)ltJr@K&LY9y1(lESE6j<5N^O zriG2!%7Rd8>Qopwz=X2n^{9GFP3SfOnUbm*c= zjxlbEkbB(1;R3H@X9jmOJ(G*WlgFr&=~);Z>`gB3vJEjX+-nI_#?y(& zrd&Lqg*oO#hPI5{5E-&_x0<_M*1ZJ`>6>5{*trR|dFx21yJJOYRk$nM9%{?FdCOdz zGQr_=9H3#xN7ur}(zd)S)RqdhB@Ji7ijUekE0=fL^46ZTm1uJfm=z8P9k_7pZX2_6 zF3iN7-G)uTRFQ&s#&AZZIGwXV5KnqA3_{j$cI$f#N5`np+@Qg}c>CjfVey_*+(JgS z_7CsWw+|0qw_$USKFlY87#lvRV5BgZw9arJU`akNaj0m`LxlN^ao9M7A~_*e4Yxbe zzjc__-1S^GXeVH5iB-tUu&Q!)aVGJlL4&)=bYW;aoq>L=LE0z~6YM2~(*tq!a zlB9)&`>PBFwz(B&v8T&&1qeeF0TFhV<-1{F-EqTgb9eXZ(2|iDY=e0*tJ^yA9ChsP zY!A10g*z`7Jb&%Nrq9oActeD>fE)cOtc!-a2h=b!FfPyrM1v4u6>V z`KqU;?yj=#nH2^o0Ee=xQ3wf+AdE@*#-jWtuGH`-r^6Jf^^P5Wh^Qi&#?Ghlhm{$%p5K63M5W;iQU>RmtL%+&87QqR1yMK1G5` zK5@@1!OPplRFMxZRi%0bDuKGwq|dw3Me$RFlx@y7L#M~6f_dukf~xoP-mkDcPR z$oE!Jq)kS7U0!t565Ia2d=ZEvLt%d`p2Eh9uNJYFZ5|lhxM4sa?Css&GprA9*f`Lm zi+96DGX)11z8m(yp3P=Z5b!{Xp9VgKkAj%weuX^Tg$n$9C}Tn%b)>$IBqW>EW;)4DY7;s20h^)ZBNc;y1{~p=- zv%;UJcF!yPgT#NP@GlaUpV+0Jmr}bGR8R8!I||fkQ1~S2FHv}d_%4P22Km26;nxw4 zD*WqYXN$u3kpDL-ynL6&6n+u4n^O2;vhOJTk4gUyg};mVuPb~bVHs~3w|V5}_Z9sw zh?nzD>W`5>rxg8udIkPk;a?*BJB81ZpMOyJZ&JH|Q}{WAHClwyp9;b?3jY!LIalHL z6Td{^Pmn*$6uyi6*{JaE6F;c%D+u4D@IB;zTHzNFKd$gm@^ez*Z>DySD0~OuhZKGr z*?(N&PmrCTDEy@~j%O5JzVKgCcsXz0RC)6MPYS=D@TUs@Q_`=XaggIXNPL6Be}(WI zh0jobHz<53@dFCKnCzz%eh=wSD0~n3eW${oCOh{l{2$5A(+d9p;WG-qi|}t0{z@9J zcNBgmjn_vC|1se&6rR68!B&v`m2oEXtX1KU5|(k2`u7mOOwoUjaJRzGqPT5S_}eKy zy21~TzNPR<(wFT^e-@Fx^jGpbN&gYW&M0;GNrhiR@jR*U@_qIzg@2svyr%HAgnzH_ z^8I~Y;pO>2UM0|N{-+wUUqyb&ex0ImZ6+S|@th{pd`16d(qHP)muEbzvrN(7L^$fv z#}FT;2DU5ukCXi`EBf+Wo>lboWXDzX<@x?=ivG(Kulp2zc~3Z@=s!c_{+Oa4rFMU& z=3^i?%XRXJqEG6Dn<9>{_ZBGcGuRz+kyklR{Zsi6 zmkM34epKP5pSLKy?C$}Ej}ktv@G}0V6kd+w+X^q|13yrM41L6(oL4ODOl0Ac6y&Zg z@=;l`&5RLt&Al!Q^Uqk}7<`%y+c^QaG-1Z_Dfncc%z+Ls8?l&ej)NLjCdxLf6nvxd za_~0>Q&xfYSU8@`;zv&ww%{vd7(VI1S4jBqL>T@o5{B=SW2Ws+kR5YWPx5c4)Z_mz z3qf@pTY0~c)}mB+L=u$KbSSWRcfutTEij^RmKOaf;&IQwy7FGm{~8E*5%ILF0g3d1 zEGW6!{!);m&HuGNes4jW-Z>1A$@b+v4mnI}`|C<@sP_pzAXO=WRqL+;ol@~TL>I-g zxKJTs{LqvdziWU~Z34wEP`kG&LItv2)6^fMhT74XC#m&!fUK1NLm^Q~)<^$wzft|a z4LH>%);vy%=M?KR+o&XO2ZA6{FbyPnDGH;Uom)tW@Kws4Q z?Nq--I!YDP`ac4`RQ!*IM1@l#kT@d{SIa{1b|Ygb;!$5-%yTuA-OGeCy$@XWjM z;Zyfr9X=KOZ1~i~mEqHakdq@&yizSnX6B-yn3`W97q9ez_2JLmMvmYE9X@$6h>;s$ z@anZ6)DgEx&zGXVE2>WaMYX%(D$llo+2PM^KxzEy z-yEUCmq6}272om;Y2Qx!WharAL?LUrW#1}f92aDEvC7sMsEdi}r}Iww=xD)ptbExk z+*@{iyXbg(oMQ#obv)5GM~Ft!j?xrqrE=(TGBk4A`YKG!|V6{Wqm{E0r55TxOKAxoD-ujI^R}RCUfPi?Nd&2eX~jNYeC2ag@mN z*Op|#FnM-4+7~q=+|B5%O=wE?Il8fV8ETQs(M<%}CD=@$OM)!~;u35nuv&s`1lCEg zoxo-ZZX+PW8BGxwmXe(W#wFNA;4TSvFIozI9+6;Z!3qF*35Ln*DG5dh_!4|HWN-!C{0}MPbhorfw`+m^F3lTa^m(KG2c+{VJUbU4*JU)lYD9krX5d0nxomV` zT}H1-6qT~Sm#AH$A4}9F(d))S4;qe3^bbZCqSX?;A<;UC{!yaM61^!=N}_*~Xjr0m zjJYp@E8~JzP}5J1Wj_ShBG|!4z+vd|??Wbq&oy)+C&72Z;LpO~yJ7I>Veq{$xD*D@ zORxyzW6Uve=`~}BC`q=dE*ovam08nWj5UnCq$_I+QRISgu8X97)B`MjwJLcEHlS`P zU402!ZaAA~xE05$;p`EH;~4aYvv&!6sR-j1+P|IgBX(}=~SE~+%m4OQI?s?km((iYZe=DM(5w#)-Fu!u0jhFVvF zeV7~l(uRr6-`>3)g4R~^2$pFl$dPSlMeg01IfLxCyiukS8Yi3OxF{ zkbNaJ^mWl}dkrwsixcAZZWWB1x<@)OMyakp+yw@^63{i-^_#k@JX-EHLs398OJUqs_#E&S;9B3~>#U_zXPsZ%dSK{+DMg48hnvu!Rs>C}jLGAI-?NjyO$ zy#P-N6_E@oUb5h(i$TUo9^bst+SuP)EV#k(-kcjGCky_sqLTDaOgXa^rQu>>GMP)K zKWuo5YEvYqZ7)fBPN|YypV*XGm&{=??Km0mB-gtxacf_qFFEbFnX;D*+=721S@F{P zQOc5Cf)f>Vwc_}nDorKw7&*(T6mmdVK44gWRT*qQvHlzl!e#Y2O+e86A{{YNe9x=Ya!*V5Lyz;)#mocwVtk!G>`N;icIuhY~=f(=Zp# zoHrMoH;pHE%qQnPmBA4(j*)YEvuZ(TE4JG#w^dV zGuD*v3Dg-X6dhru^LD`nB?zE38DvGJaIXW}dy3^ryEu4!%1QeJEa(wT^oyl>p{3++CF9!C4A!|2G3$J`a?AbRFAL!c@-;(H0tc&-S{J?c?%Q?`6 zLK>j$rSrGJZq&Q6Ki->*_h#+N2{)bh%5FKR^ad_`=VW?)8>UGGgcbOfI@&wsm3^3+ zWv>^TfVrat>7rf9D=~B*1nF!D!>E+(%2Df>U9m7KJXv`3KfGts23q@stL-}z`$i5N zwDunu`^3&YgVq6>5pu|AmcamGFnQtO<{`2)QE~8iqkst06sm}62u1dUTt;MfVr1U| z0UM%Yxj~6n;~k_l=4D{g$@NKPSZ`&oHpghu@F?$gd>G?CH8~|*UmbC%xv`%o5lu~; zb?^;pWo+N(F&u%#F05$^zgiE}8`*#K6KqhUS(tGUURXRE`@D^~W+6t0<|lX- zz&a3epBl>|2}{+QvNIbXqrsuE5?0^_6(_SE=ORvfwO7GA!18hH!R3{+OJrBBK3?-M zRRY-8X!FVPy2CA6MFiX2hjTjAZ?ztzAr6C#y(rOUSzVlDSnL@X*cx9wF$ue5Am?~* zUqGnu{`Kn;>-rPx*GQhe)A6*2->k4I@I7%6-Xr*;qC|&&C>i&DLKw%}jh@z~=oxs! z-2fc^FwrS)u&w=f8wTdiu|WYilx;^LBskItq2#-2@_UenbUpcROR=Ccr>cKZ&{~4X{klpz9E`_pa$Y;z->aG2~S=XV;2Q z^k;K;9Wq-Kfls-5DI!0#XNiUZb%^(`;he^#@e)YV3^g8@w*WsT49_?o!$E0jN9V(N6AK$qS|H5_n z9|Di|yLoESoCglqfNBeh)$}%$>hZt44nGg<*3-ZBI=prfS$m7g7d372vdA0V>=$@- zqy6x)P%{7PtEqNGwDydS?bs?L`4q^B*uzrQxRnq%Eu2sqGAiS(Fwa`<3n!%TzxC$4* znACoa=X@+HepyH#Z%Y)9w}+T;UEqzve@Qdf4kHN(dEAo}{|87yLi>0FfO1S5U72iW9^V7;kp8%) z{~I8~bZ1C^Ibdb~sHVT2w1vPMAxvohBk)uD4=|7YMcay3Zw#D|>fHlH(TWd9$m8|r zBiM0BYUft`0KXdP1`p(l&$B*`5hiS&DZ*>$DfLxskV=GjY`JZU~FWJt! z8vj1G`*V$dg!vCN{x2D;Klv#?H*vdjxSrzaUK8r5`LFnstiM{*|1IYGHU0wozfI$J zFivUw2W)4r#t*XpcWeA}%uj0kCT=&U@h;o1X#9(;uhxa??-!Z>tft?|SjAiEFJ*ro z)AaE@i%HEprT=;M=c1;cH>LjfHU6&{|48HSXFuQ8_%BE^;$Jm>31fp7q4H-j<2H?N zV}E)y{!#XSwZ`M0B`|H!_Q$$MN4Zel3qzg#A+Sj4|%e_$7>&X*`=3y&C^C<82!MIO7qGmw%Lo z^MJ;$!KqVb1W|I-?uW&QISzlrsq(D;L_|BS}xxx+7N{2q?y-)g*i&%L4X zkF%YhYWy0;>b;@HMZMRXxE;l-bHf7W(QQ0$t8}BL|0A9UH;44qnH=lfs_DPW`l*n< zIt!uxh^C)rd?2KcA@1gQ<~05HxWBHZ@1t=@CpG;CS^o{r{%Mf1CMd znaAqrX9gRE^nFb~khJ(aO+Ur_+nWAqo>%{(>2F|t`QH__^W+_@7v%%1^5wK$DcT9&Iqr)D-P0x};ja=2uPgycGtOj?gTH8H z%b-JLdvelqra=uWGv(QC4(?yW9NsvqD$t%tq{}6|-WLh@hb1QgSC(+!4wtHo;je}X zxQU-~JorqPcAUJGrN0tz&;EZ|9IE3Os_!0UEyV@>&!Rl+O0D|Mtn`)O%wk!3h$jK= zF<4i9|Kc|$rd9Amo|hL=lwQyqVqT}$0*^L--THXnh&ID>6`**T8&dNNIZVobi3I%D zpscU3%Ga{N4O(Dz|F=K|T$(9Wk@GJ4M+Lao;KhjXLsP1K6~B)Hr`tpmHY+}?2{kD2 zUPR}x{(taQ=sEivuauQkee@qq>i+*GaJo&bxrY1Qstt^;TLj&D?WeeX z6(?*TzvuP#?*k5PDnFq}X+x{bkMTasbk$eo$3q~fSN{pV7{K`%PO6^D&w@~u!+Mvw zewf3uuKQ)+@E^6bFbP#Z4zh4k{a4&GP(Yh{{j1#mRi((eUjI*luNVKjIR0PfdKiB+ zsp_k7sn<4E`5FDkmJmmHVdI$tZRquJPU&kOC^60-@aldEIZS%|(5HI!X=4J}C9D)m Hdj0iqjn diff --git a/build/test/out/test_checkCollision.out b/build/test/out/test_checkCollision.out new file mode 100755 index 0000000000000000000000000000000000000000..4a9b6f9e79345bbdeec7b1a17e35d7845fb29e84 GIT binary patch literal 70360 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 literal 0 HcmV?d00001 diff --git a/build/test/out/test_checkGameEnd.out b/build/test/out/test_checkGameEnd.out new file mode 100755 index 0000000000000000000000000000000000000000..476ee5ff04506f137ec409fbc01a8d06ed61e3a9 GIT binary patch literal 69960 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 literal 0 HcmV?d00001 diff --git a/build/test/out/test_clearScreen.out b/build/test/out/test_clearScreen.out new file mode 100755 index 0000000000000000000000000000000000000000..2429c48be2a5cafc57ed0c6ae9ffc02f4094b2a3 GIT binary patch literal 70104 zcmeFa34B!5**|{o%$%7!*=Dj#Rss_iS+lT+AOr(4I6$JPqy_{5LpBWolNmr-NHm~M zV>Gd9X^Vi?w!9VG>Ouh}h?=Oh4c1!fQlp|B3|fjPsbcg0KIfc!XA!LL`+I+%-}`?* zUS-aC*7Ka_ob#OJp2;+Nif5TrRnZ@_GEE_N;o>*G)?g7 zsZKY_nR5~I_;Po_Ij(k(LLeR_BN2YFB?~YpqUY8?xkzBQutCn(ldO|uvPj!Ei zPw3wysW&=xgGP^=e=16}T$z-MPG?GfJ*6_}x$*EBRfmu7k=X9(qV# zn#5tsQx_v1QUCjuCW%W%dbr~EE2>JD>D2`$^2q@xyJ!UA2|(@$i~wShoQ?mMbKt4q zv+*xE2R{EC_}kBczv>+L!gJuefp_Cy^fM8Nv)OssIq)?6&c^RK2mT%4-S`*%R044} zJ!^m;9L)@PB>p8TnMzZWAnM~(L4Pc#?l)0c<@YrxOO`bFmX%+>q`dn2C6&u+Y6)9j zy{uko@GY;YQ&!d2)cGnEe_d6DuUw%IqWQ`jDtya)zIvs0WnI;ED^@8>fS|PD#s*)- z3dP@0TT!tJe30OLOO}+cUACmMrfykn&AJMuvb@e$i?YcWGN9hKWW_QRcS-T=85b`Z zmp8%4jmtY$wH44&wPIzR)Uiaco|O@9pfO;= ze`fwkIUN(86aG>`Q<2pNL`qFfJdLWY66epXv6HqPf?d($vhL>&*;q?u+|}_-60bE0 zK^?Ed?kIfIe8D#&3cp+83!?Bn5IKW!k0;WSrmS)#4nA) zZ;|-wDEuyoUloP#koY5w3V$e8Q7h?BPZ(bJ9npeec#1vxb0Q3{woJ>XO<{P8&W!Z7Fg#yJNLpJMUc_fX*c^tZvh`z9o)dQb827cjfKCXFN*k4vEig#0o&(z=TZGK)m$gA9c{)IrF>>oA-iDQsL{MAG` zdFviT~uW0|rbJ?8#$~88A((Cy(84z%-$rJl1Z&G?AV>c9Q|q z1bXt=4F*gLh?B>b88A(xCy!ljz%+rLJT~2cX<>2l*jNLmiS*>L934jOKCYwM%~W{( z0GCF=B~h>^3NDO-&yRw0qu^mtaCQ{zih|>#U={^`h5bsn{hx)yV?Ul9IDCya@SeB% z=!tpri(A?1sc7of`2H!B6uyD>>vz2hkyC8|mqE9;l`W)Xa-YwIuJJHv)HUq=J&r+5 z@Sbu|rr;mT`OhCk$;f|s11G!(KDo$ypwH}8U-TaSmoEhhHc16qe@`X1QqYh_!0KYi8s(Gxu{9u4rWA6W?C{5A zprUlLgEHssWF0cww)mjVdG>5D9^MEZfyUrp>El8A_yp?0*n__XG7QE5a(e^o`@8}F z32&e@=xy;JWjjuwCM}*IvQP3Xdy10g4i%V(DBHUmqw zckzC}h7lC#42~hO*FpbxPC|v9ot{33DZLGyo-;f%uElf4Tiylxyye~AK)3fmkIAc2 zf}Q}2Q#ACd;^Qbv?S4^lH+#;g&Fjw$-vEh!FPEarDb1cf$n_;}xOF!b8+;G;>b6ws zwp{sbbawP|TO3a*UdOW?(|4yp-EVX7v4<3U1267(BMr_;P*A8e_E$#ncejN*7Y^Y) z0JVp{sg1rt)KHWiv;hNvXHf{8{L?SdcY5n|a=brv{~{{pX5jbNQ*JGCy(KzBjLxu( z80v`ODq)Pu-8I zDV1&P@E<*ke87J+LWN`FGbr%b7An>7!azMcXhX8h3NPIK1*-6MC#(lrIH7?UzV3uY z#K4_!1u;k`%pxpz!c^pBK@mQ=K#2<8 zMZ_6IG+MZkh`e%sA`TNRTtir1xh2SvYNKgO5UYd@GfCh|B2p91fmyvCZnzs^J3+^j z?%v$}1!Q%Sp;kkV^E%WH$Ftqs_}59zC*X_pNp#N%DmNzV&n0yS`(WGY#eI5FH0Pg9 z7DE+AE4`RjN@1%JCDaby8PO@l=sWF4&+N0WIRb@YsK5d5p5Gl3k2lceJ^h~dz(?jt zJtGfz11|@z|bUmHQDk!M1Z5Tl}lkd!09|Kq6f%&QtWaT_|vQ=X%@dA>yQFk|LP;*cv{Ii}fDb%%;24USFKZ54w9!J1)2GPyln1o1VShDprTFJ>V7YN&K z2c~KLmrCO!XDc2PN)JW3CNi_ra|&6dcP6jP5R6_l?Jx=S5D>S2EEs~5sFYOE%3~-W zv%ie+Zsfg(SM)V|P9cJx8nof5s4|y+>PYnLT<&eL3>yIfDs*herw*rQClU5lI{x0_ z$oK49JxDZp_vbV>IX(OE5&!8V42r7`gc$QY`_^S~5#;=dn0_7tOVE!fb*vdHKrZP3 z?fXP)C)xs{Rp~U+x{I{VKj6q?zoFc{9nB}yjU5=et%c5*xWQmA69Ndc^P+(P4*Fw21?h1_c-=MIy54RR`wC~HL5r;Y_BueGq}FQBqU!G8zVyv%7JcpwVD9!tlFXkqsW z7D$j}{sG4=cS=L|a!R7-2rp3h`yr0IMjGlNLzjjWu-kclfuU^8i^A9=WNd>Va@ixz z9%<~Sj%z$eT3D*oLYDqcS_%TUwD$%QAHz8kJ#R_sn2vx4-WgRwE+Xp|39EWXwv=`R zx-mA?ZdLF&OGt>F#Bn_8&)ME0Z?&+W12x&x@qbh~>gnno zjKXQ1Q}b$7Wo0FTko&+FrUQM0NR-sBI0Utalnr?;CEz>Yt?3YaK{smfg(=V_d8Kzo z9tga==~dsaJ3ZahVSBIn_F{qVR&POzr@M8Y8Yt}!yzJe4+kDpZZ_Hc&yyD*ip(&n2 z8}9BMC360l{dp)nc=}|2fAflNc&*#J+40m&)+2(|JA_}~tu%I%#~d5?fq8!gNxZ-* zUCNCP5gMKZe0p&gBF|_d{}NzW&APs&L(Ww*$e+vcU1XVm3#?Q(+}oRewpwK9wRo?M zg6DGYcoFV=ESLvU*os+S)X}nD&a6)%=Iy_b>h$VA_^fh*CdxN3!wBp?j%B-!Quyo) z-fFP_9E8aEP%aqRjl|0*Lq6$lpyd~WB_`>h*AQPGCEmh*NMh*ww7sgMyx3QiBiri% z?pi_j5BIjXCQ`nIIVcJ6Qqn~!MO4arpJ9$j0(}tCg_;z~cCrj4^dOrmv-@dx9enLX z^bSa`&Yt(d4!bTzB~IsqwHfM>ziS-wYbf8s?j;_$r&@q_N|7wEeV^Fo3H%z#Hl08$ zloVe&I36ISd7MM6b_OGVHrGO|dbp>icux3jyQw$y*6`Nwj|Lulh|b`72%0b?pFDLp)B)c^__u-I&6j%@K;i_p z_`1ZYGh8B@B(4pUc*u}oyr_uLSfG1Px2rhd!TOM`d6#!NKaLDogUI_5pQUnP)OA1v zpZtUyb;3Iy1`k2EK?kjeEk}4S6t-NBb!_l;L;ws%Io|nDslp(Ho4~zX1-8g9(wH;cL~I8SuP?D(nC|4CK{$P~=0^`5Ec@@MB(P zpBHW7qg@pD_IBC;wiX7)fFl8hwvJE z#>3=jst@U)xDron^~6S4GMTVxgk7X#X+cBS48qO=wt4+q3OYk;;UL0HFbWBZLS~~7 z6xmJI)RHxw?ApIZHeMy*;A6efjkgqyhf4T60;T)Vc#op-cA)Wgw|MrUC$@NY^Lysj<`eFf_e6x=|DBDw>1bGAK99S`iz!TgTOVKb+?@blKe&WBW;sm8| z4t2|8TXh{z<1}f1hoQp&qjf-->p%(}sDjeFnAfaD(S^M{dje!S@$Q{QWS}=nQ^AZQfe=DUM2l zYl&RCn=BE1x0T{@YvH>@yxJhjsI*E1ZQfgcM1^#+z?+f1r4?}SNRZmtsrs>8KkCKe zTqGSdZhR>iX|4165uVUhHvI$BORpLh!f20i93Le?e3Txg-3D^b_zCE)V&i!s<@Akb zF)HCg6o(2ORvqi>pQU==UYP zP0~@;BC;sab4F@9vzl|CAtN^6x{%y->*V8tj5;~vmxRa!d(NPQGwa6lEYU9`I^SKF zBDaQi!QjdF92dsJTAP@?#atXZ6~_7RJhBNPe?8)kzbk;K7bxjK0NITI@&tl(08PPz z5|&6jRC@YIJ>S%kheZyH9QND4U?j-t?n#jk1(lsZ1W$iR4SZAtmEF{-o)jye4d;P6 zL<9@o*=lK7i1-I78kPFwRY_VNgBB{7x9@!PR#EkZl#}i2*wg_r&cxe=f*3E)Bg#vl z@_vJm0z5D84B{FeGWJ{9p!NsO!0I%HeLtC2x16c)c^fmoPwHc!tw#5Z~(OI zjMDNbY5DSl{(ikriKgZDZ^Vd^EgwAAhpIx~2^g;7ANv`I`u6&`6b|nfmxP4*Dibo! zFnRJ&ndf-$2v!0#XaYh#cf?e&jMz04rv3UD4fZ3WJx7hf9)BElZY{JDxdmj>+M-lC z>NCsfK1$FB6H8C&YZi3AsnDx;zDXh<>U{ZB=sFY%2bG+{ zho=u`ca9N&)<)py1$`HHIUG&R3Y-ADlH;)zk<4RRq1`KAkZI;D$S+U zMQh;%GX1xI3sva_8g;FOw-f$;ju%zhB}OB!(qBoolfCw*$SNHH931ksDiu&GiC7$1 ze-u##A*Hk%ZL}HudWG&5`A~&gNZIS}(fPs|^iw`~k0XZ308EF4=ptgRrLW?sC4&)h zPVj`U^tcc$#YU5-D15S+=+$CaIZJ5}mK+a0iA4-}NHG;ImWMw@4z0=;WN}!n!A+mJ zVdXjm1T;2p`CAY~coF)_@KfR_;~dgjTJe2F*cm!jUm5ljb_~a2cw=l$5+Ml=>kQUV ziJff8YmrVb2ONC(-ROR_ik!X^17bTIzBy33BkJ@Quk3!3gX#oOomRG0WRD>G3z6+X zcDu+1u^zz69jsm0?BRUqZmggXB|TVA?l>Hz)c}HK3w!C0q2_!+l9-_aa2HTS8GTTxG?cNR7APJF~)j}9sV z{SB1UCvrZA?nG>S3Fn-vBc?gNzS@0kJM%l8B1HdE_w5m9#2 zK)5jmk&Cwk-#olB2&mH-bzns^%zT0O&kqUFTDX+>-$1^_1E-)zeTX3qM)Zo#U>dE% zI$8Xykv%FAaB$H(=uu#dI7a&$-kksYjXM?!uc15aIUMQ^Pls z2{-k5z(EJJfUg5xdbeZajb`#;3ATKt+p%JzT?0Z$XYfjNaq@8y(L34dC{61~(+h8r zJ+$pZJdxYJM3e`dzU^Cfj0|Y;ptg9q>l;PtLpwg|Si3_Y?WM@vV*~LiIYn^O83knU zeGcX*-NsH(h!`Nrm`L|?_~5#qRvb^Gs_5rrgbo>eG`|?S2a$x>D023wJ>w1EOuoX< zgYNI?2-{rl);E`O7fIcp7@r5`-rvcQ zN;*SBImGZ&VxW;KG{}*9E_JoU4O62cLrC3RFkqz4q=b6Whq^QWPxr#S*JopKhj990 z2KrzN!WQb()#7(jw|xMS5~Kzqt>O{wiSTXmAA30YP&&w$3(26AtQL~{h%`}to)MP+xg%0rPO>pH-}C;vj@A>G&_cVO*-o$~IpY>{8Usy})GU0|%3#YV3i9yCF( zzAF3ID?A?x3ZDTHEJC4}e}W2DlNfl4Z?Rk^^%k_0p5gsL?RGrnY$+k2$E$W>z)gA% z*A=k-hXNXKZN1a!?oBwqf(t481p+cqK!}HXGk8&cnONOV9g(%lnw2#P{`UJiNaEs+m-=#M}I z2SSzbP^~b#;@f*@0~81k&E+2QoSEWztKp((Pdy#&sbBVHMRq4K9t^JD^YRb3YXMkVkK#!VbMo9sN+)QNa&s71UaIWh$tB zZy-bY9LL|{*hYbP{4Ei*hiwz zoj|;WZn~K`={d(njCAUWyg`@IDy_Bfqa+Ca0b`c>WhhG}?3AAghA>MIy+JAfp_Vu3(|`>~ty?-Q*7PNNeGH#Ii`RkY(X4*M~Xn z4zjS5ZNvaVrHvtb8{ps{Uj+@PLMp%Iht9)Kg^t5Rn^-?p#;N!R_us;zV4frbo{$8@t3;aFAcBjBUCE1z?Y%L5rK=N^txEt&C#q4*Z%-|+o z9KBP;`koj%*;dG^py`460l>kJ!KdHfj&eo4uz_z<>O?-|iV6~bRMg2%#E>fzXhqdp zSVXoRp^?XftXsI@<3HeP0Jrdc~@)E*p*lDIjn52H1FBIGaF;xZ*LA zvYpI|gdSwgdKTw>$ObP%A>?g-`TQf^k>urb7m*7>WEOlK3?lX4x0j%Z1 zx^alI4iuEV28lFdV<>x5D7zt){eCFBHk9>;vg1P8e3=a^TzD|)_uTz^soi@JJOuX4 z@2HtsJfx_lRnc)DCZ@ddpC$-RYLn01lAu9_^~*{nJHet&%_HD zoUrigqln%Jf%1|(-@?je=CLmn+7n|@VZ~>PU*6t2eF(QI@n#LAGn{m0g#UcB;}p;F zAH~xO1X%_MGgs(SCI&j`$%L04u@cmANJtZ-WksMxZvDja5fO9j5cY= z%NzY89Cw^S{1=Vi{|e#x*9%e{cN_s8I|S^M0x!bO6^5!2B#!w68x`#5fDXP6LEeP- z5!3|;lmnFChkW=rz3KRNRP}3zteaM$f#@3t+!17-w?*Ju?pe!8^wONaIc-7+xy?&Q zse#fijIK7o7~r(6;a3l~BM+l@VC921vCTc71w8w_tt9^3v!q=V@jUF>L*TP!9Va}R z1wvp`HOg$^pG}7}2wEbUK7Sd5eLCl?CF@$H{oy5C3$jr0b@`_t-~0@T_WSS^0oUh~ z5vVqCRe{$r>_~t3n@1c2(E(!|zm|-9dbfZcalq(o3qB5JI@k6t^y}!2l|QwFBS*>fOx=XU1&py4V1vWr#5wL(CF%X zUlOHfPUE%b8N^;J75v%2Pxb^GU3{@&Cg`~zfT@p|urvkJaLII>n6O|u3)7~KMtK^H z7ugUwZ-Z^O360VFwO6uKNqJEbOHn*t2#8!*g#zo(1pKi76s(=%Iklb)Li&SPi zLzVTP!fo+>e-;$tjUB2yR^+gRqD;Wqi$Q%##kk`P&3%qWht8o2jxY-ls*0lef2Ze= z27_@!R3trEa|1dW!;_%Olj9=6I)-T2jZkug@r2I&m1D%%y#6)Czbbe;e|71r3Lg2Y zzyCJRb4}}?TjP(T?aBr#UCr$+0j7at5*n?|xYFA@1(;QS2PqJ5E&{k1ejboF_}yY? zti`J_jO&zGjO(MF=%KvSr$eQt>ZM-GOFh`M{$LH2fxDOe51y^m zgGQ+)QR-GWBUopYI$f6PJAWn}G2xCeouFWY*W&MPS$_yl)~-`MfdkX=9f`nUjQ!wY zysEML2PM$WYY#T) z;Y|Z>>dV32VPG@)2hnwGVtfAVY~EJHt5)2a7E92J;iGfgu0+`GlD6;Pev69xV(@<(zfF8m#^-eejR3@X;V%j+DSBAR2O%PC1hE*z zo-jtV^v&cr?4xNL5p3?U(RP?(2)H_M?9_wtN4rhe?g=#b*l#HrDPK(l@rH=HOK%Y< z+lbQKp@ARkBi2S>t1Iz*BsdY!N3Uxw*8`P62H151>WdhhN9YsvUuNw!P58jDB65Hoge0r zs!&z?deezrVouP=Sw{07)tXo2T`Dl5>u`c?bvDX;be!-?gA<017KV}^zE=8fr72>q z*Wy}1qPX8p3GYf_K51cB5gN4&Lw2%hKvEbD54oLeLMeSiGw#nTr}Up)Pq=}Qh)hKi)^1hz?dvns!L4o-r< zd;Z^efc{>RucE=Xq`bCbS^bse^%WI$dF5Y2ozu9><|^~1UwNf6Yx?YBW%ebPUUr2? zxwN#nSjls98MkNcs)}-7#d5dezG_*6K!#~^`&PQIt#DV>S1iMyh;sX?m(@k^NP2BW zLqh~{Wxc!N2LG~JqKBzdB!AsXUnJe_sjXO1QRjmhGj8-%7&7jXiWMvCZ*-T`G^|*L zzmk;~t_*qi_meG@0-UR&ckTj9B9e-!t8bZT@r_bmKzG=Du>P+01oT~)WT zp1PxWX8G&NeN>`^-P7x<{Gy{2D0TQ#2sL$;%Ir<?Ts7y_=Py84krJd1cZR4q{el zjD#BjH(m5klWQKeCTJJ!d|~(ne7GrDSC5@Ce(Z`NSyvaVP==N3@MRpna#c-5Ejq;5 z3*Ez(+jVFhK`{yk-K&=Q8)_=*eR=Mg^#}KrUtdw@zOtsmJ$%*hF>e0~cO_bCoxgHf zbv*{PuxjP4FdE@kj!^iRjjG0tMlau4xq+` zP#2f1EWh4e4Fl@^b?%jZpL=Dcdj%hpdG2|LNevb5Wwo^{%h7S&7^xMq9v1_NRwRtu zSF-}`%R@(nj5fvylYEsGYiMYljZtzS`qjdf(P|{MHWZygMM#=7dSyNS)SXeT=w|3l z?s8%2wH0WM3OU^Klq)KH{`$K4)%E^)zWQ_U@WBIeTr@x>6?xk~Ye}6YpH_{-|6G+>T{$*c(zk=fd zGft1(NE49KrHc%tOOX~LZ9-atbUV_MNIQ^@c(%X42kCgEibYYTA$23YY(M0Yet~o; z(hEBvkJOE2#df3VZ1A=sbt6rB9`Z18+p z=s@}=(jKHfoIubY&CJAciW}+UNQ;o(gtN1yNIf_KY(i?nk?nS*8s3(4Af1NeyB?$; z;r$&Ac6#;UM%s1+@<r^k90KN>2x5SgEvGyNa^M%EyecYJ)s-v zfMbwHdJod2NOvP`LVEC{{{AgUD|)dnLHY-zM+iRN-`|I{5otO$E@zNVLc06o{{Awg ze?Ynx>6*Xy_isje=mg}E9!Giv>2O@X>_d7ODg8a%KBSY74nGNbr0bBbMLOg&$Rm9o z>29PCe-3%1X{RBN^ctk;*!13mbQ01Bk(MES4(VE?e@40)>BmTSBXwd2b_8h?Qa8>t z=}8fZqOQ9_QP(=vtT>z2hCM9daYaZe`)z-JKJm=7;hhB982_*-P@0~GFOez<&RGfR za~!d2v?k@E%nL`2A3B)OB)DQ1w9h$=@?48=%c@Zz7zCR(CNaIVZT{ZsRSzj z5b!p{h=;<Z0WV?bYv*pm`beymY`G3d33 zHB-ao8$$YPLB9?3N5bi*UmE&v2R#ijiBHtJ|4pk6`cBYSgHHX&sK4oYgMJ9~mqAZL zj4|kDJ0k}2&vDTAA!aR#kiXK9k3($i1O1|Kx+tE@j{!Xmv92wgZo1WwF9!Wq(5W9A z<(rxfdM)Umg8q{TdYeJN9rW54`ul$wLBG$S?*#oM=$j+xcN+9VpkIfhl0QVyUo_~) zLC?S$&GQlTy#_rFvHcm)pNVMSCye$T1NuV5bSv~2^)r8EA_e5%V$h2a%O^(2=Nj_0 zpnnfBp4u@a|8qnBcF^C$yQ@D&*!Qww-%il)!JKd|`XSK0c-`fXD8JSy|2XLP;WbWW zMEQ%2^5f8N-p3qsM}+()Lw*eCmt*c32R$MCM_P>fgI@kdfB&Ee`BX!`7W8Z1?C+>oIptkFal&Vc$;BfArV>{$&yLGJ}2y^w)4*jc+=P@w3YC-*M1$@v44E zxPKRNvXTy59Ol*n&||~x1D>dVPq#5%l4Z|8+Rs zbiZN$gP=bK`tWf2H6i)uLEjBJpQrV9uME+Tg5C-GmErQHIfi}OwcV@8+{Z(f7hTd2mSY;*F?~l8uX2zr(q3sNjQB2C-eUGAn4OT zzaX4m7otB8dMW6RaQdte{V3=&K_3`SFAdQxSc}a7-4#wR4$+5#egWvXsTLZyB_aAu z&~wj0p9zuWpcjB%LGrT_oOhaLC#2tD_9VDlEuMrCx3ifE1-Dqe36q*_mn0O`B}|&0 zP%u4V#Eb;@jD++V3C@2 zz;_<_79P-lM@IkM7~0a&qo;8KG=8WiUczfH6`2eP>%UKvC1Gqa_`~R(APoy*gsujO~h47RHL>5}vq3I9{3{Ok~U+LP16_bejIKc$#bCf|0^mX4lD zvVwH}N)NV#{Na0I=*R|J4gLX!riiBcn`AxGK|4z^) z7him#dqnBA{yLxEJvnbeUP10yKZnL{7*~*2Fd=W;NP$bV_ zu(ip|>~%y~1xJ`|^b-Sk%*49^|G1DtF>NHOX1)q2Z8tu;EIHbKq_%}1ScW@tkymVV z25uQ)Cqj|!I+$x2=_D;)#cpA^$e@@e0J7u`d=-iLhxmApU@8n2soGl9iJ5Ghp_5r` z6Ua=}x{f2+J4j4)2*NgJP?bzWpr8FDi}EpAtTv2PsD`0o-gWCCX*mC}?Z8(Y0Fb za>s=LZnI?(uppjZ4Yk=42)H`U1IlI_o%(BwGUg%KZhL~XE#~Izu+cZzv}^3yNFKG7 z6J<$EF@W8+&xx{>+ty)QLzHW^??J)yXn!PjTgC=(B-lvx=mZBH_{VA)fMPWwn5p&2 zF4?bQwL}08I#-U>iYR-G^UlR5=dDDB^Cl}!x!+)> z*H!H%D0dxnfaQpqNV1CSIiPHR5s>D(1vuNA0&=?UA?PgurSsrq`>X1zM-gsUDapN~ zrV}*6DOr1u0=N$VXPy#IFAi)UtAqZG zg3VOHpFk68d8AEF zC37OdBdxhomp%upTQX~*R&`tLk}}jNC2K5vu4cynOU`B}fIsS%taqvGwD?cIPB~5G zB*yC#!6-vU8OSFM3a4_?*n?Woq!B&)#Q^u+q=9MR|9H~)0X%H`xtq^WVH1eyX*7jx zM<#U+V=~D`!~OqZGNF!aOeRwS{P#^JGoa0wOs)WM_Q_;1D8^(`4ZxU8$ejP|WKsv2 z&}4Einj~s684HG3jR<^#AiIpoWF!DNnb6N7%gLl1Szxe=K3H{Lthr_#BZu8lTgXXX0~4ax$nhli$XtH#rHI z_T*gT?^41hs?SiKF;S6Sp^1v1&_u;;HYO^9LK79u)S-!rpwL7`P-vneC^S(K6q=|A zI_E@1e&G{UJZb=MnvfV172%ADiUayY#Q}Yy;($I;aX_D_IPf6qL=zPU^ofc9-WS@C z5ep0cIYLQ&10Gd1>pBqZ<_>*IBE!@~Yo6Sa@EbPps=DQ45YlTDHJLA|G3BIR2SBW0 z+iNpyBsYLhW!U*={fLw&Scgb8VROfyi802iNBs~*S%<$rWl;uDvx#lRs01-XMDKTo z!K$_LPPw!5-5%HK@* zA7xYBWA+k)Z(g1fn-@M0Jsma=?ae#{o*4RrRbn#QmwAK`pAn*l)Sk?ws>E2a7D#x- z4n($^MnFs&K8#80QR?z%+X0P)u(1Ooz}Nv1VC;YhFm^x$7&{;Wj2#dG#tw)8V+TZl zu>&H&*Z~n>?0{Z^oyMf~2LRt<(sDq7u>+#UFm^!Xd}9anCulP!tq%YglNN1+j2+Mk zP>f0IO8~~CMdlcj7M(yCJD{rpoP7tRVgQCFt&wOFhui@C7Eu%U4(MUk`F+kqJD%hen}xc%?I~3~3E0IaG8do7Tzn#P z@rlgECo&hG$Xt9PbMcAH#V0ZspU7N%B6IPH%*7`%7oW&nd?It@A`0H6BrL!IknON) zz8R&(P?5R?uc_)xu(WZdBJL_%yjb#7Hx{eveUWas3KIg}MGtG1R3XSgK0G z9W;91R?QYj$B>HD01Y2euO2mFJ84}El;Y|GtLhq!yvg-b9PgT44|AdFuEHT8C zCU=>isahK*iFCfpJgp{D`zYyrm)R#EEuHT&zYvf!o$oTg6i_-pcC~$_x+sXa)A=s* zUurr*BhvXUvtK|3>3o-|m^f`xI^Sig0xC-9yG)aSyy<+GshQ$mfhqbfGtM;VLzr!* zPP79CqgUOBL`>eFnUV=7ChyNBz$fq15_lEWvh_)TPu^chfKT3EN`Oz^XC%NU@2>=q zK~7TB((Pu&0t@hPOD;eg@lj$@VumB1v5VLSW!lX}wA|O(uF=^nO3bCiwujiSsiN`kKu+hDMjNVd%P&^6SdIaGw*JYUCtLXAHxhwQVP7lf<) zNLLx7#Jqug=3451=j9OIZeAMB>Ox23r8At9A)om(Dr&P6!+s)g{5~R(H69KkEwYN=zpyc!(-HCWr8Lb5K{1h(V&}=8(7T=94=1T?|7tPuiti&YM#- zdmg;Y9h0HN3`9P2G9=af9Kzep?r_!xI_pFwW;U_@mI6dU4&l*D!dW-!tOJx78oZeS zSgDT9Av}B-&iaVXny$obBi2`lbzBbN;X}!qnT8;xPLO@$x8Vv-=n6C?riT;^B(u)X zAv~6$x`MwEcA|7acesMF6r*NS2UlWpkk5RG%DNzj@OJZi;jD{v)>tK`m{|9dv6FHL zk46Y*y;WyTR$|r=>q=ssoI`jFy(>f;WN75>DHsKA9Yf(?oeIo69rFoc3V~_TF}#~h z17^F#@FDz#USygQ^AQz!ggV1TIfREN!dZu*qw+f2lo%KCnJPz!wO;Pve`1<1+-3UtvX7-7@HXbPaWi&xQUz>Ktix4xlFH&-557Pt2FCxiiF?;hWsUl{3>l=g#0RPvLXL888lb3?zl(@(prlib<3@W{9J87g#29X z0$qM+19gJAwv@f#-XwJl5h|dAu!HOTD~P3F2DiButFr?@4;wm>syV{PM96K^i}0kU?iZT3xE)p8|g2le73R_jCbW&{tvdQ zfVq7~qx)kj?yuId?_%ONwJX{5r!CYTYaSVZCdy8yF88huS7%oc{XJ_E-y*e_WhW8+ zeH~r|_k044IUC5dO;+o57Xre=ueT#rw`_;sM9nr?&yT3tE!KP@n%av*MQ*j8uh&de z-lv#N58S@jPtcZ`bWAI}bbfRvlWD9iYa$!^&4;sO5Rf%6*D@ zrw&)67F1Bq0AgEgwO&YX^zanGYxJmFhM^~mS}eAX5#6gyw9hpck2lBE#4jPVHb#2d{B1Bds%^K#m%xi{+RKAU~X?~bk~!|H?yLC9)T3mJ%7R` ziSDV1?)Nh$yI*lO9|Bug676M7?enrVvhqG1o~AD0WozWOvX2c#0+S{WtpW zlLSAl!%K&|E)b04M51KZ!xA;ink59PfzEl6#$h?LUM-pUcSk@_w-hGno+@Vr*%aZEnM%$H8iR!v>u34GNdDax zUj9)kpSMGyr637m$K1X}x_z2ulyEz|%%i|XmIvP{~=2hZll>xATO8yC8eQ4t6gg+=h#igDXDF6=bi|{LikXT#1$nuI$;l#-0Tydho-o^Q zj3!?)%)XzRet=~nnT^RsR3lr5%iMPAp93w0m-9$9U$||Mg?A=$6R(upA}5!k?02XN zgDvt555wu#RKCq(-IXiK|D#CIY)7el-ob5_@uK`%(QKLyR||XWI=ozzA7jZC%~mGL zkG06jWuB5VkPJR$w!SeYy1e-~D-`9OGV^9KwafB8(_vZO=Q=FQJ8kBzNW-1ix6jNQ z5nW%&d4<~OL9;b)lqipXf zW*&s$U{T>6=BOC_ALghS{A;s}!4Ecy;kwf-hwJ?8`P3%6%wt5EOS5T}qCTv{)!A+u zzK@s_>HG_I%sxbY;!z!@*@dhhQAY#dK5?s{Z-l5VZCdG3w>)6f_CE6{p=pt*?S1A# zsae$aKJ%3Vo}c|CHP$x0B=nXdDkIKpJvmJ1JoF4l^I;=JxG!7&^@|q#_*hk)CMgBRw=bCz;3VvooK4Q*?jI@aHl| zhQCxDoF4!28hjuUb+{8gI6!{1bDq_<4g^M?v1x*|c3 zx}_uyp5f#8Ez?vH?&P%ewhqq|oEB2UX7!wWm%DX17h<{!& zu-`X@2KFq9;hiSy4RY!Bys!rbJwpcZrs_213WMap>eAt*qF=vc;)^6>V7+YOYa|RT z(JHT)CX4cml^ojAtB;$k4-6Is{lO?N7iTqYK4Uy?I!`Z;m;W0bmht}y9hUL`Nz-8A z02%+EGK~@QhgTU{M5Cn5#9u(f$TI0jg&uWFJC(`HXfur$3o2R1b{$?Sg2i1XzSKY+ zMV)_Sl1rC)%BasNc&s$VFV7Kre<>2^f7j5z(sYrqQR-i%!%M|d=LXX(vD8_ljMAu0 z=Hqc{dW-n; zN!=%EzHT~~|3sZD?!mqSou+6OGvmsaH3suKi%ZJla`y*Oft;WK2sTUzq~%%%FV)Z3UKxUa_SFtF0V4Y zV1OXsAi0E|%{oUh8A<2urI6+e3X6zS4eiOWRcLdnqjl}ERBxv` zjpij&`~2)$a&MBVN3HB%QjL>U{!Yu(e!Y@QhlA=@)}oLObFj(2p0?>;gWd$4eCRN@K|0< z$p|@M6{Q=VwkTy*ob-#guRF29q5C;IE*3)i?a{+nr}0~hro(BIK{AU=oMv%J(xREg z-AS{!J82e|Ce0>(X_ASnmu7L{lV71UZ_cQN7Jh}&{F5xoTeWu5D=tvlC@AW`ge=g~6J-hxE4zeB(U9B|s{&ZA`#2h#0y=g~5m18)0jbU(|592jAz zJCBwr94O$QmZ?0MWdD@36>^}+P7}JNhyz|b-FdW3=fFHW-FdXk;6Rz3?mSv%rWQi! zQu}C9Fe~L^0M&MiWEL;CdX=5-JX&URz-OmBkCr*H4PaPn?~!bRa;f7g z05{u9iE^1X8`_%fbm!4>xnlu<+w55cEQqJU*Jh_XkCv;`mV>g{ew@r%l(7=Pc01j9 zv@GW4?6A|FN6R(#OCa;8o$fqZmc--&*lquuC`-9*9riUuxmNQ-fqdh~Y#H}~FNWUu zSw<(s(pa`?lfYorh!95&Ms~$h?;vaefLJ<(vT92xOK<$F+I7fs-c34hvXVe={H%e5 zcA%`hu@mTxpY?|vlR$6$tSur>Z~SbTanuRo4ukzg{KH?q+RG(318aK)*#vsyXUobY zs%bHLw3f!N+L{JaK0UPvjHWIO5-o%0wZ9-g)t;{X0CM(HFxfK`zJRb|Uq?U|2Q2pK z1PtJSWr1(W(jI2>m;QTFkV+NTVbaB(FQBO};0aWbJ1fH*?{5bB3gxTPay+Gt&qx=+} zPjspddm6l#v=;H#&PPttjkxH+vljciP@yJqK(hx4NajGCV)`+(s43>RQFih?%HP9C z{5mf_@cak)1`lopGDOK8BzrHHrNg(BgCy}|4r6jmIY{KqF=Pqm#*|*7{zP&=(U|gg zBL7svyBkxkCHl{#v^V7>fmkRmETz69=~bMnD5p_s$^*o6 ze^NVe=Jv-M6<6tOLDsnh$K#UYH#DZw98~bF)-U8dk#ykNoSJK|3Qr1}y zNL|AXUA=~`b*Z{ZT-UlG0$i$O+)TntxiM){!LJPkQ!oXj^M+cQAsT9FI&apcLqzF| z(s`>coh-mICGB&n+(PSHvxJft7O_q;6g4?}wm3J3&`;iUGfGY`+W!-y@gtm(pGMWQjY<_hY3 z(U@6R32;PU|droz__MFfN@RfyDw@O{px?t7d4JyxQZ`jtU%aIj`&hWa>SQ1 zlKFKR{Yx3i{JM<(rHo_>X~vf_k|Vy9ksR@*jO2(fWhC?KGWwS?k|Vy9k$jFXWzbg= z_+8gcFc^1T*C8?Px)RQ~>&k&8WEsAc!GTvnrY~i1;P*tqmohlOmvs121_$)Jt{mXk zW$>j80-Ob?X?%PNeGkI97(12t1d-1qyhG$aro2<+>k$#-6Gi?$!Y7IR7lcn1`4N;) z5&17Mr^LHNzKi%%MSeDwmB#ZaCt-*h6OUU0O{f8$lz$N>7MKxD9HFGdFks?s&&kD zgh>HrmBg4S%9darcF_XK)}*9f4mYR+22BMHR~aN*>f>;Nnmwo(fy8ch>e!cwcc8?k zOKjRE;{BcV?Gk9jBX`G`snRy2fbxR1^J|p!w@K48sigmLNtHWc$fY}p`Xr~`Evd92 zqzBYXsJvaAx=B)TBE%ncOGX-%xfM4{73ES%y}+PehABU@inMP%pUS3{OI86%+|Kpc zq=Z~Pp|ouz(ZD%o3W>5*uHcSz0WM8-kUe)wuv*Em5cg`XZ)>qAy2h~J@1(DsBvwz0 z(6?4skh+GbH}dbT(anJjdef%P;rgDKD-?ZX=&QvtK-f3uBB9TlSrZ&jP3uB(0OdTi_XljA4EBSxl z24XDmv4N4H50P&e8?v`M!iS1eA1aBFU7ISOL_O9AvaCr-^QW7Nl!5pN*xl(e5)Ec&WA>l_2?jr9(Eoae4gxvM)|{I5pk0+!;FyO zBceW1bmZA+(#TQaw1_T0I?_i5O;N^(LaC0qhRtXhJ>*E$SmfvtO^lg*X+4jy5$zDCn~ZZz(yOL{4r=vXAmg(u9#5?n}M(r7u&$iy_y!^oCCjHAY&v0=+S0A4rdG zjEDdh8Um6%Gg4KQHCfROIUthV=quDkvW?i=zrr{Av%yHM+Y)AWOyKR@qUCg zd&Fvi8aQgLARLF*p_M|!6r;Bdr~R8&jqU_lk?p3dlAUfqbTen4ot>Ag&}9>|@*@=u ztA3dfk5Br7lS1&d{+in5`Sj~A`S|gLx{CS+CEwprpI=i~Uh7|8k-v7*#3lIUjoO+z z|JvNDI)6TXgX7z< zS5daSqGCBLsmd+L8$UL0Z2oHe>cqKvAe#8ksZQDVwVV2q>dSls;~(Rknt(aQ`` zE>j^Tn0h_lf~x8-aX4>Q=)(Ee!UP6aKK~gWKFt1~M+h+%|1Y&IMT-BPQLWzzF#k?b zS`B)ZjBbG*q43Ff*y7EcHae6wRK5WX;keJit%+Qvq1qu!uuDdvo+ zEb&vOZDfwsEZ!WG$DDi3{xaqO)toTrB9^G-bLzt^>1yWmu_2<^L892iVwS3nWiB5} zM0u&t$lU&IZ0t6ch+c;hD!H~XLe53W&Cs3QRs6H5EV{6^i>dxg5$K9p)@r8BLA_XP33C>((c9P{RA>*2 zt77rh+E5m2UVV}*sk{^wDP(a!qOp=uz~XLZ*$bKTW|p|{Sr)&aQI$>G*>FnCE9V$P z#hhGej+>(;u_SZsQKsF`?Ays&O}muYH4I+!CUp<0`_+arW`7vqO#l>4R^HpSa?rp1wpss4KDTydt^j>;#$#M1V%lroll zgcS(w(VPG!z#SzIL#Yha;Rq?U1qBT3M5sOcQl z#Nk-TToH?eF zAm?_LSj{pqP!_S2`&qJ|T~NTrkfN+Imea-t<+02v^wt-!$>FM!uNU37o~gCk^^BPZ zYE$=a+q>-pran-_*r(cpy-eL!#1fh*KqM?=nLd{CGLHrewPu#^2FvoX>_^zZU5uee zZ3kx`aoQK|-OG|bU~xVczi=x%x)TjaqSOR$T>%oKeviztYmP_B?95ZkViZ! zW_bc0Oi3lX6p3jLi}RlypKv!D0_q$#i`dK9g+i)QNG15ciAvsp+2~)%)J4Go@u6{RAzq@ZGjfws6D|3 znufX903REOWdi1tW|mUP+{FMkvP3@{c=fqy1IF#z#d*fF0hMfE6@6w^3;A|7poFFS zi5xeCr5|C=N;W}M3oJvL*}zJcx`z#DZf5Zt_pD4TCDoZM6 z&Z!8qziFJqqbFK|2dOq@H?Q4_O8;4Ln+H>u!TQ&tTD6l%%={CJSLCf*@nPGE4?BIt z5E!f7jL&#&4n7kI;pEvwVo2sRmqx9hiV4uVfF{Hw(}-j?rmC4GVmZyWgBI;ta;&E9 zxs}-;AuqcOFBb#-C`;PTVzm;MvyctCnZ==_4!Iw}sRY^ABVAych^`xlp^{O}k{7ZR zb4?kGrP@|)r9q^chr1^-hBgkjA;zk?P|Qxu2zyNhqVHpTL~+^qI1*fY>CuPLXW_cy zh${(Qau3s{GCoS?=%a*({y8kk|BX~WfOx2%Bchgel-)>0%wgJU+11b4xg)y0T^e~Y zj86Q3jW>-+W{#;W$Il!$v+?*WV~pBeZwxX$-E>hZ%cZ7AZ=f)4ejOi(?6knOS}}7{ zTE)_@j^v_#@O7@S!$-n&P%br0Z1^U*IVxjqFMl&G_or1(NhmE7;Y$j;t z8@jMaO?K;+(27LN#nk&~R%m8yBg7*eVvm}hC~!W)5~`W&R;+g2H1&?FW=WJ=t9vg6 z8y4=pAzdt`i{%zG*DkmO-lJI*HIS=Q8uM7uQcwzcFV4%H$Cn}ZvRRePh27V7Hg+$YT*(rrVqXRme4ok$tlGm1u)x0_JE%5PE$wEKOffIN zSxgIj5*+R}yJ!wfW<#|fQHV&XV#9t!YmOAGJnm*GyVx+kKmlG|J)UK}#NuAUCdd4h zN@9g!bwMc7aQ=h!9(H>V>dV2@54h!67{-6doX>D{F+v<;&!BA|JExA-*tTKGC|QJJ zn~vNz0~?DfHe?seDPu8yasGsT&%(&#C&sSEx^O!AOx;yPNfsn_v5Z|TeHTmH#jI|P_At|qG8V*XK_MpBnb>NyV|rMC5%Fi>!1OS< zY3pNe#}NVcNvm;0ivku{kFrGTY8Ly9h-GdTOK2<(tC?EJhK*(M82eZiqyMI0Pllyv zJDYnEi#H9!W@suKK-}0RPyz@JnaU6Y;-?XjM?JX-p30_y2cDt04L{R5+ysfay2M2! z!S}-Qlwc~~#6aR=Awk>V2#F$+aL#4%Yj|b><2yGt8a9856Q^x#60ATl;x^vQoXw~+ z7AytW*WuWNCh&oCnR=YI!mwB%a3=jX7CQ~Qybt^o4D8x2zu(VdSF-J*q$;67LNsY1MT!trOC_q7CPJzziV&rLv=JYYTZt$L z{z%lS3KVL7=gc{G=g#gXM1aJ|esk}+XU?2CbLPyQd(O^0P`Jy2@7^ff0edGm&?&4% znzZh{11~GhPZSPd!v55o(coflM&p(y-mVL~f2MG|eFxazEZp`{yan|Ocivw(I9b?# z$phT{el+Ab71}>B^ZWF%;s~*M(XxI&mhbO>l0W!hoqFjd`b?|JfdJ_pJ81Li2}8eR z8Ty9$R^1x44vxkC|M9)`t+MWTWVjXoM_+3HH~cTmU(Tz8zOzmljj@_IyrZxaU#$A{ zxo^*(tWU-)Gh zlDpEvedh}+=L-*kg$D{d7Esj-Y>h#k*Y5aeg}0bKUNH_A&YdspK3~|`x0WWgALa-F z#_Q6l!h!D=_Wx1=uZ(X$S$M}bwn7JwuNH3pdE0_77EV|Od5wrt8{db0I90fr98#wW zMP$1kI92#Dk(zEws8(rQcbPVz}UXjYg1~pj-{& zD69vYDS)*NOx}0~PhCJi^h{chM?jiy_twL*}B1prg2^y_-)a|*Y z=Gwi`X#m`jz-ouhB&&x(wSJ75x83icVQ6fvSC48}P_EamlMKLcMsz7m5_`j_oiM%( zQIP|&YaB7!qvcT>$%$kTG~y^i+gWBofRo<2{MERXMpm$y!;{}6;OPZf5(`d>hby!j z)r-_*mL-W#50z&!Nq8l)B6D~kaYyxx^Xg?2v|+JC0w+z-K|6`{UOzRZbyPJMhn>hA z+vs(oWA*S#tA1>zSL=768p*Mx#kC9AO}+PMbU8KCiy#!tfQ`7fW#%hu#px6G+M_^< zM>{Fbwtt`*p$V-TZo{~?@c{hPNAEdRJlZTCZG_2Ix3&@Yy1jmKwBNnj>ei2@A-Xrg z!z2xBmyd47y)>$&y_jB@sL%C5tsN#C`nc8W;z6z9+(Y7>Fu5FD4U>SRQnxCDHj?_R zRm!WEf|b?ka%p}xSarI9^#FZO5)z%Kw>;Be4RYS?AU5vv#9Tr98e3MCneJM-vTES} zjsn^o%8rN+Fj6(HLrW}#uc7n37+x~zSq!RJ)n_J3(Qzm8wLBHEiqWVeFK~i_b0t6{p29ioM z>@Yn$l4QU_HTp0+WE-*pMXq`k7S&ZD9afWLOG`^_Ul>|_I6cqQs9INeqA4@wm8FFe zY0RaC+2GvlMeOlrbtwO2t@2={dZ9A%8I%Is#EmRP`eGm83X&d$gePMvrP9PVucL;# zA5%K)*4pMsqG-vO>PUyjuseOOv^~gSru2eD6HLNaSKTRtM(m2FO>$cX}5>dTOWVN@1d38XEM*m5x z#5@Y;7OJJypu7@PK#$QZJ6t#c-xpfx1~ghJEJsPdohCFCWTvwCQxq7)NJ}wnfgPS} zVu7;K^D@OiB-L0XLacI`MOfAhQ|h5vhR3^Yz2$awxl~?-eI3;=fQrn^T}*?mx|IS8 zN1s&s?epX>0E#1a!U-m`=;XAn6pFL%>Y9EV$`-n!CCFwu4UogivQ{3c-uTkUmKS4=fm z`%u4CyFA_NY=&`U@Y)%mg)(wRcYzL#S%Eh(#jbK89gHYgw@CGO)CcQB=fy9;$fIzHoLUw z$*?Yj+Hh@Hbva-wm7y%8hTnj*`H#meH!#DYVIf>ppt?eURq;Z3^<24v+3{MC)I#^o z5jMsWa14ixn=UF7t5Qy?-H5xLE0JDzmeBBQQW#k0>7I>sr1FD? zgklVNQ9+9k`^ff$m3kuT)qsg2Cb*euo-^^$i?pnIOiffy^<@fb;L^=&ZGHq}Y`Xo+ z78@e=bVN8~Il0>Jj2>%h>;Ur3jhGtZ+3AvnNasmwPqNn$F|<>dxoDY!%SJZQ4m$h@n+=}5Mg<%WR z>TdQ^TA$Dg-_tIdmh9^ZURH9w&r+JEMM?t$76u&)hkwvG^0i|in-$KlnvRs@b~ zK`+@vV6egWZA`P2g>jR<13(@IZE66eWl?GyQSI_PYzo=&T0rv`VUPs|+XhRBdOJF? z)Js|^)_#|;oQS$tT38?&e0*q|v_^}2tWi*uuJjYUVd@ucb_p+q_{x6L^f$2zil$Id z37X668yFK1$!2W8a~}?V=;qlVjq&u%bCRzymAzXFs>t zs=*|NDsgcFucJ#Lt-b8Z$XXn{hL)4c+QNb?m*)Fv5@5z8Bbdx#N$DXk#Ss+OLxz&j zmk|CwzyzlHjRsT=znqkptZsBoJ|Ng?r_su&zJRWH%Yo(D7uaL^71ODhI7X9PUbHc5 z)bhB8X^rtMA22o2BH~b(b)E~KWMmv@wVzfS@>=0kt~E`Ec*(->hfYOTTKL`(;CoL; zi05D)pTzxK3vujjWyFI0l;Bil1-wEtpu-n>W<*z3qN^^FZPIKQx3|3ND_JK6+>7&3 z3hRq8o8W!i!^K#wHk^L9;#_Pc2(X71J51U77HJ%i^j#U-Y9KahcnNy{CJCP{%>jJN z_Y*#hnlmHe6NU~5^ApaLFtj(3pC;gxduAkjr_uA6-7*t6%T>>9&ck;ZJGv$8Ux41AaeEVCSg4BjJ0^^^x#> z=32$4LcSIJCVFWUe7|{>w(s)Ngt^UZT=amroxpJ}dakznbOJw_*YmXV@H@O5;_$ASEH4_H}{)oWw!$eN+5xAb(0=F2a(*oZXeBIRHtiYcU zxQg{bf$QNbw+NjN3S5t0Q95mb>sc$XES!Ep;CkAMnwwt}xOvFpX}wPiyeM$l&eJ?6 z@UsHftt0+S;M)S%k?<{nKO=CAKu+HixSo=taz>}KoL?0D-GaYI;Cd*E@_DDg^#l~e zXK?xnf$MQ6G)^eJSKwyZ-eW5YPKyG6QQ-JVA*Y`exSlqGU&nHa1%6%dwcmeT;I9f? z<^Qa}^~@24e_r5v>WI?$OTbD0_2(+jOT8}%zHaua?R`byx;L!CUl+J;C9CjVP++3( zZ){7OArai)AeZJ>=BH>G`3>QxD)7G&`0omwj&COX`rQ`roWP$JxW9KX?Oa3n{ubU} z2Au5DliQYn%Kz(tj~dr>H1a4oon20Jo>4lIzsB%`X0O6+H8?tq@DCc@#6|0c+K!}u zi1BYThu4LGla1o%2zSIghUT^Vn9lILHYND}{773G;kVF3^XvxG8J-8}jH8=Iygxhv z{C#L|aoaMk?R^UHTS*^e-q&&Zhm3!#(F3&<{#k(+MgOJy%~zR@rS1Ox2chquxbm+| z=a6|3y+G*{`iT;4XiEI}$8g*N28jQqZALT7KW!#N`2L2rw1H63qUQd71BS5(I%Ycu zHgx#gK2SRA+5b@J`#Tc08J?#>cTX^#gXY|}eWrYVjNya#5QRS{^!<$|pC3d2%Yg3% z|JQ`Rt;LwH2pxaJotFgeA58G7z=uu~!bC>$^tUEH1USk6tkGn}**f z=LO$C=Y-A}yj2_HC87{e_u?%yW`-{0~2560lr-jT$of1DBRw@mu!kFS3eeE;~Qe;Grc1~}0_ zeb{nI(Os0@4S12S@_$YPPUBaP`-6IOnj-j32hFZ+0Z3LAd?Vvs`|IZze#q#-_X^(> zxE@zX?}e1E08V_q>o$9@^Lrf^1lM3s?EJ*(7X{yly^RF^TLSlwp!g$(3zCz4N$~Zj z%v$eX2;AQ`?C%8b@0WfG4crU8J%ErpH~q8V`@4*PQ~L4xK8vlpz5YA!N&ee1FBFB? z9=za@9Q+Mg?-aOy0?~bd(>VH!%nKmP={&;^nvHFHuW&l^llb@TVN2+L2U~7Xy2oaw zD{y~nv|kapziI177%qjK?304ORS;54rNe!n63{wZ<0F+hkND2HV%V>)x{5!~_d(XG0R zaqWhQj1NIkpQ$!N9FpX~6R#IY32+btBW)CT&UKpn+ZB1{8k~v7dumBck-i=O; z&If$hALNYi>4-DQ4im?{H1K{{KZ5#xf?#gBv^X2gR%U_#!!#rn0>PXsS?Du7oD>Io_U!yZd1^X1IeBtY`jq8m-OL)$MnW5Mtdr1LHXw~?rGZC_ zrOy3j;}0~(Cn&Ej!b7Ykb9Hf=4CX4u;${pZZaAixZR+u$LYLJ>G58G-MY z1BxUWaDR#-wc*YiK(ZdQWGrC~L)oNgipB_JFE(I=``P-X9kq8HWy5jCL#<|yn*+^! zb0b{f16gK6m=(v0#~KdNZ5}8HaNcX9o`VL1zp?FCD>Vjes4IA4qTn#UPM? z3FMT~jXW9(NOyEZ9mqkjo*x zO+8zf)*!86aGuJLBicHhDQ4I0nW5kyr|F0q7#Z8Z{lc*WsyvW8#UYb1w$_~Olv__u zA??##kc-nn*2WD2dh_k#%Cm5SAb_owX^ly+8Y?6Ay<@zap3VMvqffy%&W{`Xw@=%= zTvT3OcoIbt1hs1+O@0XSeLTvmy;HyqLf{4n_l{%+q05f3uydS^?BWTE-f>*fvpiQM zw3Dgv(6OD+PufxBnWMbGDOSQvCR-i+G6H!T+k8W>V9cX<(@b{pOO;9Nyf_KFy@@dK zEeFIu(>U6y3#c?z#t&VZhS4|hLl!ex-|C_YnvC z+2Ty%aZm4FHvx7aXKJ= z0nL9@;F=Mxo8E;RTH9-R@@rAjyvTQhKf1nF2z@7V%U_i8n(O*k@$vaAm&&+v%WE8p z=EWQ~`I_?S0&c&5;|85<#!2Hr^z^RM-2{shYZ&?&F+G@2im%6j4!`u0V5Qpk542vN$y9S`2GKTUiqSw z)BL)S)664pKJAsq$0VC1SNw71KjW3x_#w@|t_3AmdYXU1D}P<;)%>aZ^8~bD{FIqp*L%1;zG=*~#LiE_N)2kFWQdzXmiq3`EOoT-780&GP?=vZT9OUgNJeq&yvY zN=b%OrvKWH&*K@PXnBp(y4a&qICj%!*iT|J4DAue6+kZCsJw z4f2mYX0KP?H-OQVU*5(a<#FilW$GBDA9(ubm!BTP|F=JH%Wr!VuwT9^<$d{u->~I> zTl{49Zot3Nq1+o{jQaY^w!{%B|4!VJ?@aq&?Kd?~``(tYe~Uk``NR0$>?W;OVPvjG Qm4Ezg7V}}RfOl*D3udO~lK=n! literal 0 HcmV?d00001 diff --git a/build/test/out/test_is_Valid_tile.out b/build/test/out/test_is_Valid_tile.out index 38aa2788d7360501d5442b9e0a9a2f80490ef4d1..736e2248cbb9fc6879e98af83d11035bb0217791 100755 GIT binary patch delta 22483 zcmaKU3tUvy_WwC&nBgIB7>0)fjDny%1Ro$G3dq=~Xg)BtYle@?(o9WLdyQVKq>&PL z-qF(3^qSAo@Tw^)nhBa$smyC>ie)vWnXl5c?)<-N?{fy2?(cs-A7-z;9^bw8+Iz3F z&pt=beC;#uqR-+~r7)$s)A@iA10{Zq7|6oq%z#lwQ5|Kh86aoMmTixTx_4Qt2!1VF zuAGbiT!@!SC8;|`0EjmKn3a-DIz-LCWWvyOf?vy_OJl_Z(HA7LI5N(%ABPNE|3a^u(CaQl1sDPnoh4DR5cL$IovNsgL_>rqUx;#a!s?$S8r#b1Lsj%DM2UN* z2w5*-mg*zSo`TFZ4E~2y}#@uNtM>)4(oB-vZCFQX#PWRq&@gU z7>{U3|DYlC_R^OlO?@+$I@jp1o(g&YP=!mbv>yIHx@>LHm}5|*V+1Tdt@uf){Eyo7 zpcYNL?uGo1Hm9&@rVP6~=YKVcf%;37H}!7rA2~VbRK<@nZ&miR`nQ&?KJ>p@J#okF zZZUz`i>3r+Tn@W!Ozaieq5-uRkGH@(fSD?}J`esMT`9T42jV~7+5D))UauCka@6D8 z>=t0I{{IVS&uylU&Q-?UX1$}M0{h=~yARBuM*G}m<0NrnFMa&H4^_#EEwu3{QVBHJ}wbtS%=uIm#nk_?y zSs|Zw&+Y!P0=a-oLo%(k&xIk&^&r`3l0Bx$$g&LVkg|gznfeEb`bS;GHF-hZOtJ{D zvX{-7b~EuiTWdpJu152)(YFETW=NRz)a6)I2ayN*dnLpheUSLI6;CzLR_<7dD&j&g5UxGv? zs<1Z56)!YM_BeOv{{3QhE8()T|0=tf7}bCM zRkyq1g+|HVNTwkRYSHflkI+n5#3c>V+>iqqRDT}z+YdEhqNGvvNmT2tjUc7VV;zGU zSoZK#_FAHe*)6@5rk~jXON{=zpOH)0^kNgcWeLq*jv8k0HJZU+A5J$U=Fc!B5tq%Qod%eeH(rN6o6KISn;B_y z=#4~I)XBC=eE`VIR`C3Vd{&ChVf^|EHKE^0g=i&OwDNkZ0dP&4sRFzy0Qfkr@c=B)09KJvCHU;qBvX9l zh${ekiFgwP5PVD#ZT7j$%9CPDNt$IJ(&|WBRRsg`+2W+g4!{58b~^xpX(PrZ-_ziE zh`7hU_hiSC1}UfWSxj=4ayXw2OfE@^|A_~ARv-c%E9jYF`{@n^@Gvl3i+*A?$?cRo zdF(&QX5~^I`z^U+?5jUY5-Dk#uc7YpM@x&@6Up(ml1l420NxKSMv#LK6m&CqF`4Z9 zQ4Mmw_1es-aKDL0b2Snqn$OB(t2)Ff@p-JaLyGB$t96sdPWbXVV7M~KFG#_=X zu@?m0+}KP~{>8<3}R z3+E*GUsZ4C;@8!g>#?(~%zrJtwV!NQ5z1RSTtNjmzS}V;e zM0Yn(cLRRs-F=qYobwA0$Ts31B!0bqEUa3_dOV?g{XN%fu;p9pLKY0dozUhOw9Uq5 zcZ@ehdKpBM0sFpYOUFra@1pLgIFSV$*4i}m9GkN`YV0mGTvhNUw$83OBp$IF{<*|# zszMTjaA7w#EG@;9b*Z&O-B5SEe~B$l8ldo|sx7;@Og^!UKv;GVGmqdWUN{n@1QZ<+%-M$pXx9S(-;#5ZhuhN)k2SJ3Un zn&Um1LTkNV?+=}p;R_<0h2Mz#wu@Z4hdzrosIWjyY8N6*6fZ+eL!o=JzvnxZFC{Ut>@X2?1{?d zEOsY5Z^()au%5-L!KCI*y-X<+5p7b`rT->rjN%&LY6)Q-af>ystm>}MVDr1QGa0^a z?O*`vu9v=Md%AROUx>chDy@xphP4Xv49HSJHi5h^lZAH8NSb!8xg%2q-Q1B0V7Sho zW8=CG2n_G6P1ESkY**KwfyaR*=Iv*h?9Z;Yz&ReqiL<+2O)$2 za`is>ln_4Akxk1)-9b3L*2FL3s%!}Xwt@0%`y3> zpqpc|0t}bw3znMSQ@QUHo0wl5qyvkvFl2vx&T8_zn+|^78vSF`U4^G`S5HZL1++Gu zDg@n({wyi}`Z*iWtEZCuIeWR+fY2{L6IhpJOi=yF&sbBh9;RxQsb#9AsJlWxXPpcB z+q;9-8psxOa|5ZQxb`y|(&J)CcT=cdrDarAaJL<#cfL}G3jCt)K-cTff7-e~-=OY# z2q+lRGZ@mwkOlJ)0SsxKjomJYH7)ZpSV0D+&sb{jd5Zig+tj;v+Ce-$s8QPk5+2W- z2srLe7tCKcC_iI@QzaG_(WjefysEEt`BBte7aQ5wKEv#Po^0;&?}Bdb@-;AAlN$-q z)uPM8Xhl^O97=?=PMe+RvOlezdi{D>wVWWE2ql@LvVpFA0L2)?`0lxESr9M{hB8ZnvJX@vS zAb9Rl@WO~!slN#trdLYYz~Wf{Mo~Lj%BB{_*^~a=9P&g#H;3E=hHJ^c5dnvO?{O$n zP84}7Ml8yo+d|{pFQ7rsEg=hD!uklU${|J#n-$oD}NyR@k;2 z`~IlA4nxm#vRlDAmIT>jMB98vU=(z73?e-lw9$ISwhWWxE6^B(vs8#D;YK3s^;=QU1#*){ zRuzz*D+&!z;PA-Q#x?bX=#v{eh=N)Y-#+FM>s=2*?0N`}H$TnWzY|Z+e3ItFqUCcn zf2QUV3nXYf9);>hS~Hp2OeQyz?V8DiX0mNF`Q=eS`QZ=1r;oC&R+Ih9qdchNX*x9_ z0g7mSL|lh{2lOeM%3{uqAf>%LOX}CCqVH)SstSrpv|5N>Q$?Q$Q7(yI@<2}#(Bnwy zrMjY7!LWWL1}YPv!k>U2rrHRPK@VY&4TBa35LE?}2zTI7wxC}@c@ojSqAT%4pKai7 zr4fBn(5Xa!BGv9#<-QTheGP2ReYXC| z#PSoid^`4EUv#CaU=a8M;2sX~ZB@8+RE?;`YXjT?sDY6l`9K)E3=PcR_ITL$v6|I5 zSh*I}udT4jVHXerfi>g^xX&G7Z}e}c_#R=q`*%sW7Yzr_f6P1hE72c-b{JRSpw6Lx zvxNB%Fx%~@VoGc>NhfEs!ci_8L*8)PINSkIT>}hw(G6 z*jT)zG%kD>XaqRlVf-iOt|hMWYB4jH#uYsY7QEQ+@#2k-s9)U&3I5S2&ATh$yWYhQ z4)`Ebz3WiS=9ad#`*C0ezmvanpQ;9dm#ir z*VFWa)U=Tc3kG|%PaWcpRztfO>i!<}bW;C;OABls_4PviF#&$osP*f=;JZFN#2y&b zK`A=KUL0gf^Mg*Mwa%f}apEv~Q^lxbFEz=sQJ;?%80)8_t6+5B*%)~h!U@Yy-q!>ByK9vG6Axhh=K7zT|BYmr{Og@0gng|WF0UGsI9F4)PU~zgq ziyOH-MlKl9>)Gira!uOL?i-pJxH(J%7`va%ADSH~dk`)A+5Vx?ZR>kc=#OD9BOj~$ z%y#e_#U?j8Bt&BCK6Ybh*T5wnFW=k8Ax3)`)AzBd!{Ul^Jd6SR$je(Ty}VsZUAyJ+ z@|NnQ-eY9k$Bqq43rq{uTs>dQ$CLI3c8{z36l@A0)b zV>i|;AO4Y|SbMOs4~!diH5b#~q5p-7j_UKP>lxqO+|5Erz930Oou91|cU>HbQ?<%C zvIh#e(N<4-05HDCaqtifW~F|0E;EhnqD;wU14p(^8%(l1YvYUn4*TOGGO0426eef5 z2`sCO`*PWmktxa_Ic)F9n1s1Pen-fg_?~IjKFpkJcw;{%m)#th9`%nL4(*!Z@wmzu zo6EY7>YzNB!yXznBjo$;T;tBu$l%85IqdwXbo*N3IrQtO;GJ%9-*o7!h+X0GYr(A7 z&jgb;1}*m@IMZzAh9uyXRs7wek)>4y&vlWcq6hj{o-P{Ezw+0jvZBgAM%bz{rhq-X zwBw(?wu&o$F87X_*GJ3xCFNsTe7Tv`lxMI*H%u(QJdB;V(T4r4ya2aNe$`wkUuv+^ z7Z?wqK5c{BeGT-Gjc#|ePLj$|W}(d5LA9au{{;3ZU&Nk%p&i5}Y*sg*oPnpp29)ct zfpek!2-`nDf4tQ@4FHtgaDrk(xfF*?lTZeq0|3fwlp9d?!hZKK%JV3jP}0hHM{&;gWlZn%58 z7lL>nj14IFqijHV4y6m_b(DTVlH`jQ(5WaBQQA;0M!A^9Jdq*~VMR}v z36ni_z1xjPde4RZrL+itN8fe3I}z6!9Qv}-H^?w9&=*0LNWKMspF<9xo8`sL^5bCd z|NqFZK)w<3B+L@il=heIic32vif> z4y#Ytr})if*I~PMquc#PD_e)hHV})_#D-3Zv!{b{V41$vN^^-vvlMazmgU>6VxT^pGcC}8Q3??a;K)zbcHZqDVUkbepJ`z__ldJW$$O@YEBWEiab<_45! zGzDo9%6_qU`5DM*N_!koDm?O1$V-somba2G7INzK6e#S2!unPUD?I>< zAn&`&?OxVO{<=rL1@gU+Oq zAVRx&kK1iPq&z*;{izTF*{4HZjhvj*%09zmUkdrV$kj9}o9)+}<&3 z3r{?*DAV{*@W~4Ki;%Z(DSwcQrD*W3Kt3PxHZ5HNpJaZx!%h2~U7Z%CPXhTH^Pe7P zC;^4z=}yyQ4HH4`JjDipTmW+0DfR@&bs&SjV6TEa407WaY!k>!AUA!%j)C++N`Cq@ z`w3(cNOpz=%!oCVfXq9`I?aeT(4BMo*KF{NSp7nfzp*E0#2Ge#>TsUD2Gs_TwHMiY zkh?(s$o>tvAMS>IzF}7(PX*cOTNeCuyuB1;#wE9VP0Q{p%RJ$k0{MH8|I|u;(Ia03 z`JC_E?#Eln%RTZfkROEnzLxSAMR*Z@gLE7UF1G#YIQzCqpsuj6 znQ{73P#0M?s41ZS1IiRo0?Tkzx%RLFZ57sf2&#Y z!rRJF?fcm|kCHEvqRD{eD=~2?27eVZi6cX>BCZ_kQns+guf#kUA9NGXTy*iB1xm<&C;RB2qpGA6my<;D z$1L!X=+MJYo(hye+TYUmxy=z3%CQPNG2ha%%Q1gK)pu>;5GW|q(1P!~v5%6+=W8Zb zKCIZ=V{{@TXj>WA5&oRB8l32eOW-6$_#woWh;!h#i+BnAq==93n;J0;zeN#~ z@mm~`4$YE?TIkp!WN@k@`hl}Vilk?TXxaC)?Ds2TYWxk4mcD1?u)||k45a{A%-I+;Wgiy;b92gE0759 zhqZ{F;rY%GEy*j&J?JH^(XFsX`^~}W=LLUX3;0O{-_78R z65jJIDu>_ifzN3TpQ~DHq3_{^o=0^%ny1kF5PS!N?l16dF-jsfsjcBVdck+{f=^TH zgx-xpA8nXz6wWUa1!D6oJ&XzX*w*lIUhr+b;LR=Itu$`}442g;*bINhgC5u#JxD{h zs`E0~3qGV7K6(#%?`vpM;hXbH^dr=;!SDq$Ep8t>3h9&~ zFgvm#)%V-S1Iza{^AAuAply({fY$KqW=faJT$~K~E;ipK;Sv(o(qmb*StfcH5~lAG zvmephh|kQlS_AeHBLeBbcV}XMLg7hjSBoUIH}*Jm0xsbvNjZLlD7 zvH8R>pfkb0*Ay?AtBmK#%*d0OktZ`FPi97*%#1vl8F?}@@?>V@$;`-;nUN@e4SoH=4OlCZa7% z!3QZ|U&}h0zX2uqiQ0wRvab(C&9_MoUJaJf0hVM;Lp){UXwZtWfuo+|s2`&py>T`; zh7jXO>c8DUNr`ab<6C)==A{pNSOE%sBtw_OhnR{s>?sSR&xL;Nh$Fb?o#z&Bb@cu4OESFv>`79%ZJ7~QVPfd9h;4Nnw)AOzQ3-Vy|Bz2 ze1)t#S|)SWJhow(IjI+Eb+Y_}vzBSzbVOB7Q*F1gAD5YXo+oG0E&t()4Vq#fL_*H6 zIJt|TY1|NMCsS>wi4`t4hdf4zoh_MY&R-{uXH%B9&HI4{FUvBT^AgANxJkS-3&7%? zX)6WH1Rc8zKXSH(`2Oh3!R2QA@5Jh2d7rc9sn)Spif%VGy31Q)UV|dX^pgVUkS4a2 zn(uBQzQ1m@24JLq=BU1JYYC8zvF89fDZmndX%zbOvpOT@JmP<-TQp^d<$m(2|V#TbiYiaaK zRBn^T-A=ex72z7&^VU%N9-6bAeRa!tTN@UOe#GA-cC8=Z`6b^cn6;unu1^Rf@fJVB zhJJ$gf=6^88cw`Tt#9!&k3{yuo={4-N&~Xq&+wY6kN1cClI<&Idkoh5wbu+R)nu^P z&v3^o6#tgW*!4 z@NS$UN_oXs=uhIyq<_YcMW{-(Epa2&ztrl5iBU8YzA|LJ4LsTkB)-n(ziqJ_s54(1 zx{`Og>J4`KmS2+38?rAVp(@pq`8X*w88WF6bl=>MM(?6lpJZkv|Hcr`?_AZR%!MTX zR;!PZ0{yN6(XxeN{*uA4wzu$_KVeH!N6eSi@JzV>lA(Jm_g^-2CLuPN@OHo|i(+WQ zo?O*Su4S86btoD@L3_wxc)CD9W}ypo$t#i}5r_{N(#5Ec5&;>j)rTM;ENpc=L1wRx z&w7QzlVdQH^%5Zb2!Vq!4_J<&qX&%HS0|9|>ec4quTkHY=nd_92wQ$U!EN_p<|PiL zh%C`}7a`tl7oIVFF7;Jcz0EFMdqZPj5MF1YYt*rE>iNvmRWG(D{*!vVOke2c6I&8v zwOrprjFq1li?{UZSd^Oin6J=>(@j#T9%9ZRPgZL6vXsa?;c${pl;*2QGxAP-1m7YU zF`C~JW0%UPE>9Vp&puw$F5nhTt_ga>8#(Oy8l#2xaDqNdOz}yggA?_gWlT}bnZ%7O z<(-5yKGhx*aiAH>doxL&FM3lVS>nmP0v|(WH#YqpBeqYkykmKQTlMkjCZe}c4ML$$ zkFA)Xy6R zZ|h_Du#4zE?ab(sSIoqtXW}V}c3YpEaNdhCVwB8UeNk9e0{o#R;Gy9`Dyh@h~4?M2}5}+ZG6-u zGDNbJQZu)7hKRqQmSOuUP;cq7TA}``)d_X*x`go@^^T6m7V|^0{7#`;r!zd3DV*fz zd^{pOu%#EM>vY`&YN_z`pSu1eq(#be&U#U&$YUO#T$f187@!P&q*GWK)5st6a6{yg{@s+yaqF!e1NO4%DHHAT(N{s~S3~8N21N;D$H&BZw zDS;QL>mpV(I?f{zq%p9>UvI-g)+dJZh==ObT(AtYnH8;9LldcmMqRi@UF(G#rPa$) z%xS`nJL-%T3%9dQEL?5fW@+{El;U(@pw4v3JQFEIepDC7S2}B2ZwPpT!hKFLOig9i z)*CH+_McOFi8ZXI&#$%m5X}A#?Whj^ENYur4&N%x%V8#ElzPRm zDTU2{*BHicTlGqYXoe={yYH&0;+VqkN|=};ReYl43Di=_LZ^=M2a4fr2X_74WPwtn zbZC)qHYAADu~SJGX~`yaoJuonvBIZH-wq-o%S3_YSdHTdF_MdwuHrrff5@a-tCuHY zF0a^-U{9jC_>>Z~GFh0f_n^>+J_6+_rH{H}5h&BNdbzk6PgnZU&6su|opLBDWlE5b zipO6u08?IJ!I7T8D^q%DcyZjVGG&-xluMl&X~yO$L35JWh>abR>&b20FJ0}0V~aih zb?Qq~IYtTE*q*K4XcXI*7^OhX-BPF5$@HomG^jmm+-OXDh}5sjowcUb+jCA;;38fDRP3q>5h3!m-!=_zSCv4Zc|MAg_LrimW`AW_#NO8 zGM}k2YVGD3tZ7q%lAXZh%@O^_l61ZtOW;a%iIo183SPybv3tRHZsu1g5U*-lHYw%t zL?NE8YMIBfhc>qhD5a^{NjB7*S>@*BaPE00S&i=yvpIy-Z8qDZXuv~dgUu|g?J9`8 zA_C{viQFnwP7_fcmDrnH43&FRVpFQi%x_W;!)0w*nNN{(5pqChE}txAM3WbP8kPf$ zuJ=WO`7{Ka%%q8g_osTp9u>>`<_@K^0@{&h4CQmc@Q`ZV%VS+d*1c%xuBND&A(s1k zt=Tw@eA#R0AIIvp80}oTH&b2TnLI!29VQm?M7$%Q``A*$1a;5dcffrc$TuhW08}Az{H6bb2@kV-IhQ_rIT%1_jND zVJ~m((sd;E40M*`IT^>grt1T`qfxh&PffH*()szWgQ3pHcVo@vts4~kD%1iUq>8;$ z5UJph;sc=htqP`ZJ%US#ULE)dB*FDi_FEG+h3Fl`UoUh96aAjhIZ8V3a~(f^nCtHo zx(?X>beQX}4=;qVmLw6CW(^4kC^;O*T0Qo z121$kdw9FiPWE#9;6lREMXFgLlz`+UJ=yr{qE&8K1`y?YoO|Q}h;XG~g3u+eprD8I zgW!7|)Zq!|2f_EUdDGQp;rtxWH+~m+uIWERm0v90*k)^Spsjt93RTjo!5>tIX!uQg zso@K};X7qQZIGwoqn?H@v=a?a5<$I?q4r6N+=(#ChYiI;h1E`sEnV`89=<$$Y;jFn zW%N+?UX4YmAId&OkvNRqLa}fdGwrY_yN9u!I}(-7!`YY}c>F12&x4s?##ZgH*xyiH zQr`sec%E%`KkPGVe4pW6oNU|}A{tf;I6&O+8(brirXluh;TL%|O$}Q(U%>lvM0JSK zN9{zefRb3Be}xDC9TAFLPhr|_7&L@E{4b-O&$I2x>R3e0kmMRQ^izyeRR`v&7&HZT zs4h>!Dc#3}v^HWB9J)SO=#25q;ap-Z!it~bbnl7T$d zNO9)J{>IG%SnpklqZSfB-Jq!L{Kze+9X)PGqMZzn+Z|M`b*h$dyK}SKZL6psDTa&p zv7Nix#XOF+Nx8K7J)$t2%C7Hf*YbrL-XWGNI8}XXZ-Q(O!{bU&P$az(4DF4q8x$<) zdq4{c5%dYt2^I8k;)eyD#_$*ruvdZH>t*?#Hx@<%#s|?u4$`am$YjBR>~$z>A{=(0v}jRb*1eHA=Wi^{6P0 z@LIH}mPcKq-n_0>CrL5ikqggoyg4e~;~uMYT}CmwMn&lXMV=XJK^_0|!(6ezmzF zlDU?ePvXsK6MBuOxmbQWmsHRy79BKfR{qh8H9yzo`TIs;Iq0ONtolM^P0_I>vK-A$ zeKID@ZPj(#2Z#w{U$Yp zm6nIs%)a@12)>G5T<-jo#Pd{Z%wm4suZovBWnYN5sbX!yPgBJW&TJBEFB&jU z_*JEfo1Ehy?k|lO>{wO2Nfjrmd~LGVs{C@5uWq)bvnqd{^B}dRy+zO>;DceK2&{Hq z=f0}eT2~TO@gb+h57rH;I8b#aR~0uohmv^p1i{C1A-~3{;@!^qB-W1VX`@QlYpS@> zxt+w?={)i?zdlsO*PIt2wrlSoH>=`vs#tq)!j^zv^l>2dNPEuG_G`5DY>OB*>w?(FQ}M$YY0_&4E#HmEz%w=jgD{kYcrk5s-i!TCWO zIWu;DUmu#Y_8d3_635lNYFBJ;E zXf@H5>AV<%<&v+8t?D4o6;i3cGb|K&W2`Fn-n>4o@~5T>eg6F<$mJ^E`*Vps&gp=Q zISMgNsZ_5ib=tXx#NVo7sa&8U^!&Qv{1oDBAMDh^q*$pb6xj$@v?!zi@TrU5-yuXe z$A!TxSrs>`H}*%ku_Sd@`QAsAgSlDH@v2z+-bu?hlT^O<9%G)$uQxkC2$MU+ysp;0 z&jh+Tufr?*YKSQmD`V&WjNDr>_TS47|T<8>{lYcU7}h zzV|0hZ#au05S@*x*!uZ8dSdbev0J-J80lEc#m=q%ws=d)V8-P*f z(eXae?*IWAXh#6r)XZ?ok+NxAv9SBgw)8=j-}>7s{5O#tE?k|0eh?-wwisC@6os|zaM`&G(amG8Y1j>0WDOo{o+Ah!b_Vd*DbRMUiZ29Zt% z5NV%sASv-HUl>TF?ar5&!?KcIU!w_C`m!AMW~jo#f78 zfBElkopXsj?FrEzt#s}Bu#?aNxT{7g}{@)xEdKJ#O8FH@wBR`Ak zEa!(*{YnwJIm>z7M~-j?X39zap*oG1mkE_ZHGTiXITzIc_{y6yBYle1L0Yd$ zD}1Ee*e-wb&=ab3vX8Vy#b@~732IFi_~2cbEx;@nHsl9vHyV%MCP~FL!S~(P;0ceE zP0!1cV57km~D*_qK-mjVYaBq2h&91S!6(ZfBYAE zJ%nB-A^JxZog&ddA<7Vl}ih}^MV*^#J$DQog1X`g*B^g#B* zt>hfD-&wl1xW?X8{UtdnFJ!$KHY z?<+vU;eHYhBw?VI{6{3@-rpf%s>t;fLb>-Bz)_8N(857OsuaUuXF65m5i%G}Lc)gu zx@>2rgv6j?uXX=F*nosV%FP>Wal%UF-Wx2*vNY=0b=ZYD?SEG__72_A2;1G)*(a7! zannc;y)&1bPar;UX9e+hTxaQt!$S>#eh&?^Z^KXUfgx;hqOEMv5Xk4=@_2r#@{=Sk z4b8T1do&z#_(775CE0_Tj4Z1FhnDXO&DK{F_hMt!HF$Ce&*>Q~8j_F9r{>TKZ*Fo|<^g)Vtc&8Ch^!tE!xSJ57e zICig^jh(XT)#^Y$f%9X%&gOq6GCDyS4YjjeYrJx0Fe|lM6~)e`TMJG52UA@{nx`pE zr+(pJw%0oJj%koQ5{&kH0L)y!s(|L2LzMyLMlAa=j)veM-mD@%^Q3G@7a%$l1atWzpypQPG!U|EW2Z@z8t~> zta*^RNDR?UG%ov)UH~K*xYualo}_un(ci8Ts^4=}jPz%`>fc^vo|I^ZQ~w-^oMSNH zkCW*Ws0)V8A}msFKIpldRdCbxZsOF}liAaabE4pVG4WN6a&fhOA=t}yU<-tNZhEoP zR6@K{pGrhTi4jqv9Teuf8<-anQ0Pet!cPXV`}8>=bb-xM*`0LvatBgE_q5*Ls;-0; zS3lkYCrv*?9f=J`Exy1C>8^r%@RJL{&nMogUr#!y?Brge{Dx{1551A3S0?ZpRj-JO zSYo6(G0<30z^pB4<@jXB#RYf*v}L}bk27W3bY5%%R#UWC8L96R8tT~{0`yZ znlwjsU=$8`Kd$jQ`2C9N;LCn6ss_#q)69w0W3Ir_M#AnFj*w%zi22?Xb~rV5B-1RX zkydBYswr4VyhT_bv}!RKs!n*sC=%V&7aGD@sph3qKbD_Xs^|;Y(zIOV_kL_^+TfI$ z%e>9!2BB@M1wSWz2i;r|>q!9aTbEgKda^COFZkoXQ4@{1CYp(lx(6{Xp&HqjJ&@ix z?&c*)B4f?NKPbBwTt<(xZ_^Sp2UpuqBhU_@=x82vtKeIMen2K!m)WoB@ydODSV*UM zrL+&r?38Zq2}xV$`J}n=5}Q_#!fHB&q+I){)$J9*x4QivfcxG{Y-gw4%B4J3)j2ih z`#eCiFuR@h(^buW7a8jK(wjZeWua2uo89bUQF``fG1-Yhsa|nrZ#FRdk(9&Vx3=Bqf^TiR-2mJL7g%$) zc}O{SvF?r-S4f-JXe!O~efkB^X*)z7Bbz_J7q@CRrIdjt5jp4fVg)%FITyM^rQuSm ztG{V-?b8SNxC$ay&wS5b%*nZZ_jm2Xe1@{S2w^6L{?dqhtb3k`+JFZfhei&)liv#6 zKef=r!X$+>0Dt(#`7$GNb%=pxa}Gjh+UKW;~%LaEt5j0HM&2g zuBs`RkjozJmTbOsu6>NFD7znOW*fV8PI(W!7UONfx5ijQiV4k3?mkh8>&71Jo?rHP zHlRm-pipieY6-g1iN79&$6Z-!-9&? zSYkxpmdnz5_6fQLUjmSG+0>rJL2r72cXL={&uqnlG<#aR-IWC|ffvxUvey|a|8Q*3m|vO+@AJRo^=WaAIVP5>dLz$gi=uuYF7C;)Ob@W$C(Nb|x>;yv)a-mJB+aY>3ET zCo4z3VcYs7Der&7&h*JLJoOD)H;Fa&i8qc1ie;jM|{+r-iz5fKjJ@ISyaX}yD`D5%x z!LYDmKr%+aWf|j8-~SjJ(LXO%Qb8?%AK5vMVH0(}Fph2Q-(||{M_a?x3%)gs3xGQU z>Q#>)5}mk(I`Q8$XKD&Mr$E}Gbq?^Ni@Xy{VMUo}K}V98Lr2-j0Xb%WA6W;IEjh|u z1D;f7e8pl5`)B5Uh`e;IDR_t6JkrL^9un-+A8u;z<|xYU;YZlvqVDFWePq=n^E<*~2X>2Uw1PkU z4JEx_o|l9~U$nCO23nLwR`vu)Qxbb=piS9=fj+Q{dDY?eQC>#b9oxkG2F)7$(r~m* zjs8WD%lT;FmPyt6YJojPSSn$~)%v*tn?_hTVb%Hx0=jEB+d3%DI6##0hO;w+;vMYE z)+T>W@U2b01b|yUOpU6~AR(=FVo{1c2ehUjArTtie+`}CB5eaen{xKpQK_a2ZG%V2=nw8( zpG3meHV8S(bBd;%PGH)J2P~_oe@B>z%wpSQ_5rEw)5pP)H#6F9M^ltKD6;c|%){3n zY8U5)Gd#}RB|yaK~yC=a0@ zMnpWy4j^`)J^_R-u(29jQ$Tv|rxAdf4i7UO+;8$>VQ=wZZ%~j);z_Myy_-Soz6Xi7 zK8`ysibr2QOyB+-$A)bljQK+`m()Un;58s>9;;eeS1bE`D_hsfKHJJVTiIe_9r%M| zy9&37E?TPibKcB#)Sb;=Y33(-FZ zh1KUIs;nuPM6##7zP~xh9W;>^8Z`vg&&NUIerWK=@Mozs#;gCP(65Jno2IKNaFN@s z2ifnp6;zHUejX{-6qFJ_Oz`7~?=Sc}iSH)(JBUx?y!|?khhcU*pe@w)?)QMZ9}=D-WVOX(luZZNkHy79%L$r)fMQ{bh}QY9KWb7_@ECC6U@C#ymmhZT+1>C+S+;C>)}-~8aTgz} zOT9o#Bl~n@X7-nnn#Qh1?0)RcGHy-#op|@qj0|?69lLu?UTI{Bqx#%C$!ju}n_Tdk zT!6`kFlma?oc4ysK0D5rkXDE|kG`;z;<&v=ZWz(~#CjOHzuCz)jmi!>8KF7&Vkf&c zs%ucL*JJHY)@5`|La+YRPzQ07mk(BdRlMsvrC4rqN@$6MooxK*?m@e}Sz3gPrCy+U z2Rk!5zUToj@bM1H@_O4WCjqLmU-xEtUCpwG*J$w$mS3J3G%j3AwR8uYQ63$%)0=zd z4z|3!Px^0Rn#RTL`)Z71doS&N-0>?)y>D1p#q_g_a z>YnGng{N5v$zYOHH3k${6;on<7EAZfivXgmG`o< zm3>%cWpRUb{PP9}eKAmuVDGQwYUKY_gg`?Zx|Rscxd1_z)!Ku>^9#DH%B{Tnm}dydaBtMWjf!x~Tl zT7p$+0q7{Kxhp`I;&!qHvnW{KHA| zKWq_xe`aeQPAZxOFWVvUdQmoVH{@k1wkM&OCa7Vnd|+#oWsv{HS>*K?go&1p3HSe#XF*=a7EO(}mw?k_sy*M%lhf;ID&z|xf2W=NRj+&* z$!mq2YMljzvrt&uPT?i5gA&LmZo(94Cx6Z>p9=YD$Z?X>CV|hq@@0@aH+wvL z+sQxSatAfhdMM;Ap0wje~4wXS3CPIUi%<) z&3-JS>oHbZ?O!AN4DKKc3gy^t9fjPhpd9qppagP%c7A$%>Qr!BvGUGs7iy|E)H29J zS zlc#I)G${)T7Y=zmMeS;x=WVqT$n{K~89!kvxFJV8o`vnIKf_!7WstuDdB?W$aa=6L z09z0FtB`kSn+kA}?T4)HEB3_9X#EASX0~!>yulCmrSV7E)|qjJ6tLeMWhcQ727BZv z`wQ$uu-V60+^jgmVz38~u|8m52mARkHV*7wu+M+Z9szp+?8a}{DzJW7Vev*{>#RgW zC$P&;v$M0}^u=J!?4McjhRNV=JHrxZ#~GG_J=4tk&yLft0~^ThnH_J~53ce&djfJd z*xSEjFV9YN1mPw&97nBd+E!m#;ccEQ$PYt)sh#}1S6%}7$_pOPL+#|1UinnWzk~d? zw(=)L^I~`#q-9VrvZ6Wh`t{(fY&^I_;6m9Va96+uvo+v?0&%lryXM5FWr1sf%jmW) zONGn9z)B#$c7Z8#2L?P3Hs+$oWX|=qv97QRF;HjDn=StxE{)G*x-D6lAKhg-wCDf@DM{6zbk{vt7ED$ zgXJD9>={c=k4}5AMk#fZV?PZdun#TnN?m2_qo8t+vRMeF)Ky4v4^TOq-Th2#e5%2y z`b^=TAy^$>iAgIbvD#;1$0Y>+j>jUp_?;dU@|$EI9ehBQWN z30jJUqyUV!WnoHJwBlRc*z-{Jf6ZD3sWJm<{%^)jqKwxyOsu|7armQ`q9Q-Ud<&0! z52_K7KjSwlate@`$o=3`BEJG}i)@5ua^wi`DUmh!?G%}S-=fH#_#GIT1c_0TDf zyoler$RR+MOHnb186*22mjiB~O-+q>`tv^_hwr6~O?w*#E(@0v#=xLcus-ZKO#DZn z5NwFJM)mRk+@DRaNp+keEYL`u72`h-4HVoVkd&=bhX4W<@(>)PJOV6wGJfPT!(1F; z(8c#Npz`V=P%>}Dk37nJ8cIrCp;>}6c{KN|tJ~->Cy}^ZEpKs{ub_6aV~h%Hb4byC zO1>Di))e15Z+4pMizPFG2 zJRkS@ZQMUd?$Zok;1Gi@;hwx#dcAjQ@4Yju5x=!@GJM=;wsHSoavx(TQr#~TQQ&@u z*L_@j_wlN=*7ONJ-YryiAUrjFXL28C_()w(THPmLf{3;WYVSVS$9;&8`%twE?=f^& zlKl;DtKM5@W=z0P3T!aE!j9HQ8 zpSAo5#X#C-D8p$QJZJeGfHDY2CjPaSzeu>8giC?})LCTW7h%ouUv3E?{t?2Ng$8`! zCj>-dM)_~D4ka(=+0Nw&9oL}_{@dbCKpJ?1RK}D2Z*hGIFkr<9+0*df*J;7MK$b$B)G%jc9nG@9!T5<@gqxYa zAGMBuvm8~c8O!scww)jy{!q!`cVh! zr9eISI7Uv>ZG; z*h|P6Ho}d%3RN}kccda`sy=75b?}Ymz$gXoBM0j!`79gZM%_}bnhw~ArjxtaT)a-p zHNW4Y3*>Ayv3mCRN=s;07|J=eY~*3oHI8SURwd+rfH@@R+QxFMxo!BxfO!51QXm~g z#4W;)+|@?7QDe1BVJHsNE5YktO#~yJIZd0mWzv)6+&r7DipArg)Cf zUTTgrm}iwGIHRH~Wc!gu6E*Vy+h5#w zrK-i#NTty}6lVTXpb323c53KC8{tOX0#!9Gm69t`$KI0~T19OzQ0>%O4gD7ltHCN- zPbh6h;vOZ(cGboEY~JdTj>Xi^IsUp8JlMKgk$vKJg0}_mZPg~b0JjN(yFk(@)Iwe# zV8~ZRk9$S8A+mKBgW_W;k~zMg5catylXj)laRJqSMu6e*LF~_$QiXg*K)zSLf!yC7V3;+K^?o@uiQC^E z&|8zI&~%n>_mBDndLst1M_=v|l1(wX3g~zd+w^kkgpbKfSO1}lc-V=Ot)6=LguyU( zfXHsVBB;FjBVgoth2VRzo}hDxz7>JzCFKi4Pbj^s1mV7S;vIO7lC+!^ya>t*Qdb;kOxNg~_3*H}hZ zP*s-e4Gq17Eq}P@w%c*zw#HL?EZ6s>PSn+Hafr;AzBkoXSNFa{r1rc9tfTflw8j?E zM03HV=c7kgSL?7&XPz}l_w)Ark6vxh5)1F0)%pm!0V;K67K!4$q?OCl-@t1Cx>9t4 zTDFkiP5MZF`$vboOXba4xibA+K3nu^vSSC0g8TJ`)SkkQpJ{-VR~KN;i)!7k&lO{H zvZ&QWeU6N=g<&8n^?+8cNdDLC2PJuuK2tPdnU&Y>LD4KU=%!P5PS*GJ@R>JQvf11; za0>hkJG+SlCV5Bg1xjEx8}yp(4(?`vUk}l`OVLQ=r_e9&UF-vNbt@c}EUL#qzi=|b zP_oRXt{&tUO4X{LNg`!NdMbntPt~0!zQ4TvR0J&Oc=|YZ&+y>z59l>h>z>_I(1x^TS};<-qmFZ>q^UXD!-?dCtG4@oNv&D z)20=V*Omh;WNox#5)GP{bV0NS-kmAZm>a1BTDXnTRI-ggu@_RH!;C6<9Wq{H2^byEIYVXo#0_Q zb!AvV6a1gGRx!b&w1!Y8xJlQ3f=6rR^7QvQi!@r)@hK*Fj;{R#&(+G6=|?j#!J{0L zbn#*dm<)Sc4{FZSioug6yzz5cUa3+%CyUX3TInaIx4N93(aL33nHuS=VjqcVr__~* z>3&Yh6Vts=O!sDGpm!CV?x6W|UMUt6zF5qR@0He>(Vy0(eTt#4n$cd77)IN6%81`G z_9*# zBY1!YC9U0xwoxmqE80g&a=R66laeI@6ic1+D5F}1kHupt%=VTknft6&x{Ldqnsl93 zu0%7jino#iuhK-Dt^{YNutjf~`f{u3$^a2bwVI)oE5!|ZrZR+X(6lSbkf`a(mEadT zvLkPqGP!-Z(yyI;xiU(WE2WH86fa*1Hg;s;Z>KrxC~=!&SePuDyw=`7wk& zw%+1sCao~p@GV@^oQ#5~tHGonKll#*Ws??QRCQ^MPWNngKUZ&(C z<-i;+e^~1B9Vz@{$WYyH@VYO9`|PXf)UN-in}&)wUN=wJ1#UfA>JraKi{WY<8}P2l zVW2*{nyxN6aXhzct;#oOkbh!0iE%_1e_04BuRh2_QKV0@)zu-JPxenniMc*e>hd0~ zS1%Z@tH;Vea2I4uU%h6Jqd^z+f>jL5ifn8a&%J9&%A?kB7&fX#g1np3ibiQD9n8updh%h^#i(fbpVUaVIC|$8h-eh1V-V0KuclUy;K#7H z($pS^;K#7Hy7FA=$|LwG?5)0{SQhyK`TLuvPn#-3z}v_(>IXuv8cNEAWB#U!2cT~} zM1ZRqJV3{~3K8LIPc1?Oc3<+<0cr%3tDJ>2Bt*QX`g&Eklp;T1{Ti&@j#H!yygtWA z3(-7PLtag1@gmxVPTuOUXB#ZawbAU|h6Kk=)nu^ODY^SGSj47IHb0Fnk zH^2dJfOG22XtJoyxh}%RL@DY?a=F)VbcC?lg!Z8eJ2!vc7_4Mtf^umDo3hcSRFttA zkPph(`yluytVcnHj%0sqv?`4wS7CSoh=x+z}q3}?ePCH8oZR9}mv5%84SMt6IM)@x9Y#VEqF3~UHjm3|Tg&8f%Y7s<2g;>~Kas`a|6C9=wC%_`weN;BOsYY3aQB{{A; zhBz%wt*^&~p*6{SPOZHY`{UzEdM9@0wj|kc3TDB*szMWt4YIA4QN&eK(?f*z( z=#xl!dvuA6^~$1(p{yFld_qZm1hFJ}Dg>(Ds?lLFzmf5~TzXBF;{K-E#_pzcUiP=Z z_G4A5KDWb`&er4jg7k7v@~(vA>?{5hnJnWDXH~G~ou@BZ`&L zTPcC()Z%0*b_3bZoTYWVycK zpF`(l`4x8N%R#zM0h8IUUq-TnhvQk&;b9FI58ojx#+ZhJBd#!I){utd=Z6F;Pu$Uv zc;$wH)%_OLFzEMUnUz#VG;F?pGZgR6T_5`4ze<|nI`1c&W$Wgfe)49e>-9>Js9w!C z7!4@nes)vE)ip#)P;tq1-d{Gyb{H@8F~s?muZpd%@BoOlGktUdzecFy3Re+{wG(@7 zc+OD8OIZ@ynwMw<=5M)SUZTMmD0rQ(Gy z*@$RkRk79re&`o!fl60b63tj{?zRMOUn;qIKymwUbX;rK~Dd45Mxaf;C zs*(0!q2Yh4xb_^P;X&whMGBLAAB&PzTz$N9NCVUW{ZxUmqX3qv_-GY>LB&_9_&gQQ zP7%Ob6<@95$5ecUiodVo?axeHy*l85c<&t7r4I5ujO+11a=IMpst%HScWY7?K&?|Z zp>E-5g6}JZOAX(n;*AqrzXi$JaU%u_xtg%_59ASO3cr4?KEZOfax&I6C0I_Aqg-{t zauQy)xjrQL&M~g1V{dUWGsTBiE4-**whm5MqX^=DWFkpK7CoODELUQL~U1srncDxVnX+I*;AvngAN- zd%F6Ys#iVQ^)|_U-&3Su#!`CS#=3qBmFIQyeSrD5D))Uxc|pbV?XFc}@(|_Qc-MDf za<<*~l|TeGNMTYeKFZcI7c`0XS&$qr66J-exC`O&Ja!q_(flLg-dZ# zvx>(Ev2+zURn7Ok{-1>NM2y&?kw&H3sSl_gV^!SuAh4TjCKBm0L=|fv;b==xiHiGf z5+55SkZpLnot{g!mdIL)BWxZbjRuz9y_0#^F5qv(W z;=a4;9ReRH`98~hsT%mc>7cLCsC|6*+d9{;kyvA+u(*a}Of69R3+eMK-DQiC%@1@} z#oE)M)?Wp{$*b?zR|8etcb{~Ziu-=MvVd^v$MH3)hVRR|RVuDMrQ6g5*Q>biCULLk z=T4z`N!35$3OAv?S5>j^F?pb?2;%YK7zflGzW-fe8gQzw@6NJ6*N>12)o#`HlqD*z zy(`x6dt65l#xY-Y=llBN1r^^mRAl`bR(`tPQgPoG5qnkKchlMooMz!tpILZC=ns+T zAAixMJ$L^>2B_iBl^n)fX>sXsW2bu0QdjQVR6G$lUkJwMsT#g7jEhvf3pR^%g$W{+ zsJQR><-IEI`{maYE}L04>*>piWEv=r4XUE=cS>IXr>-mZ8Oaw^{l^E13|>_exu)V% zQw4BX#U-3`QI&fX2%ret1iBIg9xwTR9hjyX?Cj>cWR}yC`>SQ&Q_65OCF#oU-oysnl1NIW;VJ`X3PDJX$OT~PnRu6?rps5iYN|njYm;g jCA(JTK&y$qU!u!(p0t{xMX}Ol%Y{~Mifdf1oc8|!StUh3 diff --git a/build/test/out/test_playerInputMovement.out b/build/test/out/test_playerInputMovement.out new file mode 100755 index 0000000000000000000000000000000000000000..3b9604e9bdaad66b7b350a4093c3312effe95fb9 GIT binary patch literal 70048 zcmeEv34ByVy6-vNUEQa%b!X|U1Uf9TCt;CA2!^G#fdr$%7!YL5HiUqoJ1iq48W3ZQ zCa&lppyN1<1MZ_JC_&IfWyat*4&$g36`jVQlR?yspn3nVs?O=|2wv}d_x;{|_vcZ% z>RaopufAGOb-LP3luY zVXY%Jr+RspLyr9N zV;{YluaM=PuN`*D^7K@?SIH_bTQX*JR{65w&=*-nCGe>e0$Sx{_ zV(QXaa}=m)CY*F5Z;J#86Mb34Q+K%gUuMdBb>ot+3i|x|AIdlLbsbbD@z6u^(j*R3 zoCvJ;t|*zaSg$TH;ZFuY8KPl?rvbUcFan4~axVTG&x5Ce&&9v+ zJov2h;BPq({;KofbIyZr1Ky2)J)bc^oXgJ3&V#4!cP@U*ypQM%2!sD{CveKWg!rhu3op=SF}R$ zuP!etS_M8xaK42Lm#$sBu(+&Zae3MLBBgj~g|8fClQCpKrElSi#VGF5yy;V>E*zOT z+Q^N}yii#*Z%_~XUWw1{fp3@iaXs)RIZo#Gz`G^h+XFvQ;tP7<3njj=2Y#)@FY1Bc zCh?^`@OvbFRS$f##2>3x_(NkAwUYj{hv0SJ5iJmcr?E$WIz#Y!TN14+1RvV3^!`HQ zF^!A*vr6*YfS|b0pS2-)eat3WO$gqiGb6nz1kcwIlGYf47vr-aYz@Iv+4{3H1dl*8 zo?Rh$xrE`g$3yT@2DhT@4Z$P8ji)&TA7fw@r8NZa2*J07;N_Apg!)tVClCDOfuB6^ zlL!8%df*F3?{B=dCpB+9`|Ccj&EOcUy<6HNw86X~fF*BdZR zpr=k;YrwRCICWyN0ncr&+OcUs-6O#>?78a*Yj4)uDNKc)}&|%c>vkI!+G= z@SGlSeh=8w1J3CIU)Td4-UA-c15WP&yL!OUJz&-Y{ucX{Q2W0Og-3igz3%8W-ntLH zwZ}UPX6H4q3nrqe8=@bZKuOL!XuodPn-DqO2yiiUdmGq1O2&8jTnLRvL8H*HcegwG z)WCbnA(?`I1n0kS2qlBR^VW5G4}N~J_h6UVtG?nr`kgNU3N}jxT6cRfw^Ns=_^HVu z^A-QlIo{fwC6x8nee8?!*5?!h2+aMiyF0K9jr9uqGhlTAWR3Dk{=^y(DKiIhE$rxL zWT2w7utPHEZDGwa+qmG6&Ux-^AR68X9D~Nd`}FY;eS8jeA?$(YfDD1rf!yA@4PD+k zf2X%@PQY95LCQ)|Cb9u!{XEO6D5-5$fmu%37Uo4l53(Ma4N#!Muh#+&9QjsMZF93f zGEhQ{^`0(t(1x5Vh`c9AjtE={a-cWa+n+veM%XvLYE%~@@o4tIs7yt9K7lkfT$s+| zfDIt1t|c&x#2P{WkDNpmUgoX03>d^EJzXQ3TRbPJ+qHN)p`^RsbFwy|)_G3X&*}6w zcuv;64gGsTR{~d$QWTKAOFQd5r@dPz?3-N`}&XoW&3PI=<=-N#b%h*eg>`H zQK6Hg{fP(WqqIOP@CPa>_abr~`8q>{&hQ&zs33;>iD8%!Ya;Ag!fruM3VBh~i!^?c z9|mFI3~fOXW)xnCDNmQTc0-rq>)jDcvYa2D_ttv4RH#$!&Epny?_Ew zY@<>QFZ9;4eKy9+tnk7+-=GTLcfui{g%h45hVMJ!L1N%e*h&o23AYfIJK+Z8WIX++;zg~)Ysnk5&VL#KR@?5}-0ax&JJjv^4X2xsI5s!p^T0rS z1Y)R6cyVKO0wsMmMw12b{FncRi3t3sCt8LB} zu~yL~+!i7UF)BI$N!bJZ_cWfv+`7)25FF2Vj^E@tgXGLaXVvAec+NOGW)g(KiSRFa z&QK-l=LBHgpFV}=+IB~s=WOkUv-aw^dSrA9=J%;2j98S+}BJ3}A{Il7S<=J1=M>KgN^bvJGKBC8uN2j>z zV30A>vwwXW7eUS+i;3f3<6wjzqtuC7tlhYz1GHZd?Jq=|OSBT5Mq0lB+A;f}Ba{7` za(6e^cB-42(RCYgeoGPqN#a6Cw0N3PMI^11cw0Q}G7V4)Rct>gfc1_Wss9q@5n#yP zw>nY*=2JD;eH=Ge)T4GqYeYSp$x%a^L5}_f&tG$p6s>tp$h}2!#UXNUK~4n{WesZm z!ZA1ht$G$Al{m5vu6d2qK=42mem#+l9#PLe8cXI3fdolr9dz7yn>1AA!m*xXyg=da ze{t?>q@f-%^x>ca_9oBIHI%J+MHqXGjD1cJx$Lo8k2LlR$2Fc~^=!V>LYDqPS_%TU zwBuS5ujCxDo_8g6SaY2R-WiflE+XsZ3#&Q?*UxFLYeU~q+f>2h%qJl>F2sO$$y@d8 z1kTpSdz!C1B6Z9q^>B^^3!!^hGfm!Rz~T4bSvs$aXIRjE#^XJtS=kF`+u;Fs#! z#(P??v(6tErF{CKgtwgzu@ zy{E0AK&_k8R`;5B>rJy+`+s2GhQo?~8-yl!j%>WMV~EK4BMxMu@IcNN-QBe-+TgV| z?^ee%(^$J0tOgK%Lz`0FMjmr)+7IRfMI;f)DXq#nhZq{poa*lWdO<5jo}olO2{5E) ztv}Ks=c^gy&*%77vdq5?R;nBC?npjYEf&HUUW*UEx2W@h6gJ<9MI9~3<;?obSD1`1 zqBMT&bY@2YTyW6DeQMT$J!dbRb!jawC=U;g^^r;y@oj zbfG4dvMsC+5_*vBC9?-;fgVUDdx8smEaio(>REF;*kRW!R3eAe*Frt=$3`N*hVu1n z8}Yzzr2@Q5ill+>*kL z7huqYA%3dPolpmSJK^60ey>UrVM ztMg!e$TqysL(Y%QK3ga9zStM3Tokbih`^c8xlx_oQ82h4!Uh3a30scwC=|BbgLQ1+ zZQg&e-Q@k9d%pyo5PE8f{H!3;5*UkDPNqHzkk|J!($vCEyeD20=_Y&zIItEbguD5B z)tOf3c^6f96znjNSLYFt4_4;^(lty}r^|~r@zE}dm%fuWfDJis3hh1Zc+NtY2A%eIgSB~AO6A*!GpcRG&P@8stOugq_KB+r4UxxAxybT)39<&+X zjrqp$YESS4HpX%h3z}4C(n%XG<0KPE9x2~35o0X{bih0QrK)p@8r0Q-O47PwEa@@t zJ~d@f??JnE*X{WI9DY*p@abPTTSXqPMWsJv6N$O(t$nyXM%m6LqNFfZUefi=66<1Z?t6Kk*O{q!hK+TXnk32Q^3U#kAh-&4B$G9+Jb(2-@2zp~Vh$ zu};UPHvsY)(c!>2IKjMTB(_XlqJOm?Y&X+-gf_E$n~ZfYO6-Ds7gsG(8X|cE52kHp zLryzR@dEdtDY0}lMc#nmEv{1=kmDCsC`K3Np&IV&}tt>WBg$%wjJ!8a$!0z&m+p4P31lHDayd`Kz5uZd<*OPb9i}Y0SC6A zJnn)C7+E&`9EvfBHKS)C{{5|-0u7t7d_XVk1uakZ(DDpvnG7v@Oo^uD_P>UcN7?d$ z6J4k(^mW2;4gc5&AmVs|@4`kbkw~iqsY{a95lMRV z5h|dCJ^WU$b$W)+Kz^KiBTypQ8gb9@cqX;?-eJVCN8Y|o#Y^cMeP75uhkmG6>1FD54LNTT{sE2` zRoWwZBd^l?B-_H?c{999?*k5$!G`cEWm7AOvAAx-af~V$Qs%Uwjkbeduh4xWAFNOl zDeDDga>YrlbP{8j9DwPt5FsMgTKX!EcmiSLoZtyv>2V=iiVX#KJ`JDjW`wTjR?a!p z3G+_|evd^Act|li3Dy_1JiJfz7rr2i!fFj}nvel2*P|<=v3bkih(UxGp|1?b6GtKE zkk-x-IQ>CSr>`QX??#8% z35Rd3o3pFO=`UX4{vD-Z_{Q5pc3fnSA=@Fc?Z|#2vH`3IuyO}$D>i#LAG#AOD2$RG ztS5IJ4bW-;gJwN@qb=B+uZw)JIbQ-IkPkC!H|(-Gw%Am1>MpCJ_GRwgUCgoN3z4%p zYPX4;O3V0NwEkGIXXRwJxNnFd`~i0!g$EYhm$NHljI*QBwj6TwdXaDB1Lt6vK@51kC^cX!_(SS?5qF;-PpbKVjQ;9G?M(}*|^L=dP-g1Ax;?L^Emh;r$C1rg=EpmL3i;)G zd}bCaG#)hZVt(jLwqK9_3{&}T;Wfgyuvdv;8=sO>3~oB3fDFE`z}!Q(u@e*`21qg{()|)Xxb9~a$Fry^ z;+%}oA%laRc8G`CA z2LpQQ3`!`9KGB`|f4UduQJ;>*9fs4WRK#FCIv(oOTJLvK*wRP|(sL;wtpW+XEp(gw zr*=+`Bl6`!G9V>Og`|l{V+5&FlJbcpd)6u{yM>j%8s4*30S=t`EA`K0V~gC3wFh>} zd(W{&ei^I&o(t$~W5p~sdTsEa2EF>K%p&r^LE%g*3cV49V*UvzSWV)PLGdk+%cPF% z`Z;HLJg9AsXPou<1hjiqI)EAX60R#?{SO7y;Tk(8*W%zWlwZMxlmh|*87Lscqa7){ zD8Ee<6$u?nqz)K+HL@_)cPR?u^PUf@Cqzj*w?d4z`^A*U7g7Bw-@@EdgT9aK4><7H zv7Q5JuI`?YLr@g@NlVZ}ABud?Lw^M#unek%hsuT7ML*s{o1j2=XeRfN=j;T}yQ?qm z>8WRXdg|ehv@lPRx5r6cXm{A1DQ%qr=V0UB61WumE`DCj-vnT3|3|_O5dPxsJPi)$ z>3k(T_D%y1RR5)?zY5?lxY^%UH|I#mu|aE#Cx9l$fz?S$u;A&GDQ$46*WL+zddxM7 ze9)s?sIWK`M(;9pq`e1b(tGIR{eYM!ktAla?cIbG~C3 zz1kd`YWSF+-;8*ntviBWyf=6aF@%_+t^3zlo`z~U12}Lav|u5u`ZOVdtuSt^H6+kd z7PUbj;@%4%xx0wXpAt?!W{^A4V0f`Zy$ElK(2Ka6s27PrQ}!YPy25(VB577*M^3FL zfL;{jm%T{J7`+JBa`>R#<)a?tmhy0Y3bNFLXk*CzIuh#-cv`JWf_FbkKz;8+f2S(I zx$IqXATIcjHqpHnP&-K9zf5bF7IyG(xYu3=94PoR^m3CSs_^JrdY)7=Ix1Mm~a#kH%A#lZn;iiO!fJmK3)*!SN9~ z93NR6n>M3e#65B<{w#eGv!T3Xre2ky?7EiuFA)w6KRDtAeHv%)0;wM!_uo=5-HOtOZ?n zg-_&zu2@dOU-3eigNQ*_#L$YWA?HR1IF3=zTD!cDRtmT4{&TSQx8cd z?|>LmCG>^tx(z4m{8*gf%oH!+r{M(*PFVQ$QH69L%?{a+!JJ8z6YRTk)CT zm$$cap!@{h=JNAQA4q2h`7cCkP4Jw&E)oG%+ib>R%SK#*11dnMfJ8YCTnDkh*&|SJ zA97M?s3BDC=Gs#6wE+*@10T#pvKOpMAQ8oOlt`rzkxIFU;wOoMT5L%>d{ z?iJYil%cAE*f5`9qk{b$(1Bj0oX%@MA}9tB@-|o*Fd-k>Bd$NW6IK1*A?xNo1z|!EwS*i(l{VuG?ISGVA$g%@GZPmT;ztU0*Q9}@D%~q#ETFro4KmGx6$oLf9RV>90Sn-V-)|U z2)=xA1oB}AjLybD7jWXzb%gH}Uekoo6ZFz`VCo_!EKR{QP%@n)CM;Oa!L+%#TAl{uMK(k(*l62pLSuA%@0F|^{kwE$Bg6s>Rk=Olzr}MzgTc5VDw1}rmg!PN1Wy7q$6`+? z5-hU`Y8A;b#-XCf{d!&``t^`jL?|!y*w^a8v#-YF&5O5fb^C8urffDHEwFevY(53-5#d4ry0N70aK6D+M*bbkY z&D((SssXpA#S(NXd~|->l`z{~()I&8Z&Yz#3|>H4<2}bVM!__sj@v94tVJum*`-tY z6uZw3zg_o=9G{yBssO}!;V&9i67*rk4?@_m5x`;)d%_6O(l?Ofu#cu~M4-0ahFKi< zfyigI%{X>y$LfoAo38IhQ|Dvdlnj=yCIWavMB&nr3(ChtscqK4kM$9Io4^LwRTm<` ziGbdFT`zJyPzhumdt5+WVV(0Boua_VV~XDnOWICQzaZFFg)bqo>qrLvsgyN%L{QrV z^%_BK)2X)*wZZj2VqD@y44{wP{|G8qFrS`ifwR<)}mnb;);Q$R~# zG0l5aYhIBLK<*3+9Zs-SrK8NRMsj<*Ry$$nwPXP4Qro^)`d+0bY^_)CdWuBr+0&Hp zPzv!$J-eUKsAUMUg>3?ohSAU=w}n*%vGV)ZldsBa$oXZKqD=nT^t!hv&zWBL<>c9u z>(0*cHVnT7=qvLEe@nwipwCOF>A`Q!zCI)VCcm$nS9dC}?(=DN|CrpJ@ON+RA=Nwn zJ^!cleebImOrAe^!Q^WuFFaISoayMZ36{`%)ZX9VJc6gBGx*JLPX6iR|8oz}-%Iip zt@bTkRlay#QRVas{2i(Ml~qM6iYk1WOV3L(YJJ&ErC{=vS1OlGo}Q;nzjW4RS9p|J zbMo?(OgHCod)BThTIwrW=2qNSEnY2XU$oji3kt6)^OcrWxTh7B`xfg8+;dm@-IG@@M+NhX+_P7@r>=nyIgJbgeR>7{ zI9Hi(9kTqHRaCOrS5{TzHVCs8&jMvy5p=J>-|_MlNluYWuc*SG_FCq?q{ZQsE zs4QAqwz_O3e5|V%`o@eNzNE}|uEK|(`%&Dp5!47b_a*q_X#PsHps>_Ey`*AgC55AS zF7a0^^-+luc2BM>@l)`-m29N~e+r?jqF9+e>ypbruep1xk~_tr*d(t^YC=KGE!E+0 zHQ<_y|7~&=P-}vA@$Q!gj$K+_gg?lZcJ+t}qeiUgmv(jb3T41j9lngiSFS26Dn~$! zxX3+VnO%oQ5)`3u(7kH0e|1?=r7zPxt@6Vxl*C{2!`L7jv!}ymJ6;&)FZlOVdJ_(Zf?vkQ4Wfc{^48Z}^ z$RKKJ{>r7x-K8*~(qG|T>G!!;7Q0vQKAGt*fRk1ixfhq0uUv}2b)%;i$$Cr$60JxW zx36pk+LsRs*YI1I5eJ zx&0Nok?zHMIHQ~U;XF0XJc0hUWBK_orK=k$NEac^L0W?}AL&k{r;s)y9rR*%cRSKiNEM5sOhW2LYCiyZq)#JV zg!DAh8l>+uLmuhp2O*Di2$n7FNdJnI{=jD8A;=>=f;1QD``E!PLVD4wkVm=>=}x3} zoFgziw3#l7vIZjS;kxsyA)gq+bNNbSp$7$$Jq%YwBuNi3sk5)a`wchJ8F-1e#?p#_~E zZyVi6-^OeHT%?!b4(%eOl}KxlZuqpjdmGX|9oXFC{@LBV73qzgkVpD3(ql+JK-z`09+x@k@8Ld)bR5zTkQO2xeG2kO z-#ZO?q#M74JkrvyAdmDY(k`UQUqc>S=gW|eLwXI;LZsIrU5m5{=~kq_LAn=dGty&7 zv$3CZ<7AYc1d%A}`YRN5ty4{lvT2Rj2@}2-{uMsg-JL}|)98>?!QU2!efU@NEPRPn ziE&;MlRU!_xkjr|E>68@$f*8(2~G0z@o(JT?rttfNIZo1;a@iJZG?~yl|{RyqbP3( z;XEks+`7;7em%C8RUF9&@J=#PccO%EITZvp)%=zOBq{cox==(|DB#+XI%W0Y@NZqSc_ zz6ta=j4=k?Y-hwk_MHU13S-s$F!?JD`6!HyPlA4NC|wlK<%fZO6!gYWx@n6cp9lKn z!`Dq_U#7!vbOWnkAQB%>r8)G`Q=9WCqcgo zb4hVn`3sElqYyXu<3-c0Ve*>|`C*_(V(u9UJwf{iTa5aHp8igEcb_o%L_@wD^j?4K z?xy<%LHU6O{T9%NVeXn7X5To&zTKebzu(=xIE-Fs(2szAD=xk9O^4BcRvG>~3Hm=k z?-%Odd7P{y0~dw4^;6IzL+t~eXoEoeE9TJ$LuHYtcAo~?LfpRic__`a*eI9&K=^M# zzdMZHV9+;#-UoAYYAF43VHfFt2=o-tH-yqnK12R6=vAQa52HV2(2s*2hdDnfls+q{ z--0!P9rRtH^)~M?+ND3}O}N`MCybtF(5Hd^3auqV^81w^`yT>*Ij)8c45eQals^o5CFp#f*4w=}NIwqx^`KuFDsP%$=(k{keH!%NhQ-xR zBd+>`o`bc}17Y%84f$!HzXw)$ECJH&{F|gKlBdVzO_vdSk}b+AfXB zt%w;nIVO8@%%CYT?kO?JQ(~M`Vl@7Dvv)&}hI*nK|MdLifuB6^lLvnCz)v3d$pb%m z;3p6K;u~Z9(SM&NO~Tk>@Q3eV zk<)*thW4-Y==3kY>t0DPoy*gsujO~i47RHLX_fQ{3IAKB{Ok~U+LP16_bejIKc$#b zDBpI`mX4lrvVwH}N)NV#{Na0I;A@3IENpU^nXh@Mwatmo#?;U)>Ch`JfzN*X@N`^$#j)WYh>Ce)15MX zT&B%3ZIfxcOgm-Tv)um()@lTYkxBvmcZ~GkEz*CdNdH|T{db7;-yPC_XGs5DA^mrR z^xqBAe<$eDsZ%d<51O;YU*Yq+$7hbt%pN|%&!G_;M`mYckIo!9Sm2dmFhzuyX#7{> zgl+Uk#?JK!{tMC2f2m?7xxdY=hrS4O~cI{5>?dNFvSzCvet0hA_fYde* z1j|6jaO4#moq<~h@vj}^+A3kLWw4X9con;a;Ua@#8V$%Yy!V?(%s1oXLxQO=Sfpxe zQ72}yZG}!|v6YdTs&zd_vL}(4=n#Z$O`$58hC)BPH;wWUTBJ6BgjDPGV2k2;izSUD zHOq&vDtarpBbb?gJHj*(GS;I>R4)AR2qjL-dtfsihluS#H&INJDgT?)Vkp+)kUyr4 z&=}!Pf~t+OQT-JgjX~NNI~}`fw!afFmIF>3{T*X%90!tZX9yV20k^G+m@neMAltuD zt~P-K*|vI8Fp&e}Y+n$N!+~5Ior`O^9PrxcFj||;fdbo90;X`F&^8*E(>L-PZ7~E~o#X*!tL*?On4eOBWT$OE8M=U*v&%-` zgVV0Drz3gXwwx#nBk}<3wS7gDMclS#TQyOZXg`C3!)Sjbc3a9uaKzY1_0Sjx9r#CT zDS#q1BABW5$u1dJkynmAC=1E$xN~N8~lq^qPB6#VML@iCe93eM5Uz?HSTx7+HO;wZJg(A ze8wl7KpBDTG+ zx++nG+qHn?{;nnyG{{vzP`iM#T{{W-KtSVMuaik13MkigDM23z$m=r0G}{R^ngXXl ziKZ6^w$Ic)e?h@!s^GoQgc{$9B>Fuf?l;8~F1jB9FGye^q-`%s;2kRbfCTO#x%N8OfMj*RNI+9jpGAfWuT5%9U18vUJ|&GZEqC@09W zr06fcPkD{XiH+7Lf+2=Bh4D#)hEq9dM4%QlY4n`^;(+^U(!ezEe>`bWoY;Ql<}*~t z1Y)vc9bns)O2J`FCh2In{~sn33S?t4nF!#&ZZeqyZN_AB1%Pu;CJR6@CX-SC#$-a~ z{AVYV3djT}le^I*JtmV8V2IR+z$XZ@%a}|C1CWym{VcMaOqL?cc{l33!O7%ipdvMD zY<)5zj6Rw0eCT9C-I=CM46RQiiPZRHa+pNqWJ1(9o23&S-FAVzJL5+P&49(1JgHt4?g?Hci?kS{Ca#&j=uw+Q{uD0IW7Jx ze0t-(z%<2ANB(vtWTN^KC`KOu21%-58YL0yXJDe5i?hp=@fJpX4OwBnd7`Dk5sK1eYbJ5;c|2SU3Pk z{gA*|Yd@(uI7Os(l3cV^AKZf!Wqmp#7_*=;5md&AiJ<4U<}8fE`-n&_O3Ok>$$dlw&xca;_XCy8><_~ z_T1Ain44(7V{CLfK{4j0GXRXaiOezPrh$+# zHab@WIQK?J#h?|On+Bsv9CD-Mq>WCLM#E^7Mg%j3C)p*VKT4yGjgvMyQCbIO369df z!YAjAg>JdgiIp3jbfBU%YV26K(IHH%-01N9ZKO|bbZBF71^&e;5tnjFvMJ&!5|MKg zQDgW<=TX)93(i9uoA?Bqg+kr-jH;dj?Bes4i_cdsK3}=`eC6Wvm5a|;E7_>ea5s z>?Ezf21;?|qI0XR)ySJ%A9Af#OI2&cB$3QFlV7W`)ILfw z-%NH1NK59M$!`SYOy--(GXhHHr>nMaRTm8+?qq6n+jnX*L4%U{X0lsA*~xq}shBuz zTr%HGsshSQ=9@{AfV|0kGpU)PUxz9BW-`ju=M&g&rXbn{gArBtBN21-m!^2ai8=Z! z3Gg}kYYFf65w<6842(?`m6-_9Q~~TQpibaQnKCLjOL|>TQU}H#CwTJ zi5Q4{3Wc89C)IAwrB%Joc8$(vQ6gp$+w;Wc2HRB0meN9)3}C#Wg7@fxRwZH!3BE;a zeZiJ5*;0of?9~1lRD|6;TgQ$;2&n@y$UeJyZm7ynb(IlH#5>5RHX~Hk3o;0AH!lih zbs^Ar?HG>3kWc*xVWJ0 z8Vt@LyxqJrl=W_%HA;!Nkyw9*4|PZe;qB(Vk~MWIOjn1>vf4rw{6$w_S0Y+S!5387 zVHt$Cn*+Lnx#%$J@C@>{-F!;N4yM{>O1qTHd2@dLy5DJz0>IL3q2_ z9m+aaXC0$NOea>AEXd9vJfb9&b(7B8ONsCi>rq&#j>sT9d>G35n9iE4MC>5eczmcM zGYAhKO4ihc#UJVL>{r)P>4D%gYamCP}VIvYrGP%hFG5^7mUv!JXWMv zh&D*k$lVjr3*0*91L_wOfho{2pA#krm>L~(hA@+W*(ou+3xA^*nWRK~N=3TK6BlO? z9-atg9e{w~b+#!HF62|A$-3MO!rRTqBx|alu#;tnYS*!UBDGUws5??V~eEKoRa<)s-|Yy%=DEDyScGOl-fI*Y}v2z&BMb}1d`uWMONL` zXDCVS)~tgiiC=Q%B$^%FvDE&%wRD<5aNwo%F*|{HShG4Lzy88e-L}Tye^~3M^JhFv zvDTPPhmsbV|Qgs_!bzx*}HyK4{2aYRIqBdWXrc(#9L| z-Q?z#la;(k{0zIJrMymPcCsdmS#*<^>Q$?HBu@LzQ}*PTt_{*EG5i}n>gOHjv^13n|4*ZKcnK_w~qJ#6ThiRN&kcx+O3&n0GcR$ z5e4iAI$WB*hv*+#*6X8`T+UFV_E)ear&^n50VQR_~l~|L@%hm*-c6GBScMNM`)v;Jz7C~YJ> zK##iZg;-Q}IW_d{>_XjGQTsdCSZYHaTRc4P)Deg+9*%dhv7!|plHqta%NDJ;Rfgj| zj1LIrrp9Xb^W^cZEVrAFK#B;@d)YVmoYUJq!*Bt_v`TN zfp^ghPCWgwqoOBWqxgM>#q<3);`dvcC!f{fMFZcEFCRt}X+oeB=!_Wh z)KX@3Nhbak5fIdEIdQtDma=T}6h>*`sAVim3SC1V^_GRICe$NtPkP?eH=m1unLX z7HxTxbbGF4+#cR}wpOQKM?=jNODriwtfU{JP@HOUkQbmb&S^SgS9LnwdsjU= z;_+(5OvRmsyj;R$EG3a%7VAZs!fe0Mn|$#w`vf(8FUuJI?xShGs7AUD7rHMeulKg( zT+T|)ZKY~yUe^15&AeuCI>!bwgv`^^7uEakX5&h!}~~4-b3cm zqJDXze!n(PCnAlxJZv5oFg3C0zP~Z^K^P7e72aj;F$VwE++z%W#4N|)hpI()-EEfL zb$0qT3adTlVWP}M=?4gYREJB`ODVD+Gsn{T7wVXvKnsS)b(m%svVPDr)QRsGmj|94 zBx*~WR(jNJ4;r<--#kQUnlEa5zd1*07PYj+G>eDsSkj})WdZrKeTX5P=uO*>^bbeiRmis6v= z^jI_R>A~4K&OAyCe~R#Dg6>Z_{JG5G!(XBf&mOq_0%3fYbdDJQvdrPbU$zb}8hB`+ z5Ev;EIs6ryLx;aj)JX4|tpAiNCH@UT?wR}~c!u}mcTE$;a3`mw_jI^G^yBwU9?_5G ztoV1+IMI*ftk`avVoWsLD<7D=V*K-pj{T7-*s*V=p{K=U9V!hvERDy^MF#PvYB3EL z2FZ@qs>6#!T)%4KizK6Cy=LNTBy=p%DzBTyi}Lf7jJ~vNd(vc`-&Yj$hEd*doYlDb zjPa!D0=+z5{!=5(_F>$0i+KBnFGyO?;_=I*K~qVUkOi0%gb~8a!5-qI*mI4-56s|AC=@ zrRic}qtw4jhZl*Z&b6jXDA;LdFrp z$fwjF$D5-6-A4%CV#r?(d13!}lN|g@m7yPyk1|ZwGRfa)@DEu)Jvqe`Jw%e^Iv-Wr zMyBvhNs1{)PS?ti-;%1&)#yLcRU$m|MFReJiJ$h&AZO{ObNSEJnL>V%l95XC`Kon4 zxao<*ghh|K&4UY~?ol+R<*S4H%jr4&CaUUeHIa5zcJt^fIkS?!m(X+6-Ysyc-JGqX zXOs4y>F8lPdOT^JtH#kw19Q{v>VY@Ny&&Csq9^@5>bBRaF50)!dhLP=MXl7qr>oN+ zr0H?B>N)^sKEOur>`b0 z*Q=>yn5k)+GVE%3OSVCBWdKfpfSh`>&gE4Gek!@Hm0Uv4R-Ge{jHL7SIpE_93X$=Qt5-VSCuP-bPk~GH%OUCoqM-`i++{;l+3*GFW2t(>R40E|(^N|9^?i(Y^vL}rY-=Fl zpHa;|A1FuURIaNtDC{9q_E}%UyhacIMn6(@+iOP2`!eNdmdQuseOHLVaG5gvJ6h%3 zWj)TXJSoa2Tm=ay;vHw^BNTLZxkXGSenJX zPJUC;yfvj9TKG*#^Sx=5w`xtKSKO1dQC__9vy9Mae6XJc#xlxQgha8^cw`x4uScTU z|4zVI4mj=9$t~kJkZh-`jh68oaNDa8ewK?kFvw0<8!Zz!kj+0W6L~Vu{sn2v;XtmP zCUi?K2fTK=+Gv@~fdV^SZM00`K%t$kHd>}7=0NEp`%qGFNy1bBrFI(0EM9K)Dmz_m zv`puK&rVkxEi)olgJG?`o7nQ>3Xs&;>Fu6nmg6b_H`wP8?B(N0$zEmtQk17)k7ZedvFr>q39(@s|#Eep6gyXl*Y zg%Pv|*lYiaD2upl&Gu@dEYbW>Am8{gTgv_5i=a1tmZ33`)R(Q=I51c>B1BPxkzLUg z9fZvW5J{&{R&60=>5ZRN`#G|lceBnLuf$9yuDX~epsc*HW9W^a^=6KVp*MckdXc9$ zezw#o3WBJkV1EVw@CUB;amlT~+FnOChTizu(o%_P+K!0UlK72U(^ZsDPRs?P$w~PX zp4T#vpJ-3ku7jNYW&rlom~SAg*q0CpxILhNasM5{eAQ}d+!Lk&+D{D zW2a~D6G6&i?X5&{M}H2=X#1}T$l$;@C5pIj0TXvwA9N}92#Q3{S_sun6(13OOb)uA zY1JswV}1|u$o?@r|0v~0a!8c=uTg5kr^NF>ToZ8SrYEZvmt(ph>s*54Ny+gP z^{FI&xn+y>D0LP*a(Mw;3Q^}|eotmgZ_49jBbncm*)mF4u?!7Hxs;<+ZZ&t^gHlZv zS4LHOl+b?RjP3Eqs&J^G>CCNm-Sa1D>)HTr1)nVvbpQxL}b*=9w zz(q>RbL7`W+?b=62uX@Jdem(bFa;#@hFX*&8fsB8Z`MWqMCtRBd8;lOFTg@2X%gw1 zXT4kMnjlm`SDB$}ULVTS`Mgylt*Nafb2+!6O3Jwnxt-umqj~TO+1lkw>g6PG5f{kt z2+ldO<<)H_8`}0`^6`WO+LW4`+BYWbCW#5D0^V886;71V_3p-mL&QFjhl{!C*hZz- zFA0%mT{l%|-(_fj4%&qe(h|aakTyj6KsYRIvT#_gXw0;kf;w9?X4+K(EJ)^ooVHYe zcpWbb94!k>!y>D9jG&gfo{&_hPQ|HhpEyCK*)sihs%DZ^pQq(&2i{j6#_GwUq~KG| z>5n05Xio3>MUD|z9R9bxQKes|dJ~o9m#IEPhA(e%PvNKUV;I+z=p@{@rbK{oO^E>G zni2uVH6;R!Yf3+TAH#^N|32TxIDzgezI(9(!)AQgcQ4|@zIzeRugmD)y@==6W%Tb} z#M6*weD@-rUzgFpdl4V@-HUjBT}J=zMLfSQqks1zKJ2>}@#p#O1%2~?UuoS8gK?#m zj(&_Qt%NhKv~pk}S%&XkaDZQz!FMk>@JFKHyB8ebOFDe_f&=`z46d|tpo-Y=-3tPo zSD~iS(Fyc*2j?d2RH9=8 zgoyzrSI1-$#sQ31$6Q1hColy%<`Tlh0#m4Ct{_YtFpG4|HH3)=rc}rLoG=N%tdbZr zjk5Wehh4NlvehVwYf*KzSD%T%;VOeu- zPQ6%CaiYf`bz90LDsww-mSTF8)UgKjGEDiYx03el7gE`@a!I?2ByQpQ4(18gOAUz~ zByk_-m?k6&6S;z0lLfdaaSYjWn*>Xhl%d33#q||RePxEef0DkNNup{}n7*~Tg2e4a zUB|zkMmGmimXW1O zXLDi^gVOd~jciQ}*Jr}fS5l^OafCN*4*!Hl(bropN!xrdbhk8Br+K$kE z;ne#@Y^XOxzlfuLp?8GuH-k%WhC~Zux@RLL_3SyxJ$p{dXysCBRrEw2?x6+{A}vXb z60+y@g1jbzfI57-WapJ4_TEN!0jfu@>tnPmr-?8?3sM-kWxq2NWt@u{otKy~#|Mp| zQu~E7Z&AZLb^ma(J`~8J2V4LLUx11j^&*u6BQdyA6fhd&fINY!qEu)VwQZ-gI`tUV9o{Y_s*7M<%5ZUJ(;1p$q^qj%?V+O0> zlwlFWzCMXyBCzTaZxbEi`;$h`X(b{w@FVrWkJ4wVXnm%N35`V26&%zR^r?eKikv#a zXR)DXK!r6^jp%6(o;s`Z0C~(pL#Dzi6fh@k~K!%149mrffj<7%vTN+RU_gEMR$Dws- z>N)3uEJ{AK0K zvgj9Gvhafn6-AY+l`Q}2%B-@ArRDx*MOkadjai6a(i@UI9LUDQ7lB|-YOTVvpyk4e~RkgS>i}Mw&Se-R8b8KdIRtaU778NanB_+eNGe?cc z9FbLpUy@i^ndPV79LZW;xl}pt@6Rk0mBTO8pwg?0d_P~YDzg;dlu;HgTwPWI#6lln zY+nr;_Kv&?f^D^L*|MTy&z|5D$=OQz>}grZ;$zY|jm z927!J*-DvRw|ZewC4NF;H5Cj)aHyu(P5L+W&9N$T)$U*kJD9p>QthPL$;@0k7Y|eC zUW_b~T$ZN!S;ig~@dQiuF}6pW$Lw>Nc8b~a=9bEov3c`2ueo*~i_mr=Z!)3%{{lCd zm3oSRo)N)gpuR zuj!NeYkcz`6qQAsW}1(sDJF|LgC$YoLw{qc*`>KzjJYC{MH2$u*6i30gf9eP-_Gnq zcCf)anB9jX^aOLtL>Bu6(>5_j6^k}UWHRSIv%iozKsCqAxR}LiS)BSPi@TaReXO4- zwvQ+_HjgE0Bbdv_Vo_e=3o>_L2OF`2#rl{NB@}aQ!-SlRk{h5qy)hS5=q_ean^^Sg z%(;VQNTpTG^*W2K+QD2eP;y|$4i>E?Kqz)QY+Rj*T=etIWv)WSih0#v;p6G(`KMv zEHa-tv)RxctPd*mJc}w}(WP2{7HO_JMV1uLLPc^|)E$iZSV}gFx`Cz7W6m2`?7SCQ z^Z`ayHtl2sDKW2{A&xO_W7DauOg5hqt&pW7MW~FS zWIKze1xR&?$PYLcCfuSu8#dS&CU4AnQc> z$YJ>7Vis#zHgjpOGRLKid#9N3=r;|CW6sN&!_S6gvq1zU!PSi{Et5G)w3k^5L{XBX zj-n?PF}{;I%qFBjok$<%UfIb-JD+QfZ3_U-tXsSoBd_JuZgA5(YavY1*LAY$gRR3A%tjgJQN zv|1MP4omZ~^v785J&Yluc7n5uIPLTH?PGBtvnU^np0|%_0cNj)rv1=~z}EHw+_CRP z#`f!Zrar{%!@w~G93>K~;ct2vELyz5V@5M++M~jE+nKh8wC}?>!?d+VHfjx)1?H$s z==&IzHCdm>r}=r7W<|%RaEFOn7X6R@{phrwY#OoIcY-IL{wE$YW+}U=ANsXFR3Yaa zO8(p~nz5L{HJ1v66I~wTQ69?_a9>J_*(@Zc87#_wZhXw0tRJW|*d@eX$Sx96#X>5^ z|3g&r2Fyl$#Z#CLC(#+qweNgD)IPz3VUJfd*Ic6Q#z>InHpgYMIMlbKiLojwT6dxF z&2pxhaub>TZ)gj&_$KXX*4s3|#d`Tz?^^myt7Qqr%$)~d6N~k;-dCTW)@$URJ)CD0 z>s8Epm(XWgsgQ4Cz4BSIpU6@DSn@IEEM}ucwZPJ^mh~=XiO;iMwY4mI(>^w8ADe{U zFmZ?8bWz%4EV+~=PGoU;%sCOm>{Hb<_~?n2;Db~nvzym$N2ULwxXpbjWUzX*s8;P1 z5;OnA(i3^>c6``&J~ZHTaHE)=sHGr~SowupW7 zj~-lh-j4*=K6>8G0|_L;nmGhvnZ7P33KW3v$!{TY7Nz2U}*eHA!Vi6i*Jei(sx;T*yr=~|V z&@gU(8y^_i6OmZ0m^mpeVaZpAb5R_8pKHWO3e;#nOBu;Bh0;ba;t#u>iyKV65Yl^? z){pAR&{LyPwgZ`e=yw`Ol3Gy-WiVsYmzCV{RYoTZ>P0f$P}t*#r;w z;}e~{iuJ1dB`mJ*Z+LkQ%EFRERSdK8P9wJ zqnQwePC#Or!A4SYE)z8KwXImB#=CV(XhkCCVv0VR6>1sVL?whwPZ%(JOiwg$KE`57 znQIGHyKb6#N0zcU%B|JCmw*im_g=qNme9(E=P}nFxCGv#Srj#pt5fRpSkcm;6!cz{ zmpRFM=yP$8i-ixZNMcLTYab>5F$}|Y^GuYen#Z_l9>_HHjjv^Ku)nN_{aAW%`%w=Z zdW22@*j8yzlwc>o($U=5C1J)(z-*82FYaTP6f+lgUpv`|eQbO&i=Bvl8BFkfArr7_ zkIuyce>rwgji_4E4J4UhUUq|+7WgDM&~0|n92n2~Yj@BPkx;@0+(B!O1gt#nWC?rN z0KPy0UacC%QeI_IuVRy9{#GTioRGR;D8eqD)_d6PJ)|!O6F=sbV__Km33I-{(Rmo+ z7<&P2`^0&5RAJkO^`K-CifuY_#}sTVN?5-=ETfP`_{HfF_C52$504nT8tcNz+Dilg%dG(RH2^*;?zz*BBYbUu+s)q zO`ZUTocrPMaCO+ZAH?|2EU%15kL2BvE9IMP>2+Qb4hR%0GuQ6b$T)T86Z<3*Qqs~mzDuq(nLPC zVwKMKROo(lwcGjD#ANp2Y=qR(($GXlCv?_fGOyY$x9sM4>|U^0u$LU;fsH-Pq~nYQ za9WUq$#ojG8cmoU=AuXZ1voH03U1o^*qd-ffPGRG4p>pZT>S5;E;(7V?gvIBJxpB zZh|MWN#KEJXxxUMX&r8Y#7te{Vv^u{VR=e0k#AxkF;z&=HaJWomn57sS@as7nalXj zjSYp(U*N=P2O9?~Fc@(gZ(z<^)ENtwZ0zfBY(f)w@0mmJ$}ERMOLvW>|tR6;)S1c6|&TsEUu6_b69VI&M0L`81E#2n8IG9g!a8jSgic7 z=B_nHj^j8twOX2_DTI_5MN}MlW$OoRg-4O0D9W%b?mfBk-QMXQBIzV(&+X3ct+|iW z%q+=M0_UQ{iGRd^gT!$Z2)1M=iUGs00!Vo|fdxZC{KtZvKat@-On^uZV89d{7?iTKsfpQjaqlk`Z*_Bk zTbji~zl&K=zxcE7FCLyK-f|%T?0XOexrc~uDNKKcHY<)$HqX1PW6QMg;3s**2kX=e zuNL>CH>LMb4)`?h+C|4g7Yu!TvSSbRtr{n49b8!b|6{-Pt!CY`t8gj)k9KPRH>@X| zzag6p>du)|)GexT*RJAj>{#__yKn!6;%@F2_dQNa@ZD%v`&-333bc8f6(@L64!yY* zO#-`-yFPfbxci6H+V*^^NUaicKAPts!ZZn172b8oia(#j_C3AlPOL?a{AO|Lq2f*0 z$pjCuidd}g;`7= zQ;fTcXCEr=eWZoMDeG$aY#Axc&)haS6m6c zQatW5$ZJGUZTtZJ!^z@4GAErZmJscE;AHXV5P#`p@m7i^IePAf0vf_pKf%55*(z*> z^Q~@N?RVDW1O~KTqhT{+D~mRXqq^P90IY3b@WwmX*(`mVnYJE_fi&0dtw(KlE%{Ur zcR3iFZs5{+LSe(iN|wwd;RrxY}y#B zOZ^{sfDGqMm!dRvKNz(WB^MzoGXHgrCq{SaJ5nP#kqm4jiDQ(VWo9kzU}yTvNh^z; zU~_XN&m>^41zQpe?r?`8vm4h-RAiPViBGS4XEtecDRv_B@<8H_>v_%>FB;oMk0lZ~ zVQdHGq^#rGdQ)CUQnN|aiOsQ%UMD_Qk1n<9$EJI=eg~?N9$Q*iJ9lg;>3t-=n3<^s zFtXFgM$+3dbJexd)bab=B^{-soea0mKhTU(gjNkdqolU+0IbbNPn|3sZI+HUqI9cU z+emudUOzqB?_O?o>qoN))tlmFnnksXM>msR7T2;~LK7ycbA3^3N9l&XZuPo&QEPa= zA@NR>UbL5^)RI){PGwL=QlGVIW%YtxSzTN%&&}9XuL@WXQ1>Ju(RrHXnFec+H@Ab> zxXx2^3FT{SIaOx9YnAG%ffYNpbe@xI5sxs^Vp4~eI0!#O=X(jPWKy$eREet3bey5$ zjt~Dlkyj%qPn{Ia;5L9vUvAZ7TaU6xDy9Onxv`g6rnv&=Sp<2b->sRQ4g%~gU^m;* zR-9D2oBeE|cPXao9~jxWQ#f_f?-sbJQoCU-Btf!%q7Z#3ym7tBVuOHacXl(X-;0PV zhwIANez%{-^%JCvr1r4r+l+b$l1?+~FhAF#q~StE`sjYBkH{Mq8QfK9lvb5=S-T!b zE#h%?VrUiOX#jJhWO-dORumX2ofb`3R+i?=q)iv*XYART^Ek3?)SI>H2dj(cswTd& z35|~H7e-=1b#VUMNP5yL2(8|ZmwIU{gVHMtyg_A-BEp+7*&%M|(AG9b(xDjOh}v-V zZ_o~Fahfg-RAM9@AWQ(m1}wyS5$tUSFg8lq{XHcKKj?`~_Ido)UynXLAfFg_1BQ7>}BH3Dw> zv-6APRa;rHRq$gpmmMZfk?(V@Yy&MqIV{I%zn!J7*?RbsSUol)On5Wk9Jdlni zS?<;yEmQ<;p-pNyNHqO5F2HH>b9LOaw+G>0u3bBThq z$g60_faYtGF|QGMC9ia|a*{+_rrx^LN-W`FU-I%oJ7VD~#8QR?x$@(DvbCmvAP{`W8kM zP8nhb+}6Dop0~*98Bu1(Yp8>e)+6G_YzXS(*QS#%@+9*Huf?NdLVww%#Z!)TF4BT) z!4{V-_fk2^d}eqiosXZ~W?9fV4mAtOMHQ+m3|JMyCWo{vO7C`croAump7 zG2>pjns8E2MZFs6qNw-aVruuCi;pJcvU)N#Q90F@NvMI(cUWtOTQJ(DU%%XAL&SlO zNX}SJzV>^q$8|NX0fpU-bTyP`moKi8`B(=?*PrOrB`*d>E?VwjnbpiT432Rn>0}5BCm9@YV`fpoSP>mR+#VEdaKC;46~Y@FVC$||4)6$ zj-r_k8kFc5mP&oB*4D8W9U1|o({Y`GEQZSU`a;^QG`P7oS~?&=UOZM{9U`jeQgq_w zDidK+Zh&2ln^YFg9LsN9Z_jcaS%mxz>eCy*7m$Uh>35Da@gWY=aU;U8%x$3G#f&-c zVv!+DpXQpXr&EgyOXcOt%3>9A%r=r3l4^?}h{W}#QaNsAK1= zLS&E{hN&5+qhe4SdKxsLY+D2TvIEOxk`th2j@ry912S&DKHhp|Bowhda zUTR^XX|RdWHd&1}39!ZiDLv^{zG3d?U39^uv|E3|^f$5eiYGy+49&&$4YUcy2A9F6 zMZVyp_E58&3>Ab{J!FQU5^#dGHYThq7)8(`Yc=pdce+B!nQnZUNP7;A$~o0*W9@@w z0T~f+$OGks8<=NiIVMI9w~jcW8NEP>Xo-~8am+TCB3hccg%i{TgAZnz zm9)AxKQF7Pxqg;f42aanrL)L!fV`B%(8~ZBIzSsHyp6yNCi{&BGzs5C${ea2Uy*$V zm+TZu71!q>>9_1fo^RA1)6GsVVahRzxu0#pS=~>Jvfy?cyri6f zS7?Cq@`aiiQI*yBvXA77G!rH5tswboUP+c~aW2l#xuQv?m~IESXo`ysuil+F7g{O2 z=%KYZ$fhMr$PU~|*lh8_PfVEfdZ9tkfPy5K7e1^D>Wp+jLP zz;yT2Nce7}_bK}{1>D7|_bv~^_ZYp8co@Fdynob-(s%Oxm-ag zm_ugcd;rAH0&b($d$Iku1$+yy_hApif5wcukGX)`t@ZxuVSIf0v+YCNbHUthwnxI{ zM8SZhU~tIYh)^&%b8bW^82##g_+`Poa~L4M3Z}FJPG*uD%^PoqFQ5s~{sZO!s=yDZ zafY7>;CBjqJAl)-{ktHCk8k4vfzqQei~qYu$iD+PrTap_XN&Q7*5e-nJ}UozEqwHY zn)l*2g_rQ3_=lHe{=LA%>ouMEQIR zaMFMMsO5{2?so)VPjS`q{!rk0=&Qo_U_7Jp>KU;Lr*V|{hbPuf2s}Lb_N>6e!*#8| zKUQ)Xd_wa1xWMnY(*d3l_!k8JqQI$Npg^Y{Qhvg-xnBmH`lU~9Gn!HPUj=+r`+a>3 z{CmRZDdi(EUDmeC95x3O?vgQdR2jkbbQVn)>O3;t_cHz=bJw~s@S;)qJPmw&g1lo~ zt1zFPI!E16=`q5algxyNqjj{{--xQ7D*qwy@E#312Z-{y6y)=6z$u^MiL_II zm;40f`P=9KOWyr`tfa4pRs{*5v4PYa*$VvT3V;J+yNTV==l4r*a49Nom>_XYl}oUIiL{Er15-XZa~3>PFX zqRZ$gUHu$c=MQw19>K$NzrH8%@WAtF6cDZ5yvipI3=;UU;D^VA(>0jH|LQ@9tH-te z6eesW|8432OTy|-zzIJ*QI(EJCwO>;P?h=IZk`o6BO4qn!w;K{ZTDN@3E-6fus{5$ z@c$`8%#r>=gE;X>?1eN5Y>+Wg5yVY$rB0(5LlXEy>ah+sQB}!JP=E>JO1 z8}+ZS$*vv4KWF0fJ*SS3MuLZ7w`C(TNyA`}!DXO99&@(d?{v06;{C#=Wh)y(#qM}^ zecvj#Tg%Q{?ok|-+z<7(%e|w^W$-jOCfmO?3qK zEO+!%jlg*Joj=AqmQ0EzR0|Wdo> z!3Gwzfq{ME7w)_FKF=6RzfXC_RQi3dlLKW?lJ}fAJSb(>do#vVdR=R$OX<2Ox!E%? z_Om#LjpJ14VK)xcCH0+k-C3@z}+>H-YD+IOxlOi|CdN-ny2PT@|RkSn({8X|Y;aMrv82lgoTlOD!n zvuC5$&Dz6o8+#6|YGY)36X)6$a;K`ScqZ(yc)62WkT)?adVJX{%*n(Rc!x}(0qm&^ zfB1`*976`Vhj;E4hMdj-l2?^u;~1+~$tF2RG)5o?rv4GGn9j`X>APnb+v$G1qtt9+ z^PsscZiGd9Aj`b%vf?=LxE@24np+4wdt2QRh4QqGyyh%42p;ky5Iu>@fPrxvF3u!& zG(gS|1nKmi4c{XhhhuXck1A`MogUmsh%0&l=8JYh{UGYNp7tz#mjK0Q4`=f8w`>u2 z@^yo!`{02|2cD+B3Eyk()XD77sfs$f^}AG*VR1Nb-Qiju7~2OGGw`bPgq#-$or!!y z!Ojr_rvYX#q?o=_(GH(=PhZq{Z0&jqZ+os6cB=OBI&2ZlW+8Lb59oMg!9ezJv(cv*L(yxK*h5ZIpksx>SEtc^d zzqrrx(-~4u_jbsC#j7CK-wk|qhs(u@=dJ|SqTiOWjajftYewAUW4wu;hk)?|0QuF7 zn|}^{7(wM8a=aTBqIi;6Te}j`NC-dP$Kql2_XvDP1TKh_!jsUzJK5_%+_>kQw|LN^ z36Ea|EY}tB-ehjvgj{9x({>yOUDUAP$zQ@uq+1<)ae+8XT)d%A=-}gI(@b>nQOg95 zTAV;%z6nq8Ef2(BV;pVO1yr7_;G3AHVe}1r^I|6ITU{jKVmPeu8+?PpoHsK*P!9C9e9w(Y`Y2k-7u9=C9oH!folo91pjuaTNND zq@qp>%p5uT12X|9NcwgJuz0=S1ZITJ4RH6f)ot|jIa*(b-;4fYZ!N)s1a(>WKaI&U zPg`#{2qX0i(fA!f0a?ul_O`hxylZH2x^)f9%n#Uya81NaA7s zHBXJ<){ndm1o8QU2IUazWzI z^CYbQCjC*l857H-8$?W3$Nxi4}hw{j&kR`VndTiV{k!{51Znfc~natMSbH zhZ!iHLcbc&t6!4F>L;Q2q5NJF`n>*^1XJQ`YB&&ZNn(w@fd{HTrB^>EjWc~A1Y!E$ z4(Qb%O5+!>@9PKEABFuh9>~W>ntkp!b-v>;LVW$L@f$#++dhmtDe`!v+{%bvc5wwJ&^y;s5z6T(}7hIJ8)qHEb8^k`n*%s7I7hlOK-GkC8 znEZSQrs;2QyEpJ{<#7JjU95jg`XKQ^N&lVzuJm^YaLOwMjc*rv2Oa$Vyrh3^0OBX5 zQ}BDn(Er|}4�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 Date: Wed, 7 Feb 2024 09:27:34 +0100 Subject: [PATCH 238/245] refactoring: changed magic number 48 to define --- src/main/c/Minesweeper/minesweeper_start.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/c/Minesweeper/minesweeper_start.c b/src/main/c/Minesweeper/minesweeper_start.c index fedb818..924e5e7 100644 --- a/src/main/c/Minesweeper/minesweeper_start.c +++ b/src/main/c/Minesweeper/minesweeper_start.c @@ -14,6 +14,7 @@ #define EASY 7 #define NORMAL 5 #define HARD 3 +#define OFFSET_NUM_CHARS 48 #pragma endregion #pragma region Funktion_heads @@ -94,7 +95,7 @@ void game_minesweeper(){ int bombs = open_tile(&board, x); if(bombs == -1){printf("You Lose!"); getchar(); break;} else if(bombs == 0){open_empty_space(&board, x, 0);} - else{board.tiles[x] = bombs + 48;} + else{board.tiles[x] = bombs + OFFSET_NUM_CHARS;} } if(t == 1){board.tiles[x] = board.tiles[x] == FLAG ? BLOCK : board.tiles[x] == BLOCK ? FLAG : board.tiles[x];} } @@ -242,7 +243,7 @@ void open_empty_space(Minesweeper_Board *board, int tile, int index){ int check_tile = is_Valid_tile(board, tile, i); if(check_tile == -1){continue;} int sum = open_tile(board, check_tile); - if(sum != 0){board->tiles[check_tile] = sum + 48;} + if(sum != 0){board->tiles[check_tile] = sum + OFFSET_NUM_CHARS;} else if(!array_contains_value(board->marked, check_tile, board->height * board->width)){open_empty_space(board, check_tile, index + 1);} } } From 8a3292f2d9bcacc1007ab459b4ad045d560ed023 Mon Sep 17 00:00:00 2001 From: David Moeller Date: Wed, 7 Feb 2024 09:39:02 +0100 Subject: [PATCH 239/245] refactoring: replacing more magic numbers --- src/main/c/Minesweeper/minesweeper_start.c | 35 +++++++++++++--------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/src/main/c/Minesweeper/minesweeper_start.c b/src/main/c/Minesweeper/minesweeper_start.c index 924e5e7..a0f0d58 100644 --- a/src/main/c/Minesweeper/minesweeper_start.c +++ b/src/main/c/Minesweeper/minesweeper_start.c @@ -15,6 +15,10 @@ #define NORMAL 5 #define HARD 3 #define OFFSET_NUM_CHARS 48 +#define OPEN_TILE 0 +#define FLAG_TILE 1 +#define QUIT_GAME 2 +#define ERROR -1 #pragma endregion #pragma region Funktion_heads @@ -91,15 +95,18 @@ void game_minesweeper(){ getchar(); if(x < board.width && x > -1 && y < board.height && y > -1){ x = x + y * board.width; - if(t == 0){ + if(t == OPEN_TILE){ int bombs = open_tile(&board, x); - if(bombs == -1){printf("You Lose!"); getchar(); break;} - else if(bombs == 0){open_empty_space(&board, x, 0);} + if(bombs == ERROR){printf("You Lose!"); getchar(); break;} + else if(bombs == 0){ + open_empty_space(&board, x, 0); + for(int i = 0; i < board.width * board.height; i++){board.marked[i] = ERROR;} + } else{board.tiles[x] = bombs + OFFSET_NUM_CHARS;} } - if(t == 1){board.tiles[x] = board.tiles[x] == FLAG ? BLOCK : board.tiles[x] == BLOCK ? FLAG : board.tiles[x];} + if(t == FLAG_TILE){board.tiles[x] = board.tiles[x] == FLAG ? BLOCK : board.tiles[x] == BLOCK ? FLAG : board.tiles[x];} } - if (t == 2){break;} + if (t == QUIT_GAME){break;} int test = 1; for (int i = 0; i < board.height * board.width; i++){if(board.tiles[i] == BLOCK){test = 0; break;}} @@ -168,10 +175,10 @@ Minesweeper_Board initialize_minesweeper(){ board.tiles = (int*) malloc(width * height * sizeof(int)); for(int i = 0; i < width * height; i++){board.tiles[i] = BLOCK;} board.marked = (int*) malloc(width * height * sizeof(int)); - for(int i = 0; i < width * height; i++){board.marked[i] = -1;} + for(int i = 0; i < width * height; i++){board.marked[i] = ERROR;} board.num_bombs = num_bombs; board.bombs = (int*) malloc(board.num_bombs * sizeof(int)); - for(int i = 0; i < num_bombs; i++){board.bombs[i] = -1;} + for(int i = 0; i < num_bombs; i++){board.bombs[i] = ERROR;} return board; } @@ -222,7 +229,7 @@ void draw_minesweeper(Minesweeper_Board *board){ } int open_tile(Minesweeper_Board *board, int tile){ - if(array_contains_value(board->bombs, tile, board->num_bombs)){return -1;} + if(array_contains_value(board->bombs, tile, board->num_bombs)){return ERROR;} return number_of_bombs(board, tile); } @@ -230,7 +237,7 @@ int number_of_bombs(Minesweeper_Board *board, int tile){ int sum = 0; for(int i = 0; i < 8; i++){ int check_tile = is_Valid_tile(board, tile, i); - if(check_tile == -1){continue;} + if(check_tile == ERROR){continue;} if(array_contains_value(board->bombs, check_tile, board->num_bombs)){sum++;} } return sum; @@ -241,7 +248,7 @@ void open_empty_space(Minesweeper_Board *board, int tile, int index){ board->marked[index] = tile; for(int i = 0; i < 8; i++){ int check_tile = is_Valid_tile(board, tile, i); - if(check_tile == -1){continue;} + if(check_tile == ERROR){continue;} int sum = open_tile(board, check_tile); if(sum != 0){board->tiles[check_tile] = sum + OFFSET_NUM_CHARS;} else if(!array_contains_value(board->marked, check_tile, board->height * board->width)){open_empty_space(board, check_tile, index + 1);} @@ -252,13 +259,13 @@ void open_empty_space(Minesweeper_Board *board, int tile, int index){ int is_Valid_tile(Minesweeper_Board *board, int tile, int direction){ int check_tile = tile; - if(direction < 3){if(tile % board->width == 0){return -1;} + if(direction < 3){if(tile % board->width == 0){return ERROR;} else{check_tile -= 1;}} - if(direction > 4){if(tile % board->width + 1 == board->width){return -1;} + if(direction > 4){if(tile % board->width + 1 == board->width){return ERROR;} else{check_tile += 1;}} - if(direction % 3 == 0){if(tile / board->width == 0){return -1;} + if(direction % 3 == 0){if(tile / board->width == 0){return ERROR;} else{check_tile -= board->width;}} - if(direction % 3 == 1){if(tile / board->width + 1 == height){return -1;} + if(direction % 3 == 1){if(tile / board->width + 1 == height){return ERROR;} else{check_tile += board->width;}} return check_tile; From c1cebfaeaf6d70c68f4f6a5b00cc7286d08bed17 Mon Sep 17 00:00:00 2001 From: David Moeller Date: Wed, 7 Feb 2024 10:15:54 +0100 Subject: [PATCH 240/245] last commit --- build/test/out/c/minesweeper_start.o | Bin 23696 -> 23936 bytes build/test/out/test_bomb_in_array.out | Bin 76336 -> 76496 bytes build/test/out/test_is_Valid_tile.out | Bin 77952 -> 78112 bytes build/test/out/test_number_of_bombs.out | Bin 77552 -> 77712 bytes build/test/results/test_bomb_in_array.pass | 2 +- build/test/results/test_checkCollision.pass | 2 +- build/test/results/test_checkGameEnd.pass | 2 +- build/test/results/test_clearScreen.pass | 2 +- build/test/results/test_collision.pass | 2 +- build/test/results/test_is_Valid_tile.pass | 2 +- build/test/results/test_moving_snake.pass | 2 +- build/test/results/test_number_of_bombs.pass | 2 +- build/test/results/test_part_of_snake.pass | 2 +- .../results/test_playerInputMovement.pass | 2 +- build/test/results/test_pong.pass | 2 +- build/test/results/test_template.pass | 2 +- build/test/results/test_tictactoe.pass | 2 +- 17 files changed, 13 insertions(+), 13 deletions(-) diff --git a/build/test/out/c/minesweeper_start.o b/build/test/out/c/minesweeper_start.o index 90e6d3f08937520f8ecb4c6072521866ef6fb22a..10c6f273f0d0dc3608171f36e03cd4c32fa4f589 100644 GIT binary patch delta 6514 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 KkHC1t^#22Tww@FK delta 6164 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 Iy}?oc2Qe25Jpcdz diff --git a/build/test/out/test_bomb_in_array.out b/build/test/out/test_bomb_in_array.out index a8ba57a86c3d2593620868fc6f6bdfe20ffccc3a..a2618c0d3682dd75c39b5d8ac4fba7d4b3cdb25f 100755 GIT binary patch delta 5450 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 Fe*rND)#d;I delta 5249 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 F{tFAZm23b2 diff --git a/build/test/out/test_is_Valid_tile.out b/build/test/out/test_is_Valid_tile.out index 736e2248cbb9fc6879e98af83d11035bb0217791..4105934d90609f9e01c32f9164495e5d40ede914 100755 GIT binary patch delta 5578 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 Y7JKk%Hq3%Sw`BsZx*^rQXac1E50r}GzyJUM delta 5394 zcmZ`-dt6ji9zVZ3bB7s0o^yv8e1H!S6T~bvbP>?Tt_X+<3g-GKD=noIG23#dBFkx{ z7*926RJxkFJ#=l_7*|w46l`lnKdrq}3Uyr6(yT~bXMgA1GXu4s?jQH}JHPMu_c*`v zxC5KM(Ldghkz}?_;_@ zMVcl}CPc07eN^=ZV$3?}^GvEJNl;BkD~q9!Zc+vS&?eNIXoE$exfU}lr86yyVK|P5 zN}pxZPRk-`;~3g#G1JBIX0X#g$3G+mMstJSYKAwd%~}BqXti|!nCUL-ebOhRsMVGP z&w4X$Pi4UUbibNcRtIXey-jtt_*mKg6Edrc8~iC@gq-^Vm?0~<4}!+lKp+U-KoIQ( zXxBWiwJ@-tL9H&SN0N^&nB3pt%WR8!+KeGwcHf$YsI?}pe(Wl#XTUYg=(5){;CrsN zArQ5z$yMTmHmBX^vNx=0s9b_WmeqLztMm^FC&X$0uxj;(fyzEuz?p<#0SmAI|2lk~ z>w{U4Kq||ut^)4+4>mdHzgU267@*Upy6m5_xOX2{8^4iMz|0?3HH~maW6r8Bs9gB} z1X9(tYQ?R>PM^<<2Or&@mlTabj;M|87~}(|gzof{ycwfT+Ja>j9mcXA#aCzV$5+>p zs5O0Vpbj-P7^!QadW$|e6>D1|`@;^?c~eIAzh=cwe|?BGGwVmDzl*v{sl6S0C2yp= zru26>P|s|7c%(~N%B>IJ8`}mAjeec8$tBO@_)3#nEhk_dozbXRnG%MI1r^nK7^9m* zHQvipB=KPVwP0B5TB{n2>$AV~JBXA?i}DObDHDOXT&9^<>@=Sxoc zG!D=8ewl4n%BQ3aa) zh$T3e^Jw>P$CpdK88I=JlnFGcu&=|27MCpH+bI*KD?jBj%N2a{34Di2j|rT@;W>)) z#ni>2)RLBZFM?eHvIM2AYnQZs_dr#&wQ&3@0e4Vz7dZl@}K?8r6c6h zfiCZ&%jURX&{kx$*!{ey$OGvp{gt$Bdc0v7Qv8ePh3OeFZ^Z=JbCK;TI8S#COkH21 zPliyK0Xz)5fJtWtD^PXi7?J5xTIio=*x()d@{C(!)`tq)xvys+dszrrhCr45yjF3M z-eo_Z*%bB6(Hp!sqeHYjq_xlT38$(A%`f+KDw-USo*N&VDVqqv(R0kW^{@E z)r6*3PmdIj3qKeY^jJxwN)n_#^)xV8@#d5ql<)(oFTKlnaSU#Lm;4^zZMGTHfKZgH;jdWl+{z68xP@`wHxkEPKc@Q%N;Nx!~V&b#xQ zO^!#u4Fpd0La(!d0KxC)tNuV>FvOy!mnv^24|K{rN<2s4ttXc~;Yp>)IYM98FjmJfnu z^sD8G(obK}8_WAc3hh^s2=z3pB2hZmPUlwihitkUO*he3D+WP2ZA5)1ZO8X23M&$! zkq%gq=Qa2ufy}XEc|DJeBH=c(0dBl~Tcz!pY z--}En?MT2oxjR8YH(?0|_~dtR{F0M(h_{`lQspFl7t%Zn^bqHrU)dE#XRXcz)$3mU zfes?*F-Lqt8qy_l3O6pB9U&KHaY0T=bhl*jZh4|14f@iBJCh*7yJly)u3R6z6+gJ9 z2MqX>^7HNB13fvFcql8C{` zjM6ej2$xiJjb;g8AWeE#aSV#gVOezM8Wi|Mvp_IdW!*26P7kqiM% zLhUR)A+aZz-?bE`OYYKGc4@)2n|W$?aqKvbj?;!kacA-Jf$LbUgRz%jjc;OI=Dy77 zqG4}|7CAhWp(~W(;!VHGaB);HgNnB@T+9|36oaU;UJFGmiwRunt)UB*Sb_cp^Ycfm z=&~RzvQ$(qC2&OymmnoRg4Nc+J75>}trX5syH*Z%pdy4L>eC{g<_jdb7b^3# z7!D%#1TXMRFu$@$q+mOaJz9Nddls~p6?Bpp)K#pp3N%5W_DHCplLNJa7HLazGF|k5 znBT`ma6q$R!Zgk8eOviFNIC&3~{6QzIxJ2}&uk`UE9Q?3d$$ za#T>}C>b*}Z@UO$xu3xC80>@tx8Hm`G6vDXV3r?6h)+a_g~U2eP=fQZVw2dEKNFNi zM0r6_g41E}7Xrpj6muLq4*Lw-(erWM&XoSO|?R}Zm z^%|@EK}Rpvb;*6VGF8x?5VW|bnfo#^*M%5w9P=nJbgEiB{>4NUYTw6imKLv&hts*Y zJ1naROyzCVxpz1$kKibREt}5$w!^XlM^Sv_z?Nt&D&j4Y+&TDf0Ss5I$H@1I>AdH# zHsk+1*u(B3_PoGyvU?upDq7rn?8#es8aiGRyswL5HQdL}TEbf9l4g*^Bpl}i6KZAr zuxYbM4>cu4(6$Pe)|8Cyru405T^eF&ze8gT2!$itu*-UK2HR_da{P4>u^4aYEL6Hb zgM{EQBcwc$M!R3}mhU+xLmkaIV1vzc_JMw|j;=b;FROgE7L$MRQH5G-su{&QmVDf4 z^8^~Dkr1_YG4!>teu$>h;|Fe*+RLciP>4T4iW{cFb98INW736L-hqw7!sv+)%n7kF z(M6689~Yh(J~>XpzntT46$bifYjQ$3#6T?0!h%*~Pg*?vvbA5TRm0gI1-9XkZR-xj z+;XfhO|UU6fo31E8T*7oNj(10@yF%j9GY=wqyu2jt1=t#b0ca_k5>>JRd8jdLp#d9unxhddR9R4SJ+ktZ)^ zqC<(?Q(&UMY1S>fk8=wQiaWQAWtAThJR40S=TRFC+s&lV?XEFj4-V8 z*evio4DqA*d}e`pxNqvl#=}d1ldd~%h2e22dk++l|2Ffb2>mstuZ4@-RDBS4)TSOgRhFw0y?Ol?!ZM-O)NgJrWf zis^i6Y@@O)WnH(-p%q;fuoNsdv3Kp7k6axRQY#HDo&BA2&)ls0$NBxv@Av(Ee~)_( zbGdjtsQE-tbBb6p(mm>H{W}E$d*1OzL4_F8a$Dr$^1BxK)|HIO&$V5DaaG@)SK6ALbeMiVwF*Ra%HkodkFKTkg ztER;;ljzLzAeSsM*T4qyfq6bWN>VH}&_S9l#~{!9N9%@6c#WK!Sy1H#N`*x2v?yPM zmgZyz-@Ut;Q!_<~Ibe`z(`vcDLI%au&Pj=#bWm&jo|u_&g?5B=(cxK!}&Oe zY(FWNcRCh*(?>`^DuE8rrKK{*h)SHvNrRw{h!ed>sqdQ0BA%^QZuGvdVm` z%Dm$cYh*YYd@B@v7}cwpZvRoKojWBrZOu@D755;p^EdnZV6O9_C4C=xPfWRu2bzY+I@H7B1?Vf z;{_ffhFJ;DZD^3CS8;VouTb6e9J3HyS+P%3*RRDoaobPurC?^FW_a~omU$jJ(Z1Ro zsOT!%eQnG+wMj+SDd;hX&O^9Eg?~WdPblz>D%`HXwFoblZKb zs)&wsl)f0!HQS=yi4b2f`FeI{*tbyu^z{QIcFyf1a@Fw812p_13(us5IpkcOJZnHU zEhZ1miG@Pqnv)fFOf6^@Bd~8$4F)7=v=1m1mITT6f$W2k8;{;#vsk6V`uEd3Ki*vC z^CYL#5;{YLw2_6SY3WN1fm$0dq|rX4_CCbNbyV%<9u(@f(OoG*aOMZg}?TbV3g9ZxP-)w{MX*w0D2OX}yd(``d<}}h(6*D^;o%q8oG~eXwmadOet&5xK zoy@B!Y?>N37H|99eAj1r<@v75d1ZO7U&0xLtEljut< z7ySNal&@U$`*)&rUGn?;P=1f{BFgOV{eDB3Agn++2Bi~aNtiHPcnOsiXxN3a8D$U3 zohVPD>_b`N9eiMSaKc&<`?p6Jo)D*pYc&svVZk~f9!>Az*G@0#TA2j3g_~mnX37ky5+%`VtlS#)F{F-&%L4*j z4OhI?W@jCDzsB9xCYt&h2Q0DFt$I*^U-))8f?{`3zyO=V)-ok(H4lcCCMi(gK+13G z8yL&$Qy2$%$IfbVCnw=2g%$W+Aiwzt_u}UndzAVv++5H?+VDA6P!&hdQVaS}E$G~E zrJyCsz|N)9f}EneT8NoXTk6$rDN(}yiLZb@&@vT|hcfP7Hg1i(-D#;4;NQG_hixy9 znW=;bX?OzYh(F{N77DhM*^1A>A;lbW3?WW>PD%vZdX5PUp_XGl<}_u3t)D|~<2284 z$fq1qDcEA?D88xuynN0fpL583b2CTSIf>JYEs37`^v+ zlS~`gcC=DxnQ2!9B^a-4OU(E4;0e4fn(y$h`7|J=;30`Aq$g#M_RV4i_6ELxra?~! zjeDol_B@5r{F6B4B1F-`cQRUy`*o*ayTrKyn2j8>i(^`yf;pd;mdSZ2$2;7=0}~{? zOlP-R`&5AfIIJG;pLFQ9(vKQg6GEphx)+&ua@cwfvks@>5A$BDk?#~W%+ba;6h8Jt zg(|fCM<1XoWpo<%7N=#c0A*~9v?I&IxC^7NP2+BLTI!v+ja0TfoXUvG*@#4UZX%_( zZU{o=hj=?}PTM7(bu;zivxnxSfBj*RNg>+jG*8P{ocI;N9y*em1jW4*dp3vhCY^WQ zgjiuz5bgA>BxF#|+qI+l&F<$wXc>hc2g=ayP={8`QLl59GPJB;hn6&!4lPX^!hyFa zz)YN)uoYiwkT4Qg9pvDzepqC*AVi?@>#wJReq@;U!}Tv{yvO%`EXG^sDMm9-2`v`M zggFjr#d)N6e>@D5{{0DXlms70Nb0OoP?0J)mi{jQF9#>!DRq(Q2X2RHWYvLU_>vsL z^#U<vXnwS46@=(4K@%}4bh1PS4v)x|luc;BYYv4dFydLV zAWVla)nnyx+(3TriH&}KS}b6*HYJFvapXo%LPC57Ye5<{Wf zA_z%dcXzcFu6nPWZ~%-ZIj6Qc8>ML7ROvQB41&c{HWfOf6h&pFWUZ1+HBy2OMZHvn zHcf_9PDO!KMMaNfr(&^`jsgm#$y7{{vJ^2=5hg{%Es<_1kkWgk5sM|`7%6g!G@d#t zDy1n@7Dy#joRKO}h?UYkR1`=nsW>C8MG;gf{h12I7}SHhq*cN++IndO?)8<@XetV% zO!DaI2JMmz2{duu8>gK*d_8|YzswwUFTbcuxm@O%Ekg9OA-C+#5@7>C>+U@oh}6O6 z-A6(p3B=^No^Qh-1Gac#!(k?T=~);K&&2-zTcZu{ol%SuT0Qy*D2BD3stCw|D$ffM zus{^&?Yr?AArBRiw`M-jP<%`dh=2$RW|oOhv@4)Urgt=aO>?<2 zZfmNK>ROhMtEG+x70N>e0ZX(pt7|}l4T_3pH*T48*FI;@QJe2`ueI0u*S{WnpL3+5 z-KFn}OT{qmaD*lLNA;FeB>uM8eDEC3Z^rQz+ctE3ZaBB;mtCu_2HfZj=zGDoUa`(o zU1C7UP(Hvh&F1hq#p$vW5i;xBO!~9toU?{<&@LHFO?C_U-fs!_%~&!;n8&qFAiIUd z*o&yNbFqpn)Gonkq*Xf)Pa(tnm*8!r!v6wR+g{LZPQc5_&(l)#sxYMjqH0={{Sr@e ziU#{oSA=?gz|@db83fMuvkr&T`2d_?KMi&%@}lURQD-R6sR2+mdDReNtWIq6+Uf@s zW_|URI zO!{+W8_qe_1VI7M$_0#t0_+Q6=?Q`?06=Rd>C7|4*w1KlrZ4HdJ_Ldr0S2@FGUZ)( z(NO;rXTXs8Tv@|#lQ-ln>&I*I8G!sN#XsOt7%J-@yjpO2+fu^3!P{)8?*x(-69?ft zQ)dmF9q1fOWD``C1A8#h!TuPs3j$f{H={*i1;9T`#-0AoGgNXMGAg6byF%|fvr z2E!MU%c&v8*`OyjtbM{POckw@VTBptx_Z09)L`aEi~bU|p`5n>!wqjxc2LC?lyXoE zrbb{lgC-qRl9=MRsWio}umV}qYcQUYVP>IIw6-&A49s!CTFRX7WPZWP{G81EjLh71 zMr>p*80`BbJ(ud0qOQLuRkB;>tYipOVs9sxrY9#pkd65wcvJ+`0A(l2_8PF;*TQ1v z)!>6eS{-2KACQc+fulR7Kr_Ncy7FzX(mN!yf?~QLp8RijOneP&d)}b;PuMR4_mcBz z!9M>49mYG}EUXu;>!=kkAiZh9$y31sHH?yLC^$_U95qC;C;K}aIR$q6-(fNHD)6z| z{v?JO1C8yIX;t6BYU018y6}Z)X@ym+vyr+U)>#GH9s=h9nOo%y-<=XO?*u2^BPRF%7mKGU9RYB|qo13hTrR+9n&GClNDa_-}BNPR60>5@abAmk{7=;V-h0nwzli&c5n#(}h_i9vQb$PPi>5M+l+ z>=TJLE5T!soMBWgnVB`hy;QEUpOj|>1ih0)XWnAY>4O)K{2D_rhRvit>q&RDjNd{s zvz~BolL-wZX;yIZA$cEuk`{RH(E`6bLA$yq7kG~qxLywGC2!7(b$`#>Ifvt4d#4mF0-p1F*fnj!Ki|oD;~3sdT3o7?-jb4wuUIx zq&aEjNz+Hd3t@JO>C&W}6w|MhvL~7D=NQW4o*Dr5S!q#!8p?WA_Vc#+bKm24x(z@2 ze45(ma@FBj3a8X^&EeP%a;V+mI0&*8-*q^=JrEiTayZCoATvGCAhZaSRbW^L zvI1lU$ipBHgKPsCX1lqp%5`8e2aW1Iy|;2x1}GI{I1g793I@|@_#6MMIktn=!-(}39_gtl)K(Zwt^{{d;q2xa;9i7jwd~!e@xWH zq4*^d1#1IIDGud&y2Y=@%Z3&O_8=FG{(-SjAcsmuNhgVrb`BWe*TIn^oYwaKrr9w#nEZY)413su4#g>q zF5Y_-2&sSKVc|8&6svw4I#esgjf?sjx^Z=*D3w}CVJdOstxi|MMy*~1Av$#yJf>>Cz=J%KDZj$I0tEcL-!=j}9?Z;sPBUf3LwHJ}R_K`3=PMtu z{vld#=ZNtr5=#daL zQ1k&P)USb>Zz;R7C1!UyL%*EiR`g>TZjEwgxCKMNwU|hMKcTS*d*kko|jb!yn zjNPo`d|`XGm>(f_NyGxLIr9q^mSXB-_5J*4K?`WZ?P5XU3_U|Gs97$keUMbpQt3$A z9n#SQwsY8j)4Af86?w)bSX0>pK}N+8K#wCvXSlxgA8Fb6%6tPgXAJzCxaxh z`*M*%&NIk7Ava5k)-w|Aa)d7$eWX!556@7-EXm`{@++hGmQmy*T|R?2`_aLWXv^O* z$WkPnU=U|J)cpfI(VKEaS&|{aK454gu2jJ{M>^;u5$xV-ix9Rs zA56i@Vm3aK;h5Yo3Min|@B7lHH!xko%#)wm_krD4d@t!JNL&*Rb{q2zil7^D-a45ke=};m`bX8!)HJGFdPlQjmhnFuxo}fJZ1WE*nVYV+f zy{WKqpMS*#cjQS%EhER3{=5KeXOt~@B$k;jl6X- z1Meo+VXY$LYS&|}t*SQGm9#W_hhRvp;gP~~ocnn9ME4Y5P6vHG$qdA&DI(Av`(OyW~ zJ=0;pcqrM^xz{+I_f;kF;fQm=i}}%1s5HC}mASkwkB^WXL8>);cq$)vmXBD>Ylib) zPx0{*=1D42c>@()d zQsGrq%RF!>=5FU$Umbwsae?*I0eBkTZN;8=N5Egd-^buCYd9ZNYTfUNGjOu?f1Y?E z4!0(H;pe!PysEdn@aq@{Sx5Nb+Zb8HHTXGfwQkbj9k|5m Date: Wed, 7 Feb 2024 10:07:38 +0000 Subject: [PATCH 241/245] refactoring: aktualisieren_spezifier --- src/main/c/Pong/pong.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/c/Pong/pong.c b/src/main/c/Pong/pong.c index d962a4c..190f4c8 100644 --- a/src/main/c/Pong/pong.c +++ b/src/main/c/Pong/pong.c @@ -34,11 +34,11 @@ void drawField(int paddle1PositionY, int paddle2PositionY, Ball ball, int score1 } else if ((j == 0 || j == WIDTH) && (i < paddle1PositionY || i >= paddle1PositionY + PADDLE_LENGTH) && (i < paddle2PositionY || i >= paddle2PositionY + PADDLE_LENGTH)) { printf("|"); } else if (i >= paddle1PositionY && i < paddle1PositionY + PADDLE_LENGTH && j == WIDTH) { - printf("%c", PADDLE); + printf("%s", PADDLE); } else if (i >= paddle2PositionY && i < paddle2PositionY + PADDLE_LENGTH && j == 0) { - printf("%c", PADDLE); + printf("%s", PADDLE); } else if (i == ball.y && j == ball.x) { - printf("%c", BALL); + printf("%s", BALL); } else { printf(" "); } From 0cfb1c8704a7a721f30aa43b226388a11c6c2439 Mon Sep 17 00:00:00 2001 From: fdai7775 Date: Wed, 7 Feb 2024 10:14:31 +0000 Subject: [PATCH 242/245] =?UTF-8?q?fdai=20hinzugef=C3=BCgt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- team.md | 1 + 1 file changed, 1 insertion(+) diff --git a/team.md b/team.md index 9054457..1c481f3 100644 --- a/team.md +++ b/team.md @@ -1,5 +1,6 @@ - David Moeller, fdai8032 - Julia Selig, fdai8040 - Ariana Ginju, fdai7775 +- fdai7775, fdai7775 - Saba Fazlali, fdai7875 - Nina Gärtner, fdai7729 From 8863e7a088fc8585d11fe54d0515595e257e9b5d Mon Sep 17 00:00:00 2001 From: fdai8032 Date: Wed, 7 Feb 2024 10:50:20 +0000 Subject: [PATCH 243/245] Delete settings.json --- .vscode/settings.json | 9 --------- 1 file changed, 9 deletions(-) delete mode 100644 .vscode/settings.json diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index ef6068e..0000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "files.associations": { - "*.embeddedhtml": "html", - "unistd.h": "c", - "fcntl.h": "c", - "stdio.h": "c", - "types.h": "c" - } -} \ No newline at end of file From fb3ed5b4e8e5d4fc37bbfb55561d8d5fa76a0873 Mon Sep 17 00:00:00 2001 From: fdai8032 Date: Wed, 7 Feb 2024 10:50:26 +0000 Subject: [PATCH 244/245] Delete tasks.json --- .vscode/tasks.json | 28 ---------------------------- 1 file changed, 28 deletions(-) delete mode 100644 .vscode/tasks.json diff --git a/.vscode/tasks.json b/.vscode/tasks.json deleted file mode 100644 index 08d9005..0000000 --- a/.vscode/tasks.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "tasks": [ - { - "type": "cppbuild", - "label": "C/C++: gcc build active file", - "command": "/usr/bin/gcc", - "args": [ - "-fdiagnostics-color=always", - "-g", - "${file}", - "-o", - "${fileDirname}/${fileBasenameNoExtension}" - ], - "options": { - "cwd": "${fileDirname}" - }, - "problemMatcher": [ - "$gcc" - ], - "group": { - "kind": "build", - "isDefault": true - }, - "detail": "Task generated by Debugger." - } - ], - "version": "2.0.0" -} \ No newline at end of file From f2098550653e31da91b24139ec120d483263f822 Mon Sep 17 00:00:00 2001 From: fdai7875 Date: Wed, 7 Feb 2024 11:03:15 +0000 Subject: [PATCH 245/245] Hangman added to main --- src/main/c/main.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/c/main.c b/src/main/c/main.c index f0e5b90..94ded54 100644 --- a/src/main/c/main.c +++ b/src/main/c/main.c @@ -7,6 +7,7 @@ #include "Snake/snake_start.h" #include "Minesweeper/minesweeper_start.h" #include "Pong/pong.h" +#include "Hangman/playHangman.h" int main(){ bool running = true; @@ -17,7 +18,7 @@ int main(){ system("clear"); printf("Waehlen Sie eine Option:\n"); - printf("\t1.Spiel1 starten\n"); + printf("\t1.Hangman starten\n"); printf("\t2.Pong starten\n"); printf("\t3.Snake starten\n"); printf("\t4.tic_tac_toe starten\n"); @@ -29,7 +30,7 @@ int main(){ switch (option){ case 1: - //start_game1(); + playHangman(selectRandomWord()); break; case 2: pong();