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.

368 lines
7.2 KiB

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