You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

333 lines
7.7 KiB

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include "Modules.h"
  4. // Methode, die den Eimer erstellt
  5. void buildBin(int width, int heigth)
  6. {
  7. field[width][heigth] = 'V';
  8. field[width + 1][heigth + 1] = '\\';
  9. field[width + 2][heigth + 2] = '\\';
  10. field[width - 1][heigth + 1] = '/';
  11. field[width - 2][heigth + 2] = '/';
  12. field[width][heigth + 1] = ' ';
  13. }
  14. void loadLevel(int lvlNum)
  15. {
  16. clearField();
  17. ballX = -1;
  18. ballY = 27;
  19. int tmpX;
  20. int tmpY;
  21. switch (lvlNum)
  22. {
  23. // Level 1: Nur der Korb wird erstellt
  24. case (1):
  25. binX = 12;
  26. binY = 10;
  27. break;
  28. // Level 2-6: Zufällige Positionen für den Korb hinzugefügt
  29. case (2):
  30. case (3):
  31. case (4):
  32. case (5):
  33. case (6):
  34. tmpX = rand() % 19;
  35. tmpY = rand() % 12;
  36. while (5 > tmpX)
  37. {
  38. tmpX = rand() % 19;
  39. }
  40. while (5 > tmpY)
  41. {
  42. tmpY = rand() % 12;
  43. }
  44. binX = tmpX;
  45. binY = tmpY;
  46. break;
  47. // Wind wird dem Level 7 & 8 hinzugefügt
  48. case (7):
  49. binX = 2;
  50. binY = 7;
  51. windForce = -2;
  52. printf("Ein Sturm zieht auf!\n");
  53. sleep(3);
  54. break;
  55. case (8):
  56. binX = 19;
  57. binY = 7;
  58. windForce = 1;
  59. break;
  60. // Wände erscheinen jetzt in den Leveln 9 & 10
  61. case (9):
  62. windForce = -1;
  63. binX = 8;
  64. binY = 9;
  65. wallX = 7;
  66. wallLength = 4;
  67. wallY = 17;
  68. break;
  69. case (10):
  70. windForce = 2;
  71. binX = 16;
  72. binY = 12;
  73. wallX = 11;
  74. wallLength = 4;
  75. wallY = 19;
  76. break;
  77. // Abschluss aller Level
  78. case (11):
  79. system("clear");
  80. generateField();
  81. addScoreboard();
  82. sortScoreboard();
  83. exit(0);
  84. break;
  85. default:
  86. exit(0);
  87. }
  88. getStartPosition();
  89. printf("Der Ball wird geworfen!!!");
  90. sleep(1);
  91. }
  92. int start()
  93. {
  94. loadLevel(lvlNumber);
  95. while (1)
  96. {
  97. clearField();
  98. field[ballX][ballY -= 1] = 'O';
  99. generateField();
  100. int ball_In_Bin = checkBallPosition();
  101. switch (ball_In_Bin)
  102. {
  103. case (1):
  104. scorePoints += 50;
  105. loadLevel(++lvlNumber);
  106. break;
  107. case (2):
  108. scorePoints -= 5;
  109. lifeCount--;
  110. if (lifeCount < 1)
  111. {
  112. if (lvlNumber == 1)
  113. {
  114. char choice = ' ';
  115. printf("Scheint so, als wäre das Spiel eine Nummer zu groß für dich!\n");
  116. printf("Willst du einen leichteren Modus starten?\n[J]a/[N]ein\n");
  117. scanf(" %c", &choice);
  118. system("start \"\" \"https://youtu.be/dQw4w9WgXcQ\"");
  119. return 0;
  120. }
  121. addScoreboard();
  122. sortScoreboard();
  123. return 0;
  124. }
  125. loadLevel(lvlNumber);
  126. break;
  127. }
  128. ball_In_Bin = 0;
  129. sleep(1);
  130. }
  131. }
  132. void getStartPosition()
  133. {
  134. while (ballX == -1)
  135. {
  136. for (int i = 2, j = 0; i <= 20; i += 2, j++)
  137. {
  138. field[i][ballY] = j + '0';
  139. }
  140. generateField();
  141. printf("Wähle die Position des Balls (0-9):\n");
  142. scanf("%d", &ballX);
  143. if (ballX < 0 || 9 < ballX)
  144. {
  145. ballX = -1;
  146. continue;
  147. }
  148. ballX = (ballX + 1) * 2;
  149. }
  150. }
  151. void clearField()
  152. {
  153. for (int i = 0; i < fieldWidth; i++)
  154. {
  155. for (int j = 0; j < fieldHeigth; j++)
  156. {
  157. field[i][j] = ' ';
  158. }
  159. }
  160. }
  161. void generateField()
  162. {
  163. system("clear");
  164. buildBin(binX, binY);
  165. if (scorePoints < 0)
  166. scorePoints = 0;
  167. // Hier wird Stück für Stück die Zahl aufgeteilt, um alle
  168. // einzelnen Stellen in das Feld einzutragen
  169. int tmp = scorePoints;
  170. field[12][1] = '0' + tmp % 10;
  171. tmp /= 10;
  172. field[11][1] = '0' + tmp % 10;
  173. tmp /= 10;
  174. field[10][1] = '0' + tmp % 10;
  175. field[1][1] = lifeCount < 1 ? 'X' : 'O';
  176. field[2][1] = lifeCount < 2 ? 'X' : 'O';
  177. field[3][1] = lifeCount < 3 ? 'X' : 'O';
  178. if (windForce != 0)
  179. {
  180. field[19][1] = windForce < 0 ? '<' : '>';
  181. field[20][1] = windForce < 0 ? (windForce * -1 + '0') : (windForce + '0');
  182. }
  183. if (wallX > 0 && wallY > 0 && wallLength > 0)
  184. {
  185. for (int i = wallX; i < +wallX + wallLength; i++)
  186. {
  187. field[i][wallY] = '_';
  188. }
  189. }
  190. if (lvlNumber > 6 && windIntervall % 2 == 0)
  191. {
  192. windForce < 0 ? (ballX -= windForce * -1) : (ballX += windForce);
  193. }
  194. windIntervall++;
  195. for (int i = 0; i < fieldHeigth; i++)
  196. {
  197. printf("|");
  198. for (int j = 0; j < fieldWidth; j++)
  199. {
  200. if (i == 0 || i == fieldHeigth - 1 || i == 2)
  201. printf("=");
  202. else
  203. printf("%c", field[j][i]);
  204. }
  205. printf("|");
  206. printf("\n");
  207. }
  208. }
  209. void addScoreboard()
  210. {
  211. // Die .txt wird geöffnet
  212. FILE *fp = fopen("ScoreBoard.txt", "a+");
  213. char name[255];
  214. // Liest den eingegebenen Namen ein
  215. printf("Bitte gib deinen Namen ein:\n");
  216. scanf("%s", name);
  217. // Schreibt den Namen und die erreichten Punkte in die Textdatei
  218. fprintf(fp, "%s %d\n", name, scorePoints);
  219. fclose(fp);
  220. }
  221. // Checkt Position vom Ball
  222. int checkBallPosition()
  223. {
  224. // Bei einem Tor gibt es eine 1 zurück
  225. if (binY + 2 == ballY && (ballX == binX || ballX == binX + 1 || ballX == binX - 1))
  226. {
  227. return 1;
  228. }
  229. // Wenn der Ball daneben fliegt, gibt es eine 2 zurück
  230. else if (binY + 1 >= ballY || field[ballX][ballY - 1] == '_' || ballX >= fieldWidth || ballX <= 0)
  231. {
  232. return 2;
  233. }
  234. return 0;
  235. }
  236. void sortScoreboard()
  237. {
  238. // Öffnet die Textdatei oder erstellt sie, wenn keine existiert
  239. FILE *fp;
  240. fp = fopen("ScoreBoard.txt", "a+");
  241. // Gibt eine Fehlermeldung, falls die Textdatei nicht existiert
  242. if (fp == NULL)
  243. {
  244. printf("Datei konnte nicht geöffnet werden.\n");
  245. }
  246. else
  247. {
  248. system("clear");
  249. // Öffnet die Textdatei
  250. FILE *file = fopen("ScoreBoard.txt", "r");
  251. char line[1000];
  252. int numberOfLines = 0;
  253. // Die Textdatei wird Zeile für Zeile eingelesen und in die Strukturliste eingefügt
  254. for (int j = 0; fgets(line, sizeof line, file) != NULL && j <= 10; j++)
  255. {
  256. char *playerTmp = strtok(line, " ");
  257. strcpy(playerList[j].name, playerTmp);
  258. playerTmp = strtok(NULL, " ");
  259. int playerPoints = atoi(playerTmp);
  260. playerList[j].points = playerPoints;
  261. numberOfLines = j;
  262. sleep(0.1);
  263. }
  264. // Spielerliste mithilfe einer Hilfsveriable sortieren, um sie danach direkt ausgeben zu können
  265. struct Player tmp;
  266. for (int i = 0; i < numberOfLines; i++)
  267. {
  268. for (int j = 0; j < (numberOfLines - i); j++)
  269. {
  270. if (playerList[i].points < playerList[i + 1].points)
  271. {
  272. tmp = playerList[i];
  273. playerList[i] = playerList[i + 1];
  274. playerList[i + 1] = tmp;
  275. }
  276. }
  277. }
  278. fclose(fp);
  279. // Listet die höchsten Scores in der Konsole auf
  280. printf(" Scoreboard:\n\n");
  281. for (int j = 0; j < numberOfLines; j++)
  282. {
  283. printf("%d. %s %s %d\n", j + 1, (j < 9) ? " " : " ", playerList[j].name, playerList[j].points);
  284. sleep(0.5);
  285. }
  286. FILE *fp = fopen("ScoreBoard.txt", "w");
  287. for (int i = 0; i < numberOfLines; i++)
  288. {
  289. fprintf(fp, "%s %d\n", playerList[i].name, playerList[i].points);
  290. }
  291. fclose(fp);
  292. }
  293. }