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.

379 lines
8.3 KiB

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