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.

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