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.

365 lines
7.4 KiB

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