From e8c5e959e0137680f7e0740288cb29b42f31e6b3 Mon Sep 17 00:00:00 2001 From: fdai7103 Date: Thu, 9 Feb 2023 22:49:52 +0100 Subject: [PATCH] =?UTF-8?q?Vorbereitung=20f=C3=BCr=20Unit-Tests?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build/artifacts/release/Paper-Bin.out | Bin 21464 -> 21520 bytes build/release/Paper-Bin.out | Bin 21464 -> 21520 bytes build/release/dependencies/Modules.d | 1 + build/release/dependencies/Paper-Bin.d | 2 +- build/release/out/c/Modules.o | Bin 0 -> 13760 bytes build/release/out/c/Paper-Bin.o | Bin 13760 -> 1360 bytes build/test/cache/defines_dependency.yml | 2 + build/test/cache/test_Modules.c | 53 +++ build/test/dependencies/test_Modules.d | 4 + build/test/dependencies/test_Modules_runner.d | 4 + build/test/out/c/test_Modules.o | Bin 0 -> 27536 bytes build/test/out/c/test_Modules_runner.o | Bin 0 -> 9080 bytes build/test/out/test_Modules.out | Bin 0 -> 69024 bytes build/test/preprocess/files/test_Modules.c | 53 +++ build/test/preprocess/includes/test_Modules.c | 3 + build/test/results/test_Modules.pass | 18 + build/test/runners/test_Modules_runner.c | 81 ++++ src/Modules.c | 334 ++++++++++++++++ src/Modules.h | 48 +++ src/Paper-Bin.c | 376 +----------------- src/Paper-Bin.h | 5 - test/test_Modules.c | 20 + test/test_Paper-Bin.c | 20 - 23 files changed, 623 insertions(+), 401 deletions(-) create mode 100644 build/release/dependencies/Modules.d create mode 100644 build/release/out/c/Modules.o create mode 100644 build/test/cache/test_Modules.c create mode 100644 build/test/dependencies/test_Modules.d create mode 100644 build/test/dependencies/test_Modules_runner.d create mode 100644 build/test/out/c/test_Modules.o create mode 100644 build/test/out/c/test_Modules_runner.o create mode 100755 build/test/out/test_Modules.out create mode 100644 build/test/preprocess/files/test_Modules.c create mode 100644 build/test/preprocess/includes/test_Modules.c create mode 100644 build/test/results/test_Modules.pass create mode 100644 build/test/runners/test_Modules_runner.c create mode 100644 src/Modules.c create mode 100644 src/Modules.h delete mode 100644 src/Paper-Bin.h create mode 100644 test/test_Modules.c delete mode 100644 test/test_Paper-Bin.c diff --git a/build/artifacts/release/Paper-Bin.out b/build/artifacts/release/Paper-Bin.out index 0dfb6386aff4e4226568a889ae862975f33fd282..68629c566d3c5c7c45b04d5b06fc75a26991d246 100644 GIT binary patch delta 1338 zcmZuwZAep57(Qncb@|aYjqCLzXGj^Dy3H^P!TGg`N*kjxP-s|SVCafK!#)JfNe0^c zL&N?UMG_^gTlN7(B7q=efY9u0d;$wq=C7F7F zT9Z?L&oTCZYl@@wS2TrDq1xLtGAx{M?GipduvwF78F+BK3N1JeLO+gn7`6(!R8(|g z_6h{7$w@rtF|Nv27!z^+&(n#Hk~cL$2l;vXX`|GX_d`ql;I#?RV2cx9qLgAEY1uq! zLvV#Sh8vU!#96U{!RaJSAiE&5aU}oHW_Ar|fgpxrH3kw-E;|*rPrb89Fc%2aB#(LE zL8X9La^3Bitf`a73owjXt@6AFRx#@q`WrO{(#S7jLkw_@IKo+?C-34EYED&5 z$_^ROT`bTAXekuLWw}m~B&w&Y-z)hBeq{fstUidhWEq2A%6yv#QiPl)oIz9KwD6?h@UK&HA0Z1`qZ%E_W2*qxrk)5EHK` z3$+Sr5P7vnl9csx1&AJ2(IJJ8;sMm~Q;rAqn-3`^0xgl1N5NGhh&8fOB&HzcX=p*V zUG*^qRSV!ppI+JL9t2SNhF7JD3Tf=ql~X&NMW+bGBrcDXVx2 I=gYVM1+Ehj7XSbN delta 1228 zcmZ8fUr3Wt6u25~4vWcIaLQ+!PiHlJ2JKYg<}hI}Ga&h{xz`PwYr3 z{f3wM!ZV|C!fLQ8mz`H~VNxu9RP~OY<;5o44euEnMLf2^*bHJD;xflY#^Q*P6k~)E zl2~HQfq3W>V_w9y&y2MozWu^jH{$+f#)c8QzA`q6SpAK$MMUx)>mlOaDbJvC83ssQ zwwZ$y_a59skU+K@-=T&%g^M@N-*^FL-4YGKirY?OAbRYA;UnzwY^QMudF(U_F|+`E zXvbm9V=rl3W$Xo42;`fu3Vu_TFqxN~Lx=-I{rI3YSn=4E8&0nX-kN>1S-DvA%K$^( z!p#b1P`r4<19yF8bP8sDl01z;LTqHtr5^s8d7!nD>j(N)VkQ+fjqvi0ac$tXkRs9@ zR$X#S&`^NZT8VDuc9REl9gq}k)C38PHmcl7ZsqgHnTbrCdc9Un$R*CY29V|IZ91F& z7DE`f3Kr7LNBhsZttwAI#4pil_3VTmza-D=I;S&qK0p%L6|RP_P-IQ2MOXX@Db!h4 zb#lQ{C(%Oip)KW_v>Mv$B)J~@wFolF$#{Ph?jU=Hv)Elh#=YlY7TGRj`Mv4C|5%^h zHJ|}Ww&<+asy#>jQFt5xS3nB!Ih%1ZnR6S_t4bxU>OS_y*FB8$Nft*nKRwBDNCYJM zTG7s*nm?fd$%2x4iAvncRhY|fY02n!FGMisfSP#(dNA|2 znkf@UM&>CY9u0d;$wq=C7F7F zT9Z?L&oTCZYl@@wS2TrDq1xLtGAx{M?GipduvwF78F+BK3N1JeLO+gn7`6(!R8(|g z_6h{7$w@rtF|Nv27!z^+&(n#Hk~cL$2l;vXX`|GX_d`ql;I#?RV2cx9qLgAEY1uq! zLvV#Sh8vU!#96U{!RaJSAiE&5aU}oHW_Ar|fgpxrH3kw-E;|*rPrb89Fc%2aB#(LE zL8X9La^3Bitf`a73owjXt@6AFRx#@q`WrO{(#S7jLkw_@IKo+?C-34EYED&5 z$_^ROT`bTAXekuLWw}m~B&w&Y-z)hBeq{fstUidhWEq2A%6yv#QiPl)oIz9KwD6?h@UK&HA0Z1`qZ%E_W2*qxrk)5EHK` z3$+Sr5P7vnl9csx1&AJ2(IJJ8;sMm~Q;rAqn-3`^0xgl1N5NGhh&8fOB&HzcX=p*V zUG*^qRSV!ppI+JL9t2SNhF7JD3Tf=ql~X&NMW+bGBrcDXVx2 I=gYVM1+Ehj7XSbN delta 1228 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 Tt^GGKFd+5X7w6aI4&{FUL1_JJ literal 0 HcmV?d00001 diff --git a/build/release/out/c/Paper-Bin.o b/build/release/out/c/Paper-Bin.o index a3a5e705471e6eb2310a8f4e9dc4c656d64fd5b2..aa3ab9d1d8630baa0d9f2f0cc8fd3f1b3f743a49 100644 GIT binary patch delta 401 zcmX?*eSvF&hM@ox0~|PjSq==m3_J{<`Q?6vdUQVB0TO!wBEYQJ!;=ey^(QY7b`g{W z3A*wLv@tpJvIX$4b4-3HC_VXuG0S8bQJu*NqAa3942&Q(U;tJPWC=|c6c?Y&A<1i+ zo0yr$P+XE&RKmaqRm1|MLHN&q2vC5EgWL#l=j19wi^=;9>n1xGDKJV-Ry2{H++ZXr z0JTQ~s-A1|N+W&7$jOYN(vv#`c_tZ4AUKm7fG#{@EW#AYF!`3T8l%~7uBkR>1WXUa*`^Yl3!ox7AQ1pa^-U!J literal 13760 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 OH&{&dG_UwR{r>@?8AbvC literal 0 HcmV?d00001 diff --git a/build/test/preprocess/files/test_Modules.c b/build/test/preprocess/files/test_Modules.c new file mode 100644 index 0000000..9b147a2 --- /dev/null +++ b/build/test/preprocess/files/test_Modules.c @@ -0,0 +1,53 @@ +#include "src/Modules.c" +#include "/var/lib/gems/3.0.0/gems/ceedling-0.31.1/vendor/unity/src/unity.h" + + + + + + + + +void setUp(void) + +{ + +} + + + +void tearDown(void) + +{ + +} + + + +void test_checkBallPosition_output(void) + +{ + + binX = 1; + + binY = 1; + + + + ballX = 1; + + ballY = 3; + + + + int output = checkBallPosition(); + + + + UnityAssertEqualNumber((UNITY_INT)((1)), (UNITY_INT)((output)), ( + + ((void *)0) + + ), (UNITY_UINT)(25), UNITY_DISPLAY_STYLE_INT); + +} diff --git a/build/test/preprocess/includes/test_Modules.c b/build/test/preprocess/includes/test_Modules.c new file mode 100644 index 0000000..892d7b6 --- /dev/null +++ b/build/test/preprocess/includes/test_Modules.c @@ -0,0 +1,3 @@ +--- +- "/var/lib/gems/3.0.0/gems/ceedling-0.31.1/vendor/unity/src/unity.h" +- src/Modules.c diff --git a/build/test/results/test_Modules.pass b/build/test/results/test_Modules.pass new file mode 100644 index 0000000..f0fb63a --- /dev/null +++ b/build/test/results/test_Modules.pass @@ -0,0 +1,18 @@ +--- +:source: + :path: test + :file: test_Modules.c +:successes: +- :test: test_checkBallPosition_output + :line: 15 + :message: '' + :unity_test_time: 0 +:failures: [] +:ignores: [] +:counts: + :total: 1 + :passed: 1 + :failed: 0 + :ignored: 0 +:stdout: [] +:time: 0.0006377379995683441 diff --git a/build/test/runners/test_Modules_runner.c b/build/test/runners/test_Modules_runner.c new file mode 100644 index 0000000..21a9be4 --- /dev/null +++ b/build/test/runners/test_Modules_runner.c @@ -0,0 +1,81 @@ +/* AUTOGENERATED FILE. DO NOT EDIT. */ + +/*=======Automagically Detected Files To Include=====*/ +#include "unity.h" + +int GlobalExpectCount; +int GlobalVerifyOrder; +char* GlobalOrderError; + +/*=======External Functions This Runner Calls=====*/ +extern void setUp(void); +extern void tearDown(void); +extern void test_checkBallPosition_output(void); + + +/*=======Mock Management=====*/ +static void CMock_Init(void) +{ + GlobalExpectCount = 0; + GlobalVerifyOrder = 0; + GlobalOrderError = NULL; +} +static void CMock_Verify(void) +{ +} +static void CMock_Destroy(void) +{ +} + +/*=======Test Reset Options=====*/ +void resetTest(void); +void resetTest(void) +{ + tearDown(); + CMock_Verify(); + CMock_Destroy(); + CMock_Init(); + setUp(); +} +void verifyTest(void); +void verifyTest(void) +{ + CMock_Verify(); +} + +/*=======Test Runner Used To Run Each Test=====*/ +static void run_test(UnityTestFunction func, const char* name, UNITY_LINE_TYPE line_num) +{ + Unity.CurrentTestName = name; + Unity.CurrentTestLineNumber = line_num; +#ifdef UNITY_USE_COMMAND_LINE_ARGS + if (!UnityTestMatches()) + return; +#endif + Unity.NumberOfTests++; + UNITY_CLR_DETAILS(); + UNITY_EXEC_TIME_START(); + CMock_Init(); + if (TEST_PROTECT()) + { + setUp(); + func(); + } + if (TEST_PROTECT()) + { + tearDown(); + CMock_Verify(); + } + CMock_Destroy(); + UNITY_EXEC_TIME_STOP(); + UnityConcludeTest(); +} + +/*=======MAIN=====*/ +int main(void) +{ + UnityBegin("test_Modules.c"); + run_test(test_checkBallPosition_output, "test_checkBallPosition_output", 15); + + return UnityEnd(); +} diff --git a/src/Modules.c b/src/Modules.c new file mode 100644 index 0000000..17f5cc2 --- /dev/null +++ b/src/Modules.c @@ -0,0 +1,334 @@ +#include +#include +#include "Modules.h" + + +// Methode, die den Eimer erstellt +void buildBin(int width, int heigth) +{ + field[width][heigth] = 'V'; + field[width + 1][heigth + 1] = '\\'; + field[width + 2][heigth + 2] = '\\'; + field[width - 1][heigth + 1] = '/'; + field[width - 2][heigth + 2] = '/'; + field[width][heigth + 1] = ' '; +} + +void loadLevel(int lvlNum) +{ + clearField(); + ballX = -1; + ballY = 27; + + int tmpX; + int tmpY; + + switch (lvlNum) + { + // Level 1: Nur der Korb wird erstellt + case (1): + binX = 12; + binY = 10; + break; + + // Level 2-6: Zufällige Positionen für den Korb hinzugefügt + case (2): + case (3): + case (4): + case (5): + case (6): + tmpX = rand() % 19; + tmpY = rand() % 12; + while (5 > tmpX) + { + tmpX = rand() % 19; + } + while (5 > tmpY) + { + tmpY = rand() % 12; + } + binX = tmpX; + binY = tmpY; + break; + + // Wind wird dem Level 7 & 8 hinzugefügt + case (7): + binX = 2; + binY = 7; + windForce = -2; + printf("Ein Sturm zieht auf!\n"); + sleep(3); + break; + + case (8): + binX = 19; + binY = 7; + windForce = 1; + break; + + // Wände erscheinen jetzt in den Leveln 9 & 10 + case (9): + windForce = -1; + binX = 8; + binY = 9; + wallX = 7; + wallLength = 4; + wallY = 17; + break; + + case (10): + windForce = 2; + binX = 16; + binY = 12; + wallX = 11; + wallLength = 4; + wallY = 19; + break; + // Abschluss aller Level + case (11): + system("clear"); + generateField(); + addScoreboard(); + sortScoreboard(); + exit(0); + break; + + default: + exit(0); + } + + getStartPosition(); + printf("Der Ball wird geworfen!!!"); + sleep(1); +} + +int start() +{ + loadLevel(lvlNumber); + while (1) + { + clearField(); + field[ballX][ballY -= 1] = 'O'; + generateField(); + int ball_In_Bin = checkBallPosition(); + + switch (ball_In_Bin) + { + case (1): + scorePoints += 50; + loadLevel(++lvlNumber); + break; + + case (2): + scorePoints -= 5; + lifeCount--; + if (lifeCount < 1) + { + if (lvlNumber == 1) + { + char choice = ' '; + printf("Scheint so, als wäre das Spiel eine Nummer zu groß für dich!\n"); + printf("Willst du einen leichteren Modus starten?\n[J]a/[N]ein\n"); + scanf(" %c", &choice); + system("start \"\" \"https://youtu.be/dQw4w9WgXcQ\""); + return 0; + } + addScoreboard(); + sortScoreboard(); + return 0; + } + loadLevel(lvlNumber); + break; + } + ball_In_Bin = 0; + sleep(1); + } +} + +void getStartPosition() +{ + while (ballX == -1) + { + for (int i = 2, j = 0; i <= 20; i += 2, j++) + { + field[i][ballY] = j + '0'; + } + generateField(); + + printf("Wähle die Position des Balls (0-9):\n"); + + scanf("%d", &ballX); + + if (ballX < 0 || 9 < ballX) + { + ballX = -1; + continue; + } + ballX = (ballX + 1) * 2; + } +} + +void clearField() +{ + for (int i = 0; i < fieldWidth; i++) + { + for (int j = 0; j < fieldHeigth; j++) + { + field[i][j] = ' '; + } + } +} + +void generateField() +{ + system("clear"); + buildBin(binX, binY); + + if (scorePoints < 0) + scorePoints = 0; + + // Hier wird Stück für Stück die Zahl aufgeteilt, um alle + // einzelnen Stellen in das Feld einzutragen + int tmp = scorePoints; + field[12][1] = '0' + tmp % 10; + + tmp /= 10; + field[11][1] = '0' + tmp % 10; + + tmp /= 10; + field[10][1] = '0' + tmp % 10; + + field[1][1] = lifeCount < 1 ? 'X' : 'O'; + field[2][1] = lifeCount < 2 ? 'X' : 'O'; + field[3][1] = lifeCount < 3 ? 'X' : 'O'; + + if (windForce != 0) + { + field[19][1] = windForce < 0 ? '<' : '>'; + field[20][1] = windForce < 0 ? (windForce * -1 + '0') : (windForce + '0'); + } + + if (wallX > 0 && wallY > 0 && wallLength > 0) + { + for (int i = wallX; i < +wallX + wallLength; i++) + { + field[i][wallY] = '_'; + } + } + + if (lvlNumber > 6 && windIntervall % 2 == 0) + { + windForce < 0 ? (ballX -= windForce * -1) : (ballX += windForce); + } + windIntervall++; + + for (int i = 0; i < fieldHeigth; i++) + { + printf("|"); + for (int j = 0; j < fieldWidth; j++) + { + if (i == 0 || i == fieldHeigth - 1 || i == 2) + printf("="); + else + printf("%c", field[j][i]); + } + printf("|"); + printf("\n"); + } +} + +void addScoreboard() +{ + // Die .txt wird geöffnet + FILE *fp = fopen("ScoreBoard.txt", "a+"); + char name[255]; + + // Liest den eingegebenen Namen ein + printf("Bitte gib deinen Namen ein:\n"); + scanf("%s", name); + + // Schreibt den Namen und die erreichten Punkte in die Textdatei + fprintf(fp, "%s %d\n", name, scorePoints); + fclose(fp); +} +// Checkt Position vom Ball +int checkBallPosition() +{ + // Bei einem Tor gibt es eine 1 zurück + if (binY + 2 == ballY && (ballX == binX || ballX == binX + 1 || ballX == binX - 1)) + { + return 1; + } + // Wenn der Ball daneben fliegt, gibt es eine 2 zurück + else if (binY + 1 >= ballY || field[ballX][ballY - 1] == '_' || ballX >= fieldWidth || ballX <= 0) + { + return 2; + } + return 0; +} + +void sortScoreboard() +{ + // Öffnet die Textdatei oder erstellt sie, wenn keine existiert + FILE *fp; + fp = fopen("ScoreBoard.txt", "a+"); + // Gibt eine Fehlermeldung, falls die Textdatei nicht existiert + if (fp == NULL) + { + printf("Datei konnte nicht geöffnet werden.\n"); + } + else + { + system("clear"); + // Öffnet die Textdatei + FILE *file = fopen("ScoreBoard.txt", "r"); + char line[1000]; + int numberOfLines = 0; + // Die Textdatei wird Zeile für Zeile eingelesen und in die Strukturliste eingefügt + for (int j = 0; fgets(line, sizeof line, file) != NULL && j <= 10; j++) + { + char *playerTmp = strtok(line, " "); + strcpy(playerList[j].name, playerTmp); + + playerTmp = strtok(NULL, " "); + int playerPoints = atoi(playerTmp); + + playerList[j].points = playerPoints; + + numberOfLines = j; + sleep(0.1); + } + + // Spielerliste mithilfe einer Hilfsveriable sortieren, um sie danach direkt ausgeben zu können + struct Player tmp; + for (int i = 0; i < numberOfLines; i++) + { + for (int j = 0; j < (numberOfLines - i); j++) + { + if (playerList[i].points < playerList[i + 1].points) + { + tmp = playerList[i]; + playerList[i] = playerList[i + 1]; + playerList[i + 1] = tmp; + } + } + } + + fclose(fp); + // Listet die höchsten Scores in der Konsole auf + printf(" Scoreboard:\n\n"); + for (int j = 0; j < numberOfLines; j++) + { + printf("%d. %s %s %d\n", j + 1, (j < 9) ? " " : " ", playerList[j].name, playerList[j].points); + sleep(0.5); + } + + FILE *fp = fopen("ScoreBoard.txt", "w"); + for (int i = 0; i < numberOfLines; i++) + { + fprintf(fp, "%s %d\n", playerList[i].name, playerList[i].points); + } + + fclose(fp); + } +} \ No newline at end of file diff --git a/src/Modules.h b/src/Modules.h new file mode 100644 index 0000000..4d9533d --- /dev/null +++ b/src/Modules.h @@ -0,0 +1,48 @@ +#ifndef PAPER_BIN_H +#define PAPER_BIN_H + +// Spielfeldbreite und Spielfeldhöhe werden definiert +#define fieldWidth 23 +#define fieldHeigth 29 + +#pragma region VarDeclaration + +// Vertikale Startposition der Wand im Array +int wallX = 0; +// Horizontale Startposition der Wand im Array +int wallY = 0; +// Wandlänge, um Wände von der Startposition aus in das Array für das Spielfeld eintragen zu können +int wallLength = 0; +int binX; +int binY = 10; + +char field[fieldWidth][fieldHeigth]; +int windForce = 0; +int scorePoints = 0; + +int lifeCount = 3; +// Die Variablen, die die Positionierung des Balls festlegen +int ballX = -1; +int ballY = 27; +int windIntervall = 0; +int lvlNumber = 1; + +void addScoreboard(); +void clearField(); +void generateField(); +void sortScoreboard(); +void buildBin(int width, int height); +void getStartPosition(); +int checkBallPosition(); + + + +// Ein struct für den Spieler erstellt, um +// jedem Spieler seinen Score zuweisen zu können +struct Player +{ + char name[50]; + int points; +} playerList[11]; + +#endif // PAPER_BIN_H diff --git a/src/Paper-Bin.c b/src/Paper-Bin.c index a3080d8..e9503cc 100644 --- a/src/Paper-Bin.c +++ b/src/Paper-Bin.c @@ -1,381 +1,7 @@ #include -#include -#include "Paper-Bin.h" -//Spielfeldbreite und Spielfeldhöhe werden definiert -#define fieldWidth 23 -#define fieldHeigth 29 - -#pragma region VarDeclaration - -//Vertikale Startposition der Wand im Array -int wallX = 0; -//Horizontale Startposition der Wand im Array -int wallY = 0; -//Wandlänge, um Wände von der Startposition aus in das Array für das Spielfeld eintragen zu können -int wallLength = 0; -int binX; -int binY = 10; - -char field[fieldWidth][fieldHeigth]; -int windForce = 0; -int scorePoints = 0; - -int lifeCount = 3; -//Die Variablen, die die Positionierung des Balls festlegen -int ballX = -1; -int ballY = 27; -int windIntervall = 0; -int lvlNumber = 1; - -#pragma endregion - -#pragma region FunctionDeclaration - -void addScoreboard(); -void clearField(); -void generateField(); -void sortScoreboard(); -void buildBin(int width, int height); -void getStartPosition(); -int checkBallPosition(); - -#pragma endregion - -//Ein struct für den Spieler erstellt, um -//jedem Spieler seinen Score zuweisen zu können -struct Player -{ - char name[50]; - int points; -} playerList[11]; - -//Methode, die den Eimer erstellt -void buildBin(int width, int heigth) -{ - field[width][heigth] = 'V'; - field[width + 1][heigth + 1] = '\\'; - field[width + 2][heigth + 2] = '\\'; - field[width - 1][heigth + 1] = '/'; - field[width - 2][heigth + 2] = '/'; - field[width][heigth + 1] = ' '; -} - -void loadLevel(int lvlNum) -{ - clearField(); - ballX = -1; - ballY = 27; - - int tmpX; - int tmpY; - - switch (lvlNum) - { - //Level 1: Nur der Korb wird erstellt - case (1): - binX = 12; - binY = 10; - break; - - //Level 2-6: Zufällige Positionen für den Korb hinzugefügt - case (2): - case (3): - case (4): - case (5): - case (6): - tmpX = rand() % 19; - tmpY = rand() % 12; - while (5 > tmpX) - { - tmpX = rand() % 19; - } - while (5 > tmpY) - { - tmpY = rand() % 12; - } - binX = tmpX; - binY = tmpY; - break; - - //Wind wird dem Level 7 & 8 hinzugefügt - case (7): - binX = 2; - binY = 7; - windForce = -2; - printf("Ein Sturm zieht auf!\n"); - sleep(3); - break; - - case (8): - binX = 19; - binY = 7; - windForce = 1; - break; - - //Wände erscheinen jetzt in den Leveln 9 & 10 - case (9): - windForce = -1; - binX = 8; - binY = 9; - wallX = 7; - wallLength = 4; - wallY = 17; - break; - - case (10): - windForce = 2; - binX = 16; - binY = 12; - wallX = 11; - wallLength = 4; - wallY = 19; - break; - //Abschluss aller Level - case (11): - system("clear"); - generateField(); - addScoreboard(); - sortScoreboard(); - exit(0); - break; - - default: - exit(0); - } - - getStartPosition(); - printf("Der Ball wird geworfen!!!"); - sleep(1); -} int main() { - loadLevel(lvlNumber); - while (1) - { - clearField(); - field[ballX][ballY -= 1] = 'O'; - generateField(); - int ball_In_Bin = checkBallPosition(); - - switch (ball_In_Bin) - { - case (1): - scorePoints += 50; - loadLevel(++lvlNumber); - break; - - case (2): - scorePoints -= 5; - lifeCount--; - if (lifeCount < 1) - { - if (lvlNumber == 1) - { - char choice = ' '; - printf("Scheint so, als wäre das Spiel eine Nummer zu groß für dich!\n"); - printf("Willst du einen leichteren Modus starten?\n[J]a/[N]ein\n"); - scanf(" %c", &choice); - system("start \"\" \"https://youtu.be/dQw4w9WgXcQ\""); - return 0; - } - addScoreboard(); - sortScoreboard(); - return 0; - } - loadLevel(lvlNumber); - break; - } - ball_In_Bin = 0; - sleep(1); - } -} - -void getStartPosition() -{ - while (ballX == -1) - { - for (int i = 2, j = 0; i <= 20; i += 2, j++) - { - field[i][ballY] = j + '0'; - } - generateField(); - - printf("Wähle die Position des Balls (0-9):\n"); - - scanf("%d", &ballX); - - if (ballX < 0 || 9 < ballX) - { - ballX = -1; - continue; - } - ballX = (ballX + 1) * 2; - } + start(); } - -void clearField() -{ - for (int i = 0; i < fieldWidth; i++) - { - for (int j = 0; j < fieldHeigth; j++) - { - field[i][j] = ' '; - } - } -} - -void generateField() -{ - system("clear"); - buildBin(binX, binY); - - if (scorePoints < 0) - scorePoints = 0; - - //Hier wird Stück für Stück die Zahl aufgeteilt, um alle - //einzelnen Stellen in das Feld einzutragen - int tmp = scorePoints; - field[12][1] = '0' + tmp % 10; - - tmp /= 10; - field[11][1] = '0' + tmp % 10; - - tmp /= 10; - field[10][1] = '0' + tmp % 10; - - field[1][1] = lifeCount < 1 ? 'X' : 'O'; - field[2][1] = lifeCount < 2 ? 'X' : 'O'; - field[3][1] = lifeCount < 3 ? 'X' : 'O'; - - if (windForce != 0) - { - field[19][1] = windForce < 0 ? '<' : '>'; - field[20][1] = windForce < 0 ? (windForce * -1 + '0') : (windForce + '0'); - } - - if (wallX > 0 && wallY > 0 && wallLength > 0) - { - for (int i = wallX; i < +wallX + wallLength; i++) - { - field[i][wallY] = '_'; - } - } - - if (lvlNumber > 6 && windIntervall % 2 == 0) - { - windForce < 0 ? (ballX -= windForce * -1) : (ballX += windForce); - } - windIntervall++; - - for (int i = 0; i < fieldHeigth; i++) - { - printf("|"); - for (int j = 0; j < fieldWidth; j++) - { - if (i == 0 || i == fieldHeigth - 1 || i == 2) - printf("="); - else - printf("%c", field[j][i]); - } - printf("|"); - printf("\n"); - } -} - -void addScoreboard() -{ - //Die .txt wird geöffnet - FILE *fp = fopen("ScoreBoard.txt", "a+"); - char name[255]; - - //Liest den eingegebenen Namen ein - printf("Bitte gib deinen Namen ein:\n"); - scanf("%s", name); - - //Schreibt den Namen und die erreichten Punkte in die Textdatei - fprintf(fp, "%s %d\n", name, scorePoints); - fclose(fp); -} -//Checkt Position vom Ball -int checkBallPosition() -{ - //Bei einem Tor gibt es eine 1 zurück - if (binY + 2 == ballY && (ballX == binX || ballX == binX + 1 || ballX == binX - 1)) - { - return 1; - } - //Wenn der Ball daneben fliegt, gibt es eine 2 zurück - else if (binY + 1 >= ballY || field[ballX][ballY - 1] == '_' || ballX >= fieldWidth || ballX <= 0) - { - return 2; - } - return 0; -} - -void sortScoreboard() -{ - //Öffnet die Textdatei oder erstellt sie, wenn keine existiert - FILE *fp; - fp = fopen("ScoreBoard.txt", "a+"); - //Gibt eine Fehlermeldung, falls die Textdatei nicht existiert - if (fp == NULL) - { - printf("Datei konnte nicht geöffnet werden.\n"); - } - else - { - system("clear"); - //Öffnet die Textdatei - FILE *file = fopen("ScoreBoard.txt", "r"); - char line[1000]; - int numberOfLines = 0; - //Die Textdatei wird Zeile für Zeile eingelesen und in die Strukturliste eingefügt - for (int j = 0; fgets(line, sizeof line, file) != NULL && j <= 10; j++) - { - char* playerTmp = strtok(line, " "); - strcpy(playerList[j].name, playerTmp); - - playerTmp = strtok(NULL, " "); - int playerPoints = atoi(playerTmp); - - playerList[j].points = playerPoints; - - numberOfLines = j; - sleep(0.1); - } - - //Spielerliste mithilfe einer Hilfsveriable sortieren, um sie danach direkt ausgeben zu können - struct Player tmp; - for (int i = 0; i < numberOfLines; i++) - { - for (int j = 0; j < (numberOfLines - i); j++) - { - if (playerList[i].points < playerList[i + 1].points) - { - tmp = playerList[i]; - playerList[i] = playerList[i + 1]; - playerList[i + 1] = tmp; - } - } - } - - fclose(fp); - //Listet die höchsten Scores in der Konsole auf - printf(" Scoreboard:\n\n"); - for (int j = 0; j < numberOfLines; j++) - { - printf("%d. %s %s %d\n", j + 1, (j < 9) ? " " : " ", playerList[j].name, playerList[j].points); - sleep(0.5); - } - - FILE *fp = fopen("ScoreBoard.txt", "w"); - for (int i = 0; i < numberOfLines; i++) - { - fprintf(fp, "%s %d\n", playerList[i].name, playerList[i].points); - } - - fclose(fp); - } -} \ No newline at end of file diff --git a/src/Paper-Bin.h b/src/Paper-Bin.h deleted file mode 100644 index ee9ef8f..0000000 --- a/src/Paper-Bin.h +++ /dev/null @@ -1,5 +0,0 @@ -#ifndef PAPER_BIN_H -#define PAPER_BIN_H - - -#endif // PAPER_BIN_H diff --git a/test/test_Modules.c b/test/test_Modules.c new file mode 100644 index 0000000..88d7524 --- /dev/null +++ b/test/test_Modules.c @@ -0,0 +1,20 @@ +#ifdef TEST + +#include "unity.h" + +#include "Modules.c" + +void setUp(void) +{ +} + +void tearDown(void) +{ +} + +void test_dsadsa_NeedToImplement(void) +{ + TEST_IGNORE_MESSAGE("Need to Implement dsadsa"); +} + +#endif // TEST diff --git a/test/test_Paper-Bin.c b/test/test_Paper-Bin.c deleted file mode 100644 index bd530d3..0000000 --- a/test/test_Paper-Bin.c +++ /dev/null @@ -1,20 +0,0 @@ -#ifdef TEST - -#include "unity.h" - -#include "Paper-Bin.h" - -void setUp(void) -{ -} - -void tearDown(void) -{ -} - -void test_Paper_Bin_NeedToImplement(void) -{ - TEST_IGNORE_MESSAGE("Need to Implement Paper-Bin"); -} - -#endif // TEST