fork download
  1. #include <windows.h>
  2. #include <stdio.h>
  3. #include <conio.h>
  4. #include <math.h>
  5. #include <time.h>
  6.  
  7. HANDLE hOut;
  8. time_t start,endet;
  9. int width = 55, height = 36, modifikator = 0, siegPunkte = 5, spielmodus = 0;;
  10. int cScore = 0, yScore = 0, y2Score = 0, mainLoop = 0;;
  11. int links = 65, rechts = 68, beenden = 81;
  12. int links2 = 37, rechts2 = 39, beenden2 = 38;
  13. char name[40] = "";
  14. char pfad[60] = "C:\\Machbar.txt";
  15. char modus [30] = "Mensch vs Computer";
  16. char schwierigkeit[20] = "Machbar";
  17. char spielergebnis[20] = "";
  18. double dif = 0.0f;
  19. float maxSpeed = 3.2f, kiReaktion = 8.0f;
  20.  
  21.  
  22. typedef struct
  23. {
  24. float x, y; // x und y Position des Pads
  25. int size; // Größe des Pads
  26. float ox, oy; // Anfangstellung der Pads
  27. float vx; // KI Geschwindigkeit
  28.  
  29. } spieler;
  30.  
  31. // Methode, um Werte für ein Objekt der spieler struct zu setzen
  32. void spieler_(spieler *this,int _x, int _y, int _size)
  33. {
  34. this->x = (float)(_x);
  35. this->y = (float)(_y);
  36. this->size = _size;
  37. this->ox = (float)(_x);
  38. this->oy = (float)(_y);
  39. }
  40.  
  41. // Pads zeichnen
  42. void draw(spieler *this)
  43. {
  44. int i;
  45. COORD p;
  46. p.X = (int)(this->ox) - this->size ;
  47. p.Y = (int)(this->oy);
  48. SetConsoleCursorPosition(hOut, p);
  49.  
  50. for (i = -this->size; i < this->size + modifikator; i++)
  51. {
  52. printf(" ");
  53. }
  54.  
  55. p.X = (int)(this->x) - this->size; // Pads zeichnen
  56. p.Y = (int)(this->y);
  57. SetConsoleCursorPosition(hOut, p);
  58. SetConsoleTextAttribute(hOut, 10);
  59.  
  60. for (i = -this->size; i < this->size + modifikator; i++)
  61. {
  62. printf("=");
  63. }
  64.  
  65. SetConsoleTextAttribute(hOut, 15);
  66. this->ox = this->x;
  67. this->oy = this->y;
  68. }
  69.  
  70. typedef struct ball
  71. {
  72. float x, y, ox, oy; // aktuelle und Anfangsstellung des Balls
  73. float vx, vy; // Geschwindigkeit x, y des Balls
  74. } ball;
  75.  
  76. // Methode, um Werte für ein Objekt der ball struct zu setzen
  77. void ball_(ball *this,int _x, int _y)
  78. {
  79. this->x = (float)(_x);
  80. this->y = (float)(_y);
  81. this->ox = (float)(this->x);
  82. this->oy = (float)(this->y);
  83. this->vx = this->vy = 0;
  84. }
  85.  
  86. // Ball zeichnen
  87. void drawball(ball *this)
  88. {
  89. COORD p;
  90. p.X = (int)(this->ox);
  91. p.Y = (int)(this->oy);
  92. SetConsoleCursorPosition(hOut, p);
  93. printf(" ");
  94. p.X = (int)(this->x);
  95. p.Y = (int)(this->y);
  96. SetConsoleCursorPosition(hOut, p);
  97. SetConsoleTextAttribute(hOut, 12);
  98. printf("0");
  99. SetConsoleTextAttribute(hOut, 15);
  100. this->ox = this->x;
  101. this->oy = this->y;
  102. }
  103.  
  104. // Alles zur�¼cksetzen
  105. void reset(spieler *you, spieler *you2, spieler *comp, ball *b, int you_score , int you2_score, int comp_score)
  106. {
  107. b->x = (float)(width / 2 - 1);
  108. b->y = (float)(height / 2); // Koordinaten zum zeichnen auf Anfangswerte setzen
  109. you->x = comp->x = (float)(width / 2);
  110. comp->vx = 0.0f; // Geschwindigkeiten auf 0 standart zurücksetzen
  111. b->vx = (float)(rand() % 3) - 1.5f;
  112. b->vy = 1;
  113. COORD p;
  114. p.X = 0;
  115. p.Y = height;
  116. SetConsoleCursorPosition(hOut, p);
  117. if(spielmodus == 0)printf("\n| Your score: %i | Computer score: %i ||| Speed: 0 |\n", you_score, comp_score); // Spielstand aktualisieren bei Spielmodus = Mensch vs Computer
  118. if(spielmodus == 1)printf("\n| Spi. 1 score: %i | Spi. 2 score: %i ||| Speed: 0 |\n", you_score, you2_score); // Spielstand aktualisieren bei Spielmodus = Mensch vs Mensch
  119. }
  120.  
  121. // Größe der Konsole festlegen
  122. void setWindowSize(int x, int y)
  123. {
  124. SMALL_RECT sr_window = {0, 0, x - 1, y - 1};
  125. COORD extension;
  126. CONSOLE_SCREEN_BUFFER_INFO csbi;
  127.  
  128. GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi); // Akutelle Fensterpuffer Größe ermitteln
  129.  
  130. extension.X = max(x, csbi.dwMaximumWindowSize.X);
  131. extension.Y = max(y, csbi.dwMaximumWindowSize.Y);
  132.  
  133. SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE), extension); // Puffer auf max Werte setzen
  134. SetConsoleWindowInfo(GetStdHandle(STD_OUTPUT_HANDLE), TRUE, &sr_window); // Fenster auf max Werte setzen
  135.  
  136. extension.X = x;
  137. extension.Y = y;
  138. SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE), extension); // Puffer auf Fenstergröße setzen
  139. }
  140.  
  141. // Highscore anzeigen
  142. void highscoreAusgeben()
  143. {
  144. char* ausgabe; // Zeiger auf bestimmte Stellen im später eingelesenen String
  145. char zwischenPfad[60] = ""; // char array, um einen Dateipfad zwischenzuspeichern
  146. strcat(zwischenPfad,pfad); // Pfad in zwischenPfad zwischenspeichern
  147. char einlesen[69]; // Array um Inhalt der txt zwischen zu speichern
  148.  
  149. system("cls"); // Konsole leeren
  150. printf("Welche Highscores wollen sie anschauen?\n\n");
  151. printf("<1> Amateur\n");
  152. printf("<2> Machbar\n");
  153. printf("<3> Veteran\n"); // Highscore Auswahlmenü darstellen
  154. printf("<4> Nervt\224tend\n");
  155. printf("<5> Mehrspieler");
  156.  
  157. int auswahl = _getch(); // "Hihscorelistenauswahl" in auswahl speichern
  158. system("cls"); // Konsole leeren
  159.  
  160. if(auswahl == 49) // falls "1" gedrückt wurde, Amateur.txt ausgeben
  161. {
  162. FILE* FDatei; // Zeiger auf Highscore txt erstellen
  163. strcpy(pfad, "C:\\Amateur.txt"); // Pfad für die Amatuer.txt in das char Array pfad kopieren
  164. FDatei = fopen(pfad, "r"); // Amateur.txt öffnen und lesen
  165. int i = 1; // Startwert für Vorzeichen (1. , 2. , 3....) für Ausgabe erhöhen
  166.  
  167. if(!FDatei) // gibt es die Amateur.txt noch nicht?
  168. {
  169. FDatei = fopen(pfad, "w"); // falls Amateur.txt noch nicht vorhanden, erstelle diese
  170. fclose(FDatei);
  171. printf("\nLeider hat noch niemand einen Highscore aufgestellt!\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<1> Zur\201ck zum Hauptmen\201");
  172.  
  173. int auswahl = _getch(); // zurück zum Menü Abfrage (falls 1 gedrückt wird zurück zum mNeü)
  174. if(auswahl == 49)
  175. {
  176. return;
  177. }
  178. }
  179. else if(fgets(einlesen,50,FDatei) == NULL) // steht etwas in der Amateur.txt?
  180. {
  181. printf("\nLeider hat noch niemand einen Highscore aufgestellt!\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<1> Zur\201ck zum Hauptmen\201"); // falls nein, dies ausgeben
  182. int auswahl = _getch(); // zurück zum Menü Abfrage (falls 1 gedrückt wird)
  183. if(auswahl == 49)
  184. {
  185. return;
  186. }
  187. fclose(FDatei); // Datei schliessen
  188. }
  189. else
  190. {
  191. fclose(FDatei);
  192. FDatei = fopen(pfad, "r"); // noch einmal schließen und öffnen, um wieder am Anfang der Datei zu beginnen
  193. while (fgets(einlesen,50,FDatei)) // ansonsten Highscore ausgeben & lese bis Dateiende
  194. {
  195. ausgabe = strchr (einlesen, '.'); // Punkt im eingelesenen String suchen
  196. ausgabe += 1; // Zeiger um 1 nach rechts verschieben, um den Punkt nicht mit auszugeben
  197. printf("%i. %s", i, ausgabe); // bearbeiteten String ausgeben
  198. i++; // Vorzeichen (1. , 2. , 3....) für Ausgabe erhöhen
  199. }
  200. fclose(FDatei); // Datei schliessen
  201. printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<1> Zur\201ck zum Hauptmen\201"); // falls Highscore Datei noch nicht vorhanden, erstelle diese
  202.  
  203. int auswahl = _getch(); // zurück zum Menü Abfrage (falls 1 gedrückt wird)
  204. if(auswahl == 49)
  205. {
  206. return;
  207. }
  208. }
  209. }
  210. if(auswahl == 50) // falls "1" gedrückt wurde, Machbar.txt ausgeben
  211. {
  212. FILE* FDatei; // Zeiger auf Machbar txt erstellen
  213. strcpy(pfad, "C:\\Machbar.txt"); // Pfad für die Machbar.txt in das char Array pfad kopieren
  214. FDatei = fopen(pfad, "r"); // Machbar.txt öffnen und lesen
  215. int i = 1; // Startwert für Vorzeichen (1. , 2. , 3....) für Ausgabe erhöhen
  216.  
  217. if(!FDatei) // gibt es die Machbar.txt noch nicht?
  218. {
  219. FDatei = fopen(pfad, "w"); // falls Amateur.txt noch nicht vorhanden, erstelle diese
  220. fclose(FDatei);
  221. printf("\nLeider hat noch niemand einen Highscore aufgestellt!\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<1> Zur\201ck zum Hauptmen\201");
  222.  
  223. int auswahl = _getch(); // zurück zum Menü Abfrage (falls 1 gedrückt wird zurück zum mNeü)
  224. if(auswahl == 49)
  225. {
  226. return;
  227. }
  228. }
  229. else if(fgets(einlesen,50,FDatei) == NULL) // steht etwas in der Machbar.txt?
  230. {
  231. printf("\nLeider hat noch niemand einen Highscore aufgestellt!\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<1> Zur\201ck zum Hauptmen\201"); // falls nein, dies ausgeben
  232. int auswahl = _getch(); // zurück zum Menü Abfrage (falls 1 gedrückt wird)
  233. if(auswahl == 49)
  234. {
  235. return;
  236. }
  237. fclose(FDatei); // Datei schliessen
  238. }
  239. else
  240. {
  241. fclose(FDatei);
  242. FDatei = fopen(pfad, "r"); // noch einmal schließen und öffnen, um wieder am Anfang der Datei zu beginnen
  243. while (fgets(einlesen,50,FDatei)) // ansonsten Highscore ausgeben & lese bis Dateiende
  244. {
  245. ausgabe = strchr (einlesen, '.'); // Punkt im eingelesenen String suchen
  246. ausgabe += 1; // Zeiger um 1 nach rechts verschieben, um den Punkt nicht mit auszugeben
  247. printf("%i. %s", i, ausgabe); // bearbeiteten String ausgeben
  248. i++; // Vorzeichen (1. , 2. , 3....) für Ausgabe erhöhen
  249. }
  250. fclose(FDatei); // Datei schliessen
  251. printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<1> Zur\201ck zum Hauptmen\201"); // falls Highscore Datei noch nicht vorhanden, erstelle diese
  252.  
  253. int auswahl = _getch(); // zurück zum Menü Abfrage (falls 1 gedrückt wird)
  254. if(auswahl == 49)
  255. {
  256. return;
  257. }
  258. }
  259. }
  260. if(auswahl == 51) // falls "1" gedrückt wurde, Veteran.txt ausgeben
  261. {
  262. FILE* FDatei; // Zeiger auf Veteran txt erstellen
  263. strcpy(pfad, "C:\\Veteran.txt"); // Pfad für die Veteran.txt in das char Array pfad kopieren
  264. FDatei = fopen(pfad, "r"); // Veteran.txt öffnen und lesen
  265. int i = 1; // Startwert für Vorzeichen (1. , 2. , 3....) für Ausgabe erhöhen
  266.  
  267. if(!FDatei) // gibt es die Veteran.txt noch nicht?
  268. {
  269. FDatei = fopen(pfad, "w"); // falls Veteran.txt noch nicht vorhanden, erstelle diese
  270. fclose(FDatei);
  271. printf("\nLeider hat noch niemand einen Highscore aufgestellt!\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<1> Zur\201ck zum Hauptmen\201");
  272.  
  273. int auswahl = _getch(); // zurück zum Menü Abfrage (falls 1 gedrückt wird zurück zum mNeü)
  274. if(auswahl == 49)
  275. {
  276. return;
  277. }
  278. }
  279. else if(fgets(einlesen,50,FDatei) == NULL) // steht etwas in der Veteran.txt?
  280. {
  281. printf("\nLeider hat noch niemand einen Highscore aufgestellt!\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<1> Zur\201ck zum Hauptmen\201"); // falls nein, dies ausgeben
  282. int auswahl = _getch(); // zurück zum Menü Abfrage (falls 1 gedrückt wird)
  283. if(auswahl == 49)
  284. {
  285. return;
  286. }
  287. fclose(FDatei); // Datei schliessen
  288. }
  289. else
  290. {
  291. fclose(FDatei);
  292. FDatei = fopen(pfad, "r"); // noch einmal schließen und öffnen, um wieder am Anfang der Datei zu beginnen
  293. while (fgets(einlesen,50,FDatei)) // ansonsten Highscore ausgeben & lese bis Dateiende
  294. {
  295. ausgabe = strchr (einlesen, '.'); // Punkt im eingelesenen String suchen
  296. ausgabe += 1; // Zeiger um 1 nach rechts verschieben, um den Punkt nicht mit auszugeben
  297. printf("%i. %s", i, ausgabe); // bearbeiteten String ausgeben
  298. i++; // Vorzeichen (1. , 2. , 3....) für Ausgabe erhöhen
  299. }
  300. fclose(FDatei); // Datei schliessen
  301. printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<1> Zur\201ck zum Hauptmen\201"); // falls Highscore Datei noch nicht vorhanden, erstelle diese
  302.  
  303. int auswahl = _getch(); // zurück zum Menü Abfrage (falls 1 gedrückt wird)
  304. if(auswahl == 49)
  305. {
  306. return;
  307. }
  308. }
  309. }
  310. if(auswahl == 52) // falls "1" gedrückt wurde, Nervt\224tend.txt ausgeben
  311. {
  312. FILE* FDatei; // Zeiger auf Nervt\224tend txt erstellen
  313. strcpy(pfad, "C:\\Nervt\224tend.txt"); // Pfad für die Nervt\224tend.txt in das char Array pfad kopieren
  314. FDatei = fopen(pfad, "r"); // Nervt\224tend.txt öffnen und lesen
  315. int i = 1; // Startwert für Vorzeichen (1. , 2. , 3....) für Ausgabe erhöhen
  316.  
  317. if(!FDatei) // gibt es die Nervt\224tend.txt noch nicht?
  318. {
  319. FDatei = fopen(pfad, "w"); // falls Nervt\224tend.txt noch nicht vorhanden, erstelle diese
  320. fclose(FDatei);
  321. printf("\nLeider hat noch niemand einen Highscore aufgestellt!\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<1> Zur\201ck zum Hauptmen\201");
  322.  
  323. int auswahl = _getch(); // zurück zum Menü Abfrage (falls 1 gedrückt wird zurück zum mNeü)
  324. if(auswahl == 49)
  325. {
  326. return;
  327. }
  328. }
  329. else if(fgets(einlesen,50,FDatei) == NULL) // steht etwas in der Nervt\224tend.txt?
  330. {
  331. printf("\nLeider hat noch niemand einen Highscore aufgestellt!\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<1> Zur\201ck zum Hauptmen\201"); // falls nein, dies ausgeben
  332. int auswahl = _getch(); // zurück zum Menü Abfrage (falls 1 gedrückt wird)
  333. if(auswahl == 49)
  334. {
  335. return;
  336. }
  337. fclose(FDatei); // Datei schliessen
  338. }
  339. else
  340. {
  341. fclose(FDatei);
  342. FDatei = fopen(pfad, "r"); // noch einmal schließen und öffnen, um wieder am Anfang der Datei zu beginnen
  343. while (fgets(einlesen,50,FDatei)) // ansonsten Highscore ausgeben & lese bis Dateiende
  344. {
  345. ausgabe = strchr (einlesen, '.'); // Punkt im eingelesenen String suchen
  346. ausgabe += 1; // Zeiger um 1 nach rechts verschieben, um den Punkt nicht mit auszugeben
  347. printf("%i. %s", i, ausgabe); // bearbeiteten String ausgeben
  348. i++; // Vorzeichen (1. , 2. , 3....) für Ausgabe erhöhen
  349. }
  350. fclose(FDatei); // Datei schliessen
  351. printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<1> Zur\201ck zum Hauptmen\201"); // falls Highscore Datei noch nicht vorhanden, erstelle diese
  352.  
  353. int auswahl = _getch(); // zurück zum Menü Abfrage (falls 1 gedrückt wird)
  354. if(auswahl == 49)
  355. {
  356. return;
  357. }
  358. }
  359. }
  360. if(auswahl == 53) // falls "1" gedrückt wurde, Mehrspieler.txt ausgeben
  361. {
  362. FILE* FDatei; // Zeiger auf Highscore txt erstellen
  363. strcpy(pfad, "C:\\Mehrspieler.txt"); // Pfad für die Mehrspieler.txt in das char Array pfad kopieren
  364. FDatei = fopen(pfad, "r"); // Mehrspieler.txt öffnen und lesen
  365. int i = 1; // Startwert für Vorzeichen (1. , 2. , 3....) für Ausgabe erhöhen
  366.  
  367. if(!FDatei) // gibt es die Amateur.txt noch nicht?
  368. {
  369. FDatei = fopen(pfad, "w"); // falls Mehrspieler.txt noch nicht vorhanden, erstelle diese
  370. fclose(FDatei);
  371. printf("\nLeider hat noch niemand einen Highscore aufgestellt!\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<1> Zur\201ck zum Hauptmen\201");
  372.  
  373. int auswahl = _getch(); // zurück zum Menü Abfrage (falls 1 gedrückt wird zurück zum mNeü)
  374. if(auswahl == 49)
  375. {
  376. return;
  377. }
  378. }
  379. else if(fgets(einlesen,50,FDatei) == NULL) // steht etwas in der Mehrspieler.txt?
  380. {
  381. printf("\nLeider hat noch niemand einen Highscore aufgestellt!\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<1> Zur\201ck zum Hauptmen\201"); // falls nein, dies ausgeben
  382. int auswahl = _getch(); // zurück zum Menü Abfrage (falls 1 gedrückt wird)
  383. if(auswahl == 49)
  384. {
  385. return;
  386. }
  387. fclose(FDatei); // Datei schliessen
  388. }
  389. else
  390. {
  391. fclose(FDatei);
  392. FDatei = fopen(pfad, "r"); // noch einmal schließen und öffnen, um wieder am Anfang der Datei zu beginnen
  393. while (fgets(einlesen,50,FDatei)) // ansonsten Highscore ausgeben & lese bis Dateiende
  394. {
  395. ausgabe = strchr (einlesen, '.'); // Punkt im eingelesenen String suchen
  396. ausgabe += 1; // Zeiger um 1 nach rechts verschieben, um den Punkt nicht mit auszugeben
  397. printf("%i. %s", i, ausgabe); // bearbeiteten String ausgeben
  398. i++; // Vorzeichen (1. , 2. , 3....) für Ausgabe erhöhen
  399. }
  400. fclose(FDatei); // Datei schliessen
  401. printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<1> Zur\201ck zum Hauptmen\201"); // falls Highscore Datei noch nicht vorhanden, erstelle diese
  402.  
  403. int auswahl = _getch(); // zurück zum Menü Abfrage (falls 1 gedrückt wird)
  404. if(auswahl == 49)
  405. {
  406. return;
  407. }
  408. }
  409. }
  410. else
  411. {
  412. printf("\n\nUng\201ltige Eingabe!\n\n");
  413. Sleep(2000); // falls eine Taste, die nicht zur Auswahl steht gedrückt wurde, Ungültige Eingabe anzeigen
  414. highscoreAusgeben(); // und highscoreAusgeben() Methode neu aufrufen
  415. }
  416.  
  417. strcpy(pfad, zwischenPfad); // ursprünglichen Pfad ->
  418. strcpy(zwischenPfad, ""); // -> wiederherstellen
  419. }
  420.  
  421. // Highscore in Datei schreiben
  422. void highscoreEinlesen()
  423. {
  424. double high[20]; // Array anlegen, um dort die ausgelesenen Highscores zwischenzuspeichern
  425. high[0] = dif, high[1] = dif, high[2] = dif, high[3] = dif; // alle Highscores auf 1000 setzen, da sonst ein erster Vergleich nicht möglich wäre (high[i] = 0, dif = 20 -> high[i] < dif)
  426. FILE* FDatei; // Zeiger auf Datei erstellen
  427. FDatei = fopen(pfad, "r"); // Zeiger auf die Datei mit dem Pfad der in "pfad" gespeichert ist richten und diese zum lesen öffnen
  428. //-------------------------------------------------------- Zahlen einlesen --------------------------------------------------------------------------------------
  429. char score[60];
  430. char* sc; // char arrays, um eingelesene Highscores zwischenzuspeichern
  431. int i = 0; // Zählvariable, um Array durchzulaufen
  432. while(fgets(score,40,FDatei) != NULL) // erste Zeile der Datei einlesen un solange fortfahren, bis das Dateiende erreicht ist
  433. {
  434. sc = strchr(score, ':'); // nach Doppelpunkt in der jeweiligen Zeile suchen und Zeiger auf diesen setzen
  435. high[i] = strtod(sc+1,NULL); // ab dem Doppelpunkt + 1 Zeichen dahinter alles einlesen und in double konvertieren. Endergebnis in double array sp.
  436. i++; // Zählvariable erhöhen
  437. }
  438. fclose(FDatei); // Datei schließen
  439.  
  440. //-------------------------------------------------------- Namen einlesen --------------------------------------------------------------------------------------
  441.  
  442. char* st1 = 0;
  443. char* st2 = 0;
  444. char* st3 = 0;
  445. char* st4 = 0; // Zeiger erstellen für spätere Verarbeitung der eingelesenen Strings
  446. char* st5 = 0;
  447. char* st6 = 0;
  448. char* st7 = 0;
  449. char* st8 = 0;
  450. char* st9 = 0;
  451. char* ptr = ":"; // Suchkriterium für strtok festlegen
  452. FDatei = fopen(pfad, "r"); // Datei erneut öffnen und lesen
  453.  
  454. if(fgets(score,60,FDatei) != NULL) // erste Zeile der Datei einlesen und fortfahren, falls in dieser etwas steht
  455. {
  456. fclose(FDatei); // Datei schließen
  457. FDatei = fopen(pfad, "r"); // Datei erneut öffnen und lesen um wieder am Dateianfang zu starten
  458.  
  459. char platz1[60] = ""; // char array zum zwischenspeichern des eingelesenen String
  460. if(fgets(platz1,60,FDatei) != NULL) // erste Zeile der Datei einlesen und fortfahren, falls in dieser etwas steht
  461. {
  462. st1 = strchr (platz1, '.'); // in dem eingelesenen String einen "." suchen. Highscores werden im folgenden Format abgespeichert: .Marcel's Zeit: 2s
  463. st1 += 1; // Zeiger um 1 nach rechts verschieben, um den Punkt nicht mit auszugeben
  464. strtok(st1,ptr); // Den Zeiger soweit verschieben, bis ein ":" gefunden wurde und diesen sowie alles dahinter vom String abtrennen
  465. }
  466.  
  467. char platz2[60] = "";
  468. if(fgets(platz2,60,FDatei) != NULL) // Dieses Verfahren wird auch für die folgenden Werte verwendet. Es sind maximal 10 Werte speicherbar.
  469. {
  470. st2 = strchr (platz2, '.');
  471. st2 += 1;
  472. strtok(st2,ptr);
  473. }
  474.  
  475. char platz3[60] = "";
  476. if(fgets(platz3,60,FDatei) != NULL)
  477. {
  478. st3 = strchr (platz3, '.');
  479. st3 += 1;
  480. strtok(st3,ptr);}
  481. }
  482.  
  483. char platz4[60] = "";
  484. if(fgets(platz4,60,FDatei) != NULL)
  485. {
  486. st4 = strchr (platz4, '.');
  487. st4 += 1;
  488. strtok(st4,ptr);
  489. }
  490.  
  491. char platz5[60] = "";
  492. if(fgets(platz5,60,FDatei) != NULL)
  493. {
  494. st5 = strchr (platz5, '.');
  495. st5 += 1;
  496. strtok(st5,ptr);
  497. }
  498.  
  499. char platz6[60] = "";
  500. if(fgets(platz6,60,FDatei) != NULL)
  501. {
  502. st6 = strchr (platz6, '.');
  503. st6 += 1;
  504. strtok(st6,ptr);
  505. }
  506.  
  507. char platz7[60] = "";
  508. if(fgets(platz7,60,FDatei) != NULL)
  509. {
  510. st7 = strchr (platz7, '.');
  511. st7 += 1;
  512. strtok(st7,ptr);
  513. }
  514.  
  515. char platz8[60] = "";
  516. if(fgets(platz8,60,FDatei) != NULL)
  517. {
  518. st8 = strchr (platz8, '.');
  519. st8 += 1;
  520. strtok(st8,ptr);
  521. }
  522.  
  523. char platz9[60] = "";
  524. if(fgets(platz9,60,FDatei) != NULL)
  525. {
  526. st9 = strchr (platz9, '.');
  527. st9 += 1;
  528. strtok(st9,ptr);
  529. }
  530. fclose(FDatei); // Datei schließen
  531.  
  532. FDatei = fopen(pfad,"w+"); // Datei öffnen und bearbeiten
  533.  
  534. if(dif <= high[0]) // falls dif (neue Highscore Zeit) besser als der aktuelle Platz 1 gespeichert in high[0] ist....
  535. {
  536. high[9] = high[8];
  537. high[8] = high[7];
  538. high[7] = high[6]; // Dann verschiebe alle Highscores um einen Platz nach unten
  539. high[6] = high[5];
  540. high[5] = high[4];
  541. high[4] = high[3];
  542. high[3] = high[2];
  543. high[2] = high[1];
  544. high[1] = high[0];
  545. high[0] = dif; // und setze den neuen Bestwert(dif) auf den Platz1
  546. if(name != NULL)fprintf(FDatei, ".%s's Zeit: %.2fs\n",name,high[0]); // wenn ein Name(in der Methode spielen) eingegeben wurde, so wird dieser nun mit dem neuen Bestwert im Format
  547. if(st1 != NULL)fprintf(FDatei, ".%s: %.2fs\n",st1,high[1]); // .Jemand's Zeit: 20.00s abgespeichert
  548. if(st2 != NULL)fprintf(FDatei, ".%s: %.2fs\n",st2,high[2]);
  549. if(st3 != NULL)fprintf(FDatei, ".%s: %.2fs\n",st3,high[3]); // nun alle anderen Werte in die Datei schreiben, solange diese ungleich Null sind. Wird der Wert Null erreicht, so
  550. if(st4 != NULL)fprintf(FDatei, ".%s: %.2fs\n",st4,high[4]); // werden alle restlichen Schreibvorgänge übersprungen, da keine weiteren Highscores bisher aufgestellt wurden
  551. if(st5 != NULL)fprintf(FDatei, ".%s: %.2fs\n",st5,high[5]);
  552. if(st6 != NULL)fprintf(FDatei, ".%s: %.2fs\n",st6,high[6]);
  553. if(st7 != NULL)fprintf(FDatei, ".%s: %.2fs\n",st7,high[7]);
  554. if(st8 != NULL)fprintf(FDatei, ".%s: %.2fs\n",st8,high[8]);
  555. if(st9 != NULL)fprintf(FDatei, ".%s: %.2fs",st9,high[9]);
  556. }
  557. else if(dif > high[0] && dif <= high[1])
  558. {
  559. high[9] = high[8];
  560. high[8] = high[7];
  561. high[7] = high[6];
  562. high[6] = high[5];
  563. high[5] = high[4];
  564. high[4] = high[3];
  565. high[3] = high[2];
  566. high[2] = high[1];
  567. high[1] = dif;
  568. if(st1 != NULL)fprintf(FDatei, ".%s: %.2fs\n",st1,high[0]); // Die folgenden Blöcke basieren auf dem selben Prinzip mit jedoch angepassten Bedingungen
  569. if(name != NULL)fprintf(FDatei, ".%s's Zeit: %.2fs\n",name,high[1]);
  570. if(st2 != NULL)fprintf(FDatei, ".%s: %.2fs\n",st2,high[2]);
  571. if(st3 != NULL)fprintf(FDatei, ".%s: %.2fs\n",st3,high[3]);
  572. if(st4 != NULL)fprintf(FDatei, ".%s: %.2fs\n",st4,high[4]);
  573. if(st5 != NULL)fprintf(FDatei, ".%s: %.2fs\n",st5,high[5]);
  574. if(st6 != NULL)fprintf(FDatei, ".%s: %.2fs\n",st6,high[6]);
  575. if(st7 != NULL)fprintf(FDatei, ".%s: %.2fs\n",st7,high[7]);
  576. if(st8 != NULL)fprintf(FDatei, ".%s: %.2fs\n",st8,high[8]);
  577. if(st9 != NULL)fprintf(FDatei, ".%s: %.2fs",st9,high[9]);
  578. }
  579. else if(dif > high[0] && dif > high[1] && dif <= high[2])
  580. {
  581. high[9] = high[8];
  582. high[8] = high[7];
  583. high[7] = high[6];
  584. high[6] = high[5];
  585. high[5] = high[4];
  586. high[4] = high[3];
  587. high[3] = high[2];
  588. high[2] = dif;
  589. if(st1 != NULL)fprintf(FDatei, ".%s: %.2fs\n",st1,high[0]);
  590. if(st2 != NULL)fprintf(FDatei, ".%s: %.2fs\n",st2,high[1]);
  591. if(name != NULL)fprintf(FDatei, ".%s's Zeit: %.2fs\n",name,high[2]);
  592. if(st3 != NULL)fprintf(FDatei, ".%s: %.2fs\n",st3,high[3]);
  593. if(st4 != NULL)fprintf(FDatei, ".%s: %.2fs\n",st4,high[4]);
  594. if(st5 != NULL)fprintf(FDatei, ".%s: %.2fs\n",st5,high[5]);
  595. if(st6 != NULL)fprintf(FDatei, ".%s: %.2fs\n",st6,high[6]);
  596. if(st7 != NULL)fprintf(FDatei, ".%s: %.2fs\n",st7,high[7]);
  597. if(st8 != NULL)fprintf(FDatei, ".%s: %.2fs\n",st8,high[8]);
  598. if(st9 != NULL)fprintf(FDatei, ".%s: %.2fs",st9,high[9]);
  599. }
  600. else if(dif > high[0] && dif >= high[1] && dif > high[2] && dif <= high[3])
  601. {
  602.  
  603. high[9] = high[8];
  604. high[8] = high[7];
  605. high[7] = high[6];
  606. high[6] = high[5];
  607. high[5] = high[4];
  608. high[4] = high[3];
  609. high[3] = dif;
  610. if(st1 != NULL)fprintf(FDatei, ".%s: %.2fs\n",st1,high[0]);
  611. if(st2 != NULL)fprintf(FDatei, ".%s: %.2fs\n",st2,high[1]);
  612. if(st3 != NULL)fprintf(FDatei, ".%s: %.2fs\n",st3,high[2]);
  613. if(name != NULL)fprintf(FDatei, ".%s's Zeit: %.2fs\n",name,high[3]);
  614. if(st4 != NULL)fprintf(FDatei, ".%s: %.2fs\n",st4,high[4]);
  615. if(st5 != NULL)fprintf(FDatei, ".%s: %.2fs\n",st5,high[5]);
  616. if(st6 != NULL)fprintf(FDatei, ".%s: %.2fs\n",st6,high[6]);
  617. if(st7 != NULL)fprintf(FDatei, ".%s: %.2fs\n",st7,high[7]);
  618. if(st8 != NULL)fprintf(FDatei, ".%s: %.2fs\n",st8,high[8]);
  619. if(st9 != NULL)fprintf(FDatei, ".%s: %.2fs",st9,high[9]);
  620. }
  621. else if(dif > high[3] && dif <= high[4])
  622. {
  623.  
  624. high[9] = high[8];
  625. high[8] = high[7];
  626. high[7] = high[6];
  627. high[6] = high[5];
  628. high[5] = high[4];
  629. high[4] = dif;
  630. if(st1 != NULL)fprintf(FDatei, ".%s: %.2fs\n",st1,high[0]);
  631. if(st2 != NULL)fprintf(FDatei, ".%s: %.2fs\n",st2,high[1]);
  632. if(st3 != NULL)fprintf(FDatei, ".%s: %.2fs\n",st3,high[2]);
  633. if(st4 != NULL)fprintf(FDatei, ".%s: %.2fs\n",st4,high[3]);
  634. if(name != NULL)fprintf(FDatei, ".%s's Zeit: %.2fs\n",name,high[4]);
  635. if(st5 != NULL)fprintf(FDatei, ".%s: %.2fs\n",st5,high[5]);
  636. if(st6 != NULL)fprintf(FDatei, ".%s: %.2fs\n",st6,high[6]);
  637. if(st7 != NULL)fprintf(FDatei, ".%s: %.2fs\n",st7,high[7]);
  638. if(st8 != NULL)fprintf(FDatei, ".%s: %.2fs\n",st8,high[8]);
  639. if(st9 != NULL)fprintf(FDatei, ".%s: %.2fs",st9,high[9]);
  640.  
  641. }
  642. else if(dif > high[4] && dif <= high[5])
  643. {
  644. high[9] = high[8];
  645. high[8] = high[7];
  646. high[7] = high[6];
  647. high[6] = high[5];
  648. high[5] = dif;
  649. if(st1 != NULL)fprintf(FDatei, ".%s: %.2fs\n",st1,high[0]);
  650. if(st2 != NULL)fprintf(FDatei, ".%s: %.2fs\n",st2,high[1]);
  651. if(st3 != NULL)fprintf(FDatei, ".%s: %.2fs\n",st3,high[2]);
  652. if(st4 != NULL)fprintf(FDatei, ".%s: %.2fs\n",st4,high[3]);
  653. if(st5 != NULL)fprintf(FDatei, ".%s: %.2fs\n",st5,high[4]);
  654. if(name != NULL)fprintf(FDatei, ".%s's Zeit: %.2fs\n",name,high[5]);
  655. if(st6 != NULL)fprintf(FDatei, ".%s: %.2fs\n",st6,high[6]);
  656. if(st7 != NULL)fprintf(FDatei, ".%s: %.2fs\n",st7,high[7]);
  657. if(st8 != NULL)fprintf(FDatei, ".%s: %.2fs\n",st8,high[8]);
  658. if(st9 != NULL)fprintf(FDatei, ".%s: %.2fs",st9,high[9]);
  659. }
  660. else if(dif > high[5] && dif <= high[6])
  661. {
  662. high[9] = high[8];
  663. high[8] = high[7];
  664. high[7] = high[6];
  665. high[6] = dif;
  666. if(st1 != NULL)fprintf(FDatei, ".%s: %.2fs\n",st1,high[0]);
  667. if(st2 != NULL)fprintf(FDatei, ".%s: %.2fs\n",st2,high[1]);
  668. if(st3 != NULL)fprintf(FDatei, ".%s: %.2fs\n",st3,high[2]);
  669. if(st4 != NULL)fprintf(FDatei, ".%s: %.2fs\n",st4,high[3]);
  670. if(st5 != NULL)fprintf(FDatei, ".%s: %.2fs\n",st5,high[4]);
  671. if(st6 != NULL)fprintf(FDatei, ".%s: %.2fs\n",st6,high[5]);
  672. if(name != NULL)fprintf(FDatei, ".%s's Zeit: %.2fs\n",name,high[6]);
  673. if(st7 != NULL)fprintf(FDatei, ".%s: %.2fs\n",st7,high[7]);
  674. if(st8 != NULL)fprintf(FDatei, ".%s: %.2fs\n",st8,high[8]);
  675. if(st9 != NULL)fprintf(FDatei, ".%s: %.2fs",st9,high[9]);
  676. }
  677. else if(dif > high[6] && dif <= high[7])
  678. {
  679. high[9] = high[8];
  680. high[8] = high[7];
  681. high[7] = dif;
  682. if(st1 != NULL)fprintf(FDatei, ".%s: %.2fs\n",st1,high[0]);
  683. if(st2 != NULL)fprintf(FDatei, ".%s: %.2fs\n",st2,high[1]);
  684. if(st3 != NULL)fprintf(FDatei, ".%s: %.2fs\n",st3,high[2]);
  685. if(st4 != NULL)fprintf(FDatei, ".%s: %.2fs\n",st4,high[3]);
  686. if(st5 != NULL)fprintf(FDatei, ".%s: %.2fs\n",st5,high[4]);
  687. if(st6 != NULL)fprintf(FDatei, ".%s: %.2fs\n",st6,high[5]);
  688. if(st7 != NULL)fprintf(FDatei, ".%s: %.2fs\n",st7,high[6]);
  689. if(name != NULL)fprintf(FDatei, ".%s's Zeit: %.2fs\n",name,high[7]);
  690. if(st8 != NULL)fprintf(FDatei, ".%s: %.2fs\n",st8,high[8]);
  691. if(st9 != NULL)fprintf(FDatei, ".%s: %.2fs",st9,high[9]);
  692. }
  693. else if(dif > high[7] && dif <= high[8])
  694. {
  695. high[9] = high[8];
  696. high[8] = dif;
  697. if(st1 != NULL)fprintf(FDatei, ".%s: %.2fs\n",st1,high[0]);
  698. if(st2 != NULL)fprintf(FDatei, ".%s: %.2fs\n",st2,high[1]);
  699. if(st3 != NULL)fprintf(FDatei, ".%s: %.2fs\n",st3,high[2]);
  700. if(st4 != NULL)fprintf(FDatei, ".%s: %.2fs\n",st4,high[3]);
  701. if(st5 != NULL)fprintf(FDatei, ".%s: %.2fs\n",st5,high[4]);
  702. if(st6 != NULL)fprintf(FDatei, ".%s: %.2fs\n",st6,high[5]);
  703. if(st7 != NULL)fprintf(FDatei, ".%s: %.2fs\n",st7,high[6]);
  704. if(st8 != NULL)fprintf(FDatei, ".%s: %.2fs\n",st8,high[7]);
  705. if(name != NULL)fprintf(FDatei, ".%s's Zeit: %.2fs\n",name,high[8]);
  706. if(st9 != NULL)fprintf(FDatei, ".%s: %.2fs",st9,high[9]);
  707. }
  708. else if(dif > high[8] && dif <= high[9])
  709. {
  710. high[9] = dif;
  711. if(st1 != NULL)fprintf(FDatei, ".%s: %.2fs\n",st1,high[0]);
  712. if(st2 != NULL)fprintf(FDatei, ".%s: %.2fs\n",st2,high[1]);
  713. if(st3 != NULL)fprintf(FDatei, ".%s: %.2fs\n",st3,high[2]);
  714. if(st4 != NULL)fprintf(FDatei, ".%s: %.2fs\n",st4,high[3]);
  715. if(st5 != NULL)fprintf(FDatei, ".%s: %.2fs\n",st5,high[4]);
  716. if(st6 != NULL)fprintf(FDatei, ".%s: %.2fs\n",st6,high[5]);
  717. if(st7 != NULL)fprintf(FDatei, ".%s: %.2fs\n",st7,high[6]);
  718. if(st8 != NULL)fprintf(FDatei, ".%s: %.2fs\n",st8,high[7]);
  719. if(st9 != NULL)fprintf(FDatei, ".%s: %.2fs\n",st9,high[8]);
  720. if(name != NULL)fprintf(FDatei, ".%s's Zeit: %.2fs",name,high[9]);
  721. }
  722. fclose(FDatei); // Datei schließen
  723. }
  724.  
  725. // Vorgehen nach Spielende abfragen
  726. void spielende()
  727. {
  728. system("cls");
  729. printf("------------------------------------\n");
  730. printf("| %s \t\t |\n|----------------------------------|", spielergebnis, dif); // Tabelle mit Spielergebnissen anzeigen
  731. printf("\n| Endstand: Du <%i> Computer <%i> |\n",yScore, cScore);
  732. printf("------------------------------------\n\n");
  733. printf("W\204hlen sie eine M\224glichkeit!\n\n");
  734. printf("<1> Zur\201ck zum Hauptmen\201\n"); // Menü nach Spielende darstellen
  735. printf("<2> Highscore anzeigen\n");
  736. COORD p;
  737. p.X = (int) (20);
  738. p.Y = (int) (1);
  739. SetConsoleCursorPosition(hOut, p);
  740. printf("Zeit: %.2fs", dif);
  741.  
  742. int auswahl = _getch();
  743.  
  744. if(auswahl == 49) // falls 1 gedrückt wird, zurück zum Hauptmenü
  745. {
  746. mainLoop = 0;
  747. return;
  748. }
  749. else if(auswahl == 50) // falls 2 gedrückt wird, highscoreAusgeben() Methode aufrufen
  750. {
  751. highscoreAusgeben();
  752. }
  753. else
  754. {
  755. printf("\n\nUng\201ltige Eingabe!\n\n");
  756. Sleep(2000); // falls eine Taste, die nicht zur Auswahl steht gedrückt wurde, Ungültige Eingabe anzeigen
  757. system("cls"); // und zurück zum Hautpmenü
  758. spielende();
  759. }
  760. }
  761.  
  762. // Spiel ausführen
  763. void spielen()
  764. {
  765.  
  766. setWindowSize(55,39); // Konsolenfenster auf passende Größe für das Spiel setzen
  767.  
  768. // Oberfläche zeichnen
  769. SetConsoleTextAttribute( hOut, 15 ); // Schriftfarbe auf weiß setzen
  770.  
  771. for (int i = 0; i < width - 1; ++i)
  772. {
  773. printf("-"); // obere Spielfeldbegrenzung zeichnen
  774. }
  775. for (int i = 0; i < height - 1; ++i)
  776. {
  777. printf("\n|"); // seitlich rechte Spielfeldbegrenzung zeichnen
  778.  
  779. for (int i = 0; i < width - 3; ++i)
  780. printf(" ");
  781. printf("|"); // linke seitliche Spielfeldbegrenzung zeichnen
  782. }
  783. printf("\n");
  784. for (int i = 0; i < width - 1; ++i)
  785. {
  786. printf("-"); // untere Spielfeldbegrenzung zeichnen
  787. }
  788. if(spielmodus == 0)printf("\n| Your score: 0 | Computer score: 0 ||| Speed: 0 |\n"); // Statistik unter der unteren Spielfeldbegrenzung zeichnen
  789. if(spielmodus == 1)printf("\n| Spi. 1 score: 0 | Spi. 2 score: 0 ||| Speed: 0 |\n");
  790.  
  791. for (int i = 0; i < width - 1; ++i)
  792. {
  793. printf("-"); // unter der Statistik noch eine Linie zeichnen
  794. }
  795. // Ende Oberfläche zeichnen
  796.  
  797. // Spieler und Ball erstellen
  798. spieler you, you2, comp; ball b; // Objekte Spieler, Spieler 2, Computer und Ball der Anfangs definierten struct erstellen
  799. spieler_(&you, width / 2, height - 2, 4); // Anfangswerte für Spieler an die spieler_() Methode übergeben
  800. spieler_(&you2, width / 2,2, 4); // Anfangswerte für Spieler2 an die spieler_() Methode übergeben
  801. spieler_(&comp, width / 2, 2, 4); // Anfangswerte für den Computer an die spieler_() Methode übergeben
  802. ball_(&b, width / 2 - 1, height / 2); // Anfangswerte für den Ball an die ball_() Methode übergeben
  803. b.vx = (float)(rand() % 3) - 1.5f; // Ball in zufällige Richtung zum Spieler schicken
  804. b.vy = 1;
  805. comp.vx = 0;
  806.  
  807. // Benötigte Variablen initialisieren
  808. int gestartet = 0; // gestartet auf "nein" setzen (0 = nein, 1 = ja)
  809. int you_score = 0, comp_score = 0, you2_score = 0; // Statistik (Punkte) auf Standard setzen
  810. const int delay = 50; // Konstanten Wert für die Spielverzögerung setzen
  811. float speed = 0.0f; // Statistik der Ballgeschwindigkeit auf Standart setzen
  812. char schwierigkeit1[20] = "Amateur";
  813. char schwierigkeit2[20] = "Machbar";
  814. char schwierigkeit3[20] = "Veteran"; // Strings zum Vergleich der Schwierigkeiten initialisieren
  815. char schwierigkeit4[20] = "Nervt\224tend";
  816.  
  817. time(&start); // Stoppuhr für Highscore starten
  818.  
  819. while (1)
  820. {
  821. if (gestartet == 1) // Spiel gestartet?
  822. {
  823.  
  824. if (GetAsyncKeyState(links)) // falls ja, fragen ob die Taste die in "links" gespeichert ist, gedrückt wurde
  825. {
  826. if(strcmp(schwierigkeit,schwierigkeit1) == 0) // falls ja, schwierigkeitsgrad vergleichen, um die passende Bewegungsgeschwindigkeit der Pads zu wählen
  827. {
  828. you.x -= 2,5;
  829. }
  830. else if(strcmp(schwierigkeit,schwierigkeit2) == 0) // dies für alle Schwierigkeitsgrade durchspielen
  831. {
  832. you.x -= 2;
  833. }
  834. else if(strcmp(schwierigkeit,schwierigkeit3) == 0)
  835. {
  836. you.x -= 2;
  837. }
  838. else if(strcmp(schwierigkeit,schwierigkeit4) == 0)
  839. {
  840. you.x -= 2,5;
  841. }
  842. }
  843. else if (GetAsyncKeyState(rechts)) // falls ja, fragen ob die Taste die in "rechts" gespeichert ist, gedrückt wurde
  844. {
  845. if(strcmp(schwierigkeit,schwierigkeit1) == 0) // falls ja, schwierigkeitsgrad vergleichen, um die passende Bewegungsgeschwindigkeit der Pads zu wählen
  846. {
  847. you.x += 2,5;
  848. }
  849. else if(strcmp(schwierigkeit,schwierigkeit2) == 0)
  850. {
  851. you.x += 2;
  852. }
  853. else if(strcmp(schwierigkeit,schwierigkeit3) == 0) // dies für alle Schwierigkeitsgrade durchspielen
  854. {
  855. you.x += 2;
  856. }
  857. else if(strcmp(schwierigkeit,schwierigkeit4) == 0)
  858. {
  859. you.x += 5;
  860. }
  861. }
  862. else if (GetAsyncKeyState(beenden)) // falls ja, fragen ob die Taste die in "beenden" gespeichert ist, gedrückt wurde
  863. {
  864. COORD p;
  865. p.X = (int) (width / 2 - 16);
  866. p.Y = (int) (height / 1.8f);
  867. SetConsoleCursorPosition(hOut, p);
  868. printf("Spiel wirklich beenden?");
  869. p.X = (int) (width / 2 - 16);
  870. p.Y = (int) (height / 1.6f);
  871. SetConsoleCursorPosition(hOut, p); // Abfrage, ob Spiel fortsetzen oder Beenden
  872. printf("<1> Weiterspielen\n"); // wird druch das drücken der q Taste
  873. p.X = (int) (width / 2 - 16); // in die Konsole geschrieben
  874. p.Y = (int) (height / 1.55f);
  875. SetConsoleCursorPosition(hOut, p);
  876. printf("<2> Spiel beenden\n\n");
  877. p.X = (int) (width / 2 - 17);
  878. p.Y = (int) (height / 1.35f);
  879. SetConsoleCursorPosition(hOut, p);
  880. char c;
  881. while ((c = _getch()) != EOF && c != 'q'); // Puffer automatisch im Hintergrund leeren (Zeiger im Puffer bis zum ersten Auftreten eines "q" verschieben)
  882. int auswahl = _getch(); // einlesen, ob fortsetzen oder beenden ausgewählt wurde und solange Spiel anhalten, bis Eingabe getätigt wurde
  883.  
  884. if(auswahl == 49) // falls fortsetzen ausgewählt ->
  885. {
  886. p.X = (int) (width / 2 - 16);
  887. p.Y = (int) (height / 1.8f);
  888. SetConsoleCursorPosition(hOut, p);
  889. printf(" ");
  890. p.X = (int) (width / 2 - 16);
  891. p.Y = (int) (height / 1.6f);
  892. SetConsoleCursorPosition(hOut, p); // -> zu passenden Positionen springen und den Dialog wieder entfernen -> Spiel wird fortgesetzt
  893. printf(" ");
  894. p.X = (int) (width / 2 - 16);
  895. p.Y = (int) (height / 1.55f);
  896. SetConsoleCursorPosition(hOut, p);
  897. printf(" ");
  898. }
  899. else // falls beenden ausgewählt, aus der Spielschleife springen
  900. {
  901. time(&endet); // Stoppuhr stoppen um verfälschung der Zeit zu umgehen
  902. break;
  903. }
  904. }
  905. if (GetAsyncKeyState(links2)) // falls Spielmodus = Mensch vs Mensch, ist das gegnerische Pad bewegbar. Abfrage ob Taste die in "links2"
  906. { // gespeichert ist gedrückt wurde
  907. if(strcmp(schwierigkeit,schwierigkeit1) == 0)
  908. {
  909. you2.x -= 2,5;
  910. }
  911. else if(strcmp(schwierigkeit,schwierigkeit2) == 0) // falls ja, schwierigkeitsgrad vergleichen, um die passende Bewegungsgeschwindigkeit der Pads zu wählen
  912. {
  913. you2.x -= 2;
  914. }
  915. else if(strcmp(schwierigkeit,schwierigkeit3) == 0) // dies für alle Schwierigkeitsgrade durchspielen
  916. {
  917. you2.x -= 2;
  918. }
  919. else if(strcmp(schwierigkeit,schwierigkeit4) == 0)
  920. {
  921. you2.x -= 2,5;
  922. }
  923. }
  924. else if (GetAsyncKeyState(rechts2)) // fragen ob die Taste die in "rechts2" gespeichert ist, gedrückt wurde (Mensch vs Mensch)
  925. {
  926. if(strcmp(schwierigkeit,schwierigkeit1) == 0) // falls ja, schwierigkeitsgrad vergleichen, um die passende Bewegungsgeschwindigkeit der Pads zu wählen
  927. {
  928. you2.x += 2,5;
  929. }
  930. else if(strcmp(schwierigkeit,schwierigkeit2) == 0)
  931. {
  932. you2.x += 2;
  933. }
  934. else if(strcmp(schwierigkeit,schwierigkeit3) == 0) // dies für alle Schwierigkeitsgrade durchspielen
  935. {
  936. you2.x += 2;
  937. }
  938. else if(strcmp(schwierigkeit,schwierigkeit4) == 0)
  939. {
  940. you2.x += 5;
  941. }
  942. }
  943.  
  944. // Ballgeschwindigkeit für Statistik berechnen
  945. float x = pow(b.vx, 2); // y - Geschwindigkeit des Balles quadrieren
  946. float y = pow(b.vy, 2); // x - Geschwindikeit des Balles quadrieren (Satz des Pythagoras)
  947. speed = x + y; // beide Werte addieren
  948. speed = sqrt(speed); // Wurzel aus dem neuen in "speed" gespeicherten Wert ziehen
  949. COORD p;
  950. p.X = (int) (47); // Koordinaten für die Geschwindigkeitsanzeige des Balls rechts unten in der Konsole setzen
  951. p.Y = (int) (37);
  952. SetConsoleCursorPosition(hOut, p); // Cursor dorthin bewegen
  953. printf("%.2f", speed); // Aktuelle Ballgeschwindigkeit (in speed gespeichert) dort mit zwei Nachkommastellen ausgeben
  954.  
  955.  
  956. // KI zum Ball führen
  957. if(spielmodus == 0) // falls Spielmodus = Mensch vs Computer
  958. {
  959. comp.vx -= (float) (comp.x - b.x) / kiReaktion; // Computer x - Position - Ball x - Position, um zu errechnen, wo der Computer sich hinbewegen muss geteilt durch einen Modifikator,
  960. comp.vx *= 0.83f; // der die KI als weitere Schwierigkeit langsamer oder schneller reagieren lassen kann ||| Computer x - Geschwindigkeit reduzieren
  961. }
  962.  
  963. // KI Geschwindigeit in Abhängigkeit der Ballgeschwindigkeit anpassen
  964. comp.x += comp.vx;
  965.  
  966. // Bewegungsgrenzen setzen Spieler 1
  967. if (you.x < you.size + 1) // falls Spieler1 x-Position kleiner als Padgröße + 1 (linke Außenseite erreicht)
  968. {
  969. you.x = (float) (you.size + 1); // dann Spieler auf dieser x - Position halten und nicht überqueren lassen (linke Seite)
  970. }
  971. else if (you.x > width - you.size - 2 - modifikator) // falls Spieler1 x - Position größer als Konsolenbreite - Padgröße - 2(wegen Spielbegrenzungen) - modifikator, der die
  972. { // Padgröße den Grenzen anpasst
  973. you.x = (float) (width - you.size - 2 - modifikator); // dann Spieler auf dieser x - Position halten und nicht überqueren lassen (rechte Seite)
  974. }
  975.  
  976. // Bewegungsgrenzen setzen Spieler 2
  977. if (you2.x < you2.size + 1) // falls Spieler1 x-Position kleiner als Padgröße + 1 (linke Außenseite erreicht)
  978. {
  979. you2.x = (float) (you2.size + 1); // dann Spieler2 auf dieser x - Position halten und nicht überqueren lassen (linke Seite)
  980. }
  981. else if (you2.x > width - you2.size - 2 - modifikator) // falls Spieler2 x - Position größer als Konsolenbreite - Padgröße - 2(wegen Spielbegrenzungen) - modifikator, der die
  982. { // Padgröße den Grenzen anpasst
  983. you2.x = (float) (width - you2.size - 2 - modifikator); // dann Spieler2 auf dieser x - Position halten und nicht überqueren lassen (rechte Seite)
  984. }
  985.  
  986. // KI Bewegungsgrenze setzen
  987. if (comp.x < comp.size + 1) // falls Spieler1 x-Position kleiner als Padgröße + 1 (linke Außenseite erreicht)
  988. {
  989. comp.x = (float) (comp.size + 1); // dann Computer auf dieser x - Position halten und nicht überqueren lassen (linke Seite)
  990. }
  991. else if (comp.x > width - comp.size - 2 - modifikator) // falls Computer x - Position größer als Konsolenbreite - Padgröße - 2(wegen Spielbegrenzungen) - modifikator, der die
  992. { // Padgröße den Grenzen anpasst
  993. comp.x = (float) (width - comp.size - 2 - modifikator); // dann Computer auf dieser x - Position halten und nicht überqueren lassen (rechte Seite)
  994. }
  995.  
  996. // Ball Höchstgeschwindigkeit einhalten
  997. if (b.vx < -maxSpeed) // falls Ball x - Geschwindigkeit in diesem Fall "unter" der maximal erlaubten Geschwindigkeit liegt
  998. {
  999. b.vx = -maxSpeed; // Ball x - Geschwindigkeit wieder auf "minimal" erlaubten Wert zurücksetzen
  1000. }
  1001. else if (b.vx > maxSpeed) // falls Ball x - Geschwindigkeit über der maximal erlaubten Geschwindigkeit liegt
  1002. {
  1003. b.vx = maxSpeed; // Ball x - Geschwindigkeit wieder auf maximal erlaubten Wert zurücksetzen
  1004. }
  1005.  
  1006. // Dem Ball an der aktuellen Position Geschwindigkeit zuführen
  1007. b.x += b.vx; // die aktuelle x - Position des Balles um den aktuellen Wert der x - Ballgeschwindigkeit verschieben
  1008. b.y += b.vy; // die aktuelle y - Position des Balles um den aktuellen Wert der y - Ballgeschwindigkeit verschieben
  1009.  
  1010. // Hat der Ball den Spieler getroffen?
  1011. if (b.y >= you.y - 1 && b.y <= you.y + 1) // ist die y - Position des Balls 1 über dem Pad und ist die y - Position des Balls nicht 1 unter dem Pad (da sonst Punkt geben würde)
  1012. {
  1013. if (b.x > you.x - you.size && b.x < you.x + you.size) // ist die x - Position des Balls kleiner bzw. größer als die x - Position des Pads - und + die Padgröße, ist das Pad getroffen
  1014. {
  1015. b.vy *= -1; // Ball y-Richtung umkehren
  1016. b.vx += (float)(b.x - you.x) / 3; // Ball x - Geschwindigkeit bei auftreffen auf das Pad - die Pad x - Position rechnen, um eine resultierende Richtung zu erhalten
  1017. b.y = you.y - 1; // Ball auf Position direkt über dem Pad setzen, um ein hindurchfallen durch das Pad zu verhindern
  1018. }
  1019. }
  1020.  
  1021. // Hat der Ball den Spieler2 getroffen?
  1022. if (b.y <= you2.y + 1 && b.y >= you2.y - 1) // ist die y - Position des Balls 1 unter dem Pad und ist die y - Position des Balls nicht 1 über dem Pad (da sonst Punkt geben würde)
  1023. {
  1024. if (b.x > you2.x - you2.size && b.x < you2.x + you2.size) // ist die x - Position des Balls kleiner bzw. größer als die x - Position des Pads - und + die Padgröße, ist das Pad getroffen
  1025. {
  1026. b.vy *= -1; // Ball y-Richtung umkehren
  1027. b.vx += (float)(b.x - you2.x) / 3; // Ball x - Geschwindigkeit bei auftreffen auf das Pad - die Pad x - Position rechnen, um eine resultierende Richtung zu erhalten
  1028. b.y = you2.y + 1; // Ball auf Position direkt unter dem Pad setzen, um ein hindurchfallen durch das Pad zu verhindern
  1029. }
  1030. }
  1031.  
  1032. // Hat der Ball die KI getroffen?
  1033. if (b.y <= comp.y + 1 && b.y >= comp.y - 1) // ist die y - Position des Balls 1 unter dem Pad und ist die y - Position des Balls nicht 1 über dem Pad (da sonst Punkt geben würde)
  1034. {
  1035. if (b.x > comp.x - comp.size && b.x < comp.x + comp.size) // ist die x - Position des Balls kleiner bzw. größer als die x - Position des Pads - und + die Padgröße, ist das Pad getroffen
  1036. {
  1037. b.vy *= -1; // Ball y-Richtung umkehren
  1038. b.vx += (float)(b.x - comp.x) / 3; // Ball x - Geschwindigkeit bei auftreffen auf das Pad - die Pad x - Position rechnen, um eine resultierende Richtung zu erhalten
  1039. b.y = comp.y + 1; // Ball auf Position direkt unter dem Pad setzen, um ein hindurchfallen durch das Pad zu verhindern
  1040. }
  1041. }
  1042.  
  1043. // Hat der Ball die Grenzen überschritten?(Punkt bekommen)
  1044. if (b.y >= height && spielmodus == 0) // falls y-Wert 55 vom Ball überschritten und Spielmodus = Mensch vs Computer
  1045. {
  1046. gestartet = 0; // Spiel gestartet? auf "nein" setzen, um auf Leertaste gedrückt? zu warten
  1047. comp_score++; // Computer score um 1 erhöhen
  1048. cScore = comp_score; // Computer score in glabaer Variable cScore für weitere Verarbeitung speichern
  1049. reset(&you, &you2, &comp, &b, you_score, you2_score, comp_score );
  1050. }
  1051. else if (b.y >= height && spielmodus == 1) // falls y-Wert 55 vom Ball überschritten und Spielmodus = Mensch vs Mensch
  1052. {
  1053. gestartet = 0; // Spiel gestartet? auf "nein" setzen, um auf Leertaste gedrückt? zu warten
  1054. you2_score++; // Spieler 2 score um 1 erhöhen
  1055. y2Score = you2_score; // Spieler 2 score in glabaer Variable y2Score für weitere Verarbeitung speichern
  1056. reset(&you, &you2, &comp, &b, you_score, you2_score, comp_score );
  1057. }
  1058. else if (b.y <= 0) // falls y-Wert 0 vom Ball überschritten
  1059. {
  1060. gestartet = 0; // Spiel gestartet? auf "nein" setzen, um auf Leertaste gedrückt? zu warten
  1061. you_score++; // Spieler 1 score um 1 erhöhen
  1062. yScore = you_score; // Spieler 1 score in glabaer Variable yScore für weitere Verarbeitung speichern
  1063. reset(&you, &you2, &comp, &b, you_score, you2_score, comp_score );
  1064. }
  1065. if (b.x <= 1) // falls der Ball die linke Außenwand trifft
  1066. {
  1067. b.vx *= -1; // x - Richtung/Geschwindigkeit des Ball invertieren
  1068. b.x = 1.0f; // x - Position des Balls zurück auf 1 setzen, damit er nicht die Grenzen überquert
  1069. }
  1070. else if (b.x >= width - 3) // falls der Ball die rechte Außenwand trifft
  1071. {
  1072. b.vx *= -1; // x - Richtung/Geschwindigkeit des Ball invertieren
  1073. b.x = (float)(width - 3); // x - Position des Balls zurück auf die Konsolenbreite - 3 setzen, damit er nicht die Grenzen überquert
  1074. }
  1075. }
  1076. else if(you_score == siegPunkte || you2_score == siegPunkte)
  1077. {
  1078. dif = 1000;
  1079. system("cls"); // Konsole leeren
  1080. time(&endet); // Stoppuhr stoppen
  1081. dif = difftime(endet,start); // Highscore Zeit berechnen (ende - anfang)
  1082. strcpy(spielergebnis, ""); // spielergebnis string leeren
  1083. strcat(spielergebnis, "Gewonnen!!!"); // Endergebnis speichern für spätere Ausgabe
  1084. printf("\n\n\n\n\n\n\n\n\t\t Gewonnen!!! :)"); // Siegmeldung ausgeben
  1085. printf("\n\n\n\n ...um fortzufahren bitte Enter dr\201cken...");
  1086. char c;
  1087. while ((c = _getch()) != EOF && c != 13); // Puffer automatisch im Hintergrund leeren
  1088. system("cls");
  1089.  
  1090. //-------------------------------------------------------- Namen einlesen -------------------------------------------------------------------------------------------
  1091.  
  1092. printf("Bitte geben sie ihren Namen ein: "); // Benutzer zur Namenseingabe aufforden und diesen in "name" abspeichern
  1093. scanf("%s", name);
  1094.  
  1095. //-------------------------------------------------------- Highscores einlesen --------------------------------------------------------------------------------------
  1096.  
  1097. FILE *FDatei; // Zeiger auf eine Datei erstellen
  1098.  
  1099. FDatei = fopen(pfad, "r"); // Zeiger auf die Datei, die in "pfad" angegeben ist und diese zum lesen öffnen
  1100. if(!FDatei) // falls die Datei noch nicht existiert ->
  1101. {
  1102. FDatei = fopen(pfad, "w"); // -> diese erstellen
  1103. fclose(FDatei); // Datei schließen
  1104. }
  1105. highscoreEinlesen(); // in die Methode highscoreEinlesen() springen, um den neuen Highscore abzuspeichern
  1106. mainLoop = 1; // über main Funktion zu spielende() springen
  1107. break;
  1108. }
  1109. else if(comp_score == siegPunkte)
  1110. {
  1111. system("cls"); // Konsole leeren
  1112. time(&endet); // Stoppuhr stoppen
  1113. dif = difftime(endet,start); // Highscore Zeit berechnen (ende - anfang)
  1114. strcpy(spielergebnis, ""); // spielergebnis string leeren
  1115. strcat(spielergebnis, "Verloren!!!"); // Endergebnis speichern für spätere Ausgabe
  1116. printf("\n\n\n\n\n\n\n\n\t\t Verloren!!! :("); // Niederlage Meldung ausgeben
  1117. printf("\n\n\n\n ...um fortzufahren bitte Enter dr\201cken...");
  1118. char c;
  1119. while ((c = _getch()) != EOF && c != 13); // Puffer automatisch im Hintergrund leeren und warten bis Enter gedrückt wurde
  1120. mainLoop = 1; // über main Funktion zu spielende() springen
  1121. break;
  1122. }
  1123. else
  1124. {
  1125. // Startbedingungüberprüfen (Leertaste gedrückt? bzw. Spiel gestartet?)
  1126. COORD p;
  1127. p.X = (int) (width / 2 - 16);
  1128. p.Y = (int) (height / 1.5f);
  1129. SetConsoleCursorPosition(hOut, p);
  1130. printf("Press the space bar to start..."); // Cursor in die Mitte des Bildschirms setzen und jene Meldung zeigen
  1131.  
  1132. if (GetAsyncKeyState(VK_SPACE)) // Leertaste gedrückt?
  1133. {
  1134. COORD p;
  1135. p.X = (int) (width / 2 - 16);
  1136. p.Y = (int) (height / 1.5f);
  1137. SetConsoleCursorPosition(hOut, p); // falls ja, entferne Meldung wieder
  1138. printf(" ");
  1139. gestartet = 1; // Status auf Spiel "gestartet" setzen, um in anderen Verlauf der while Schleife zu gelangen
  1140. }
  1141. }
  1142.  
  1143. // Alles zeichnen
  1144. draw(&you); // Spieler 1 mit aktuellen Werten zeichnen
  1145. if(spielmodus == 1)draw(&you2); // falls Spielmodus = Mensch vs Mensch, Spieler 2 mit aktuellen Werten zeichnen
  1146. if(spielmodus == 0)draw(&comp); // falls Spielmodus = Mensch vs Computer, Computer mit aktuellen Werten zeichnen
  1147. drawball(&b); // Ball mit aktuellen Werten zeichnen
  1148.  
  1149. // Verzögern
  1150. Sleep(delay); // nach jedem Durchgang 50ms warten, um übermäßiges flackern zu verhindern und das Spiel in einer benutzerfreundlichen
  1151. } // Geschwindigkeit ablaufen zu lassen
  1152. }
  1153.  
  1154. // Konfiguration der Tastenbelegung
  1155. void steuerung()
  1156. {
  1157. system("cls");
  1158. printf("===========================================================================\n");
  1159. printf("== Bitte w\204hlen sie die Taste die sie ver\204ndern m\224chten und dr\201cken sie ==\n");
  1160. printf("== anschlie\341end die Taste die sie zuweisen wollen! ==\n"); // Menü darstellen
  1161. printf("===========================================================================\n\n");
  1162.  
  1163. printf("Beachte: Kleinbuchstaben m\201ssen als Gro\341buchstaben angegeben werden!\n");
  1164. printf("\t Die Tasten von Spieler 2 k\224nnen nicht ver\204ndert werden!\n\n\n");
  1165.  
  1166. printf("Spieler 1:\n",links);
  1167. printf("----------\n",links);
  1168. printf("<1> Links\t\t\tAktuelle Taste: %c\n",links);
  1169. printf("<2> Rechts\t\t\tAktuelle Taste: %c\n",rechts); // aktuelle Tastenbelegung für Spieler1 anzeigen
  1170. printf ("<3> Beenden\t\t\tAktuelle Taste: %c\n\n",beenden);
  1171.  
  1172. printf("Spieler 2:\n",links);
  1173. printf("----------\n",links);
  1174. printf("--> Links\t\t\tAktuelle Taste: Pfeiltaste links\n");
  1175. printf("--> Rechts\t\t\tAktuelle Taste: Pfeiltaste rechts\n\n\n"); // aktuelle Tastenbelegung für Spieler2 anzeigen
  1176.  
  1177. printf("<4> Zur\201ck zum Hauptmen\201");
  1178.  
  1179. int auswahl = _getch(); // Menüauswahl einlesen und in "auswahl" speichern
  1180.  
  1181. if(auswahl == 49) // falls 1 gedrückt...
  1182. {
  1183. links = _getch();
  1184. system("cls"); // dann auf erneute Eingabe warten und diesen als neuen Wert für die Taste links setzen
  1185. steuerung(); // Konsole leeren und steuerung() erneut aufrufen, um das Menü zu aktualisieren
  1186. }
  1187. else if(auswahl == 50) // falls 2 gedrückt...
  1188. {
  1189. rechts = _getch(); // dann auf erneute Eingabe warten und diesen als neuen Wert für die Taste rechts setzen
  1190. system("cls"); // Konsole leeren und steuerung() erneut aufrufen, um das Menü zu aktualisieren
  1191. steuerung();
  1192. }
  1193. else if(auswahl == 51) // falls 3 gedrückt...
  1194. {
  1195. beenden = _getch(); // dann auf erneute Eingabe warten und diesen als neuen Wert für die Taste beenden setzen
  1196. system("cls"); // Konsole leeren und steuerung() erneut aufrufen, um das Menü zu aktualisieren
  1197. steuerung();
  1198. }
  1199. else if(auswahl == 52) // falls 4 gedrückt...
  1200. {
  1201. system("cls"); // ...zurück zum Hauptmenü
  1202. return;
  1203. }
  1204. else
  1205. {
  1206. printf("\n\nUng\201ltige Eingabe!\n\n");
  1207. Sleep(2000); // falls eine Taste, die nicht zur Auswahl steht gedrückt wurde, Ungültige Eingabe anzeigen
  1208. system("cls"); // und zurück zum Hautpmenü
  1209. steuerung();
  1210. }
  1211. }
  1212.  
  1213. // Schwierigkeitsgrad, Ballgeschwindigkeit
  1214. // einstellen, alles zurücksetzen
  1215. void einstellungen()
  1216. {
  1217. system("cls");
  1218. printf("Bitte w\204hlen sie eine Einstellung die sie ver\204ndern m\224chten!\n\n");
  1219. printf("<1> Spielmodus / Spieleranzahl\t\tAktueller Modus: %s\n",modus);
  1220. printf("<2> Schwieriegkeitsgrad \204ndern\t\tAktuelle Schwierigkeit: %s\n",schwierigkeit); // Menü mit aktuellen Einstellungen anzeigen
  1221. printf("<3> Maximale Ballgeschwindigkeit\tAktuelle Geschwindigkeit: %.2f\n",maxSpeed);
  1222. printf("<4> Anzahl der Punkte bis zum Sieg\tAktuelle Siegpunkte: %i\n",siegPunkte);
  1223. printf("<5> Alle Einstellungen zur\201cksetzen\n");
  1224. printf("<6> Highscore zur\201cksetzten\n");
  1225. printf("<7> Zur\201ck zum Hauptmen\201\n\n");
  1226.  
  1227. int auswahl = _getch(); // Menüauswahl einlesen und in "auswahl" speichern
  1228.  
  1229. if(auswahl == 49) // Eingabe auswerten (falls 1 gedrückt)
  1230. {
  1231. system("cls");
  1232. printf("W\204hlen sie ihren bevorzugten Spielmodus!\n\n");
  1233. printf("<1> Mensch vs Computer\n"); // dann Spielmodus Menü darstellen
  1234. printf("<2> Mensch vs Mensch\n");
  1235.  
  1236. char zwischensp[60]; // char array, um pfad für Highscore.txt während Mehrspieler zwischenzuspeichern
  1237. int auswahl = _getch(); // Menüauswahl einlesen und in "auswahl" speichern
  1238. strcpy(modus, ""); // char array "modus" leeren
  1239.  
  1240. if(auswahl == 49)
  1241. {
  1242. spielmodus = 0;
  1243. strcat(modus, "Mensch vs Computer"); // Anzeige im Einstellungsmenü aktualisieren (alter String wird gelöscht und neuer angehängt)
  1244. strcpy(pfad, zwischensp); // Pfad für Highscoredatei aktualisieren
  1245. return; // zwischengespeicherten Pfad (in "zwischensp") wieder in "pfad" kopieren
  1246. }
  1247. else if(auswahl == 50)
  1248. {
  1249. strcpy(zwischensp,pfad);
  1250. spielmodus = 1;
  1251. strcat(modus, "Mensch vs Mensch"); // Anzeige im Einstellungsmenü aktualisieren (alter String wird gelöscht und neuer angehängt)
  1252. strcpy(pfad, "C:\\Mehrspieler.txt"); // Pfad für Highscoredatei aktualisieren
  1253. return;
  1254. }
  1255. }
  1256. else if(auswahl == 50) // Eingabe auswerten
  1257. {
  1258. system("cls");
  1259. printf("W\204hlen sie ihren bevorzugten Schwierigkeitsgrad!\n\n");
  1260. printf("<1> Amateur\n"); // Schwierigkeitsgrad Menü öffnen
  1261. printf("<2> Machbar\n");
  1262. printf("<3> Veteran\n");
  1263. printf("<4> Nervt\224tend\n");
  1264.  
  1265. int auswahl = _getch(); // Menüauswahl einlesen
  1266. strcpy(schwierigkeit, "");
  1267.  
  1268. if(auswahl == 49) // falls 1 gedrückt dann...
  1269. {
  1270. modifikator = 0;
  1271. modifikator += 2; // Padlänge anpassen
  1272. maxSpeed = 1.8f; // Ballgeschwindigkeit je nach Auswahl anpassen
  1273. strcat(schwierigkeit, "Amateur"); // Schwierigkeitsgradanzeige im Einstellungsmenü aktualisieren
  1274. strcpy(pfad, "C:\\Amateur.txt"); // Pfad für Highscoredatei aktualisieren
  1275. kiReaktion = 10.0f; // Computer Schnelligkeit setzen
  1276. return; // (alter String wird gelöscht und neuer angehängt)
  1277. }
  1278. else if(auswahl == 50)
  1279. {
  1280. modifikator = 0;
  1281. strcat(schwierigkeit, "Machbar"); // das selbe für alle andern Schwierigkeitsgrade
  1282. strcpy(pfad, "C:\\Machbar.txt");
  1283. kiReaktion = 8.0f;
  1284. maxSpeed = 3.2f;
  1285. return;
  1286. }
  1287. else if(auswahl == 51)
  1288. {
  1289. modifikator = 0;
  1290. modifikator -= 2;
  1291. strcat(schwierigkeit, "Veteran");
  1292. strcpy(pfad, "C:\\Veteran.txt");
  1293. kiReaktion = 6.0f;
  1294. maxSpeed = 4.5f;
  1295. return;
  1296. }
  1297. else if(auswahl == 52)
  1298. {
  1299. modifikator = 0;
  1300. modifikator -= 4;
  1301. strcat(schwierigkeit, "Nervt\224tend");
  1302. strcpy(pfad, "C:\\Nervt\224tend.txt");
  1303. kiReaktion = 3.7f;
  1304. maxSpeed = 6.0f;
  1305. return;
  1306. }
  1307. else
  1308. {
  1309. printf("\n\nUng\201ltige Eingabe!\n\n"); // falls eine Taste, die nicht zur Auswahl steht gedrückt wurde, Ungültige Eingabe anzeigen
  1310. Sleep(2000); // und zurück zum Hautpmenü
  1311. return;
  1312. }
  1313. }
  1314. else if(auswahl == 51)
  1315. {
  1316. printf("Neue Ballgeschwindigkeit eingeben!\n\n"); // Abfrage nach neuer Ballgeschwindigkeit
  1317. scanf("%f",&maxSpeed);
  1318.  
  1319. if(maxSpeed != 1.8f && maxSpeed != 2.8f && maxSpeed != 3.5f && maxSpeed != 5) // Falls Ballgeschwindigkeit ungleich den Voreinstellungen, so
  1320. {
  1321. strcpy(schwierigkeit,""); // wird die Schwierigkeitsanzeige auf "Persönlich" gesetzt
  1322. strcat(schwierigkeit, "Pers\224nlich");
  1323. system("cls");
  1324. }
  1325. einstellungen(); // zurück zum Einstellungsmenü
  1326. }
  1327. else if(auswahl == 52)
  1328. {
  1329. printf("Neue Anzahl der ben\224tigten Siegpunkte eingeben!\n\n"); // Abfrage nach neuer Ballgeschwindigkeit
  1330. scanf("%i",&siegPunkte);
  1331. system("cls");
  1332. return;
  1333. }
  1334. else if(auswahl == 53)
  1335. {
  1336. system("cls");
  1337. printf("Sind sie sich sicher, dass sie alle Einstellungen zur\201cksetzen m\224chten?\n\n"); // Fragen, ob der Benutzer sicher ist, dass er die Einstellungen zurücksetzen möchte
  1338. printf("<1> Ja, alle l\224schen\n");
  1339. printf("<2> Nein, zur\201ck zu Einstellungen");
  1340.  
  1341. int auswahl = _getch(); // Benutzereingabe einlesen
  1342.  
  1343. if(auswahl == 49)
  1344. {
  1345. system("cls");
  1346. strcpy(schwierigkeit,"");
  1347. strcat(schwierigkeit, "Machbar"); // Alle Werte auf Standard setzen
  1348. maxSpeed = 3.2f;
  1349. links = 65, rechts = 68, beenden = 81;
  1350. printf("\n Einstellungen erfolgreich zur\201ckgesetzt!");
  1351. Sleep(2500);
  1352. system("cls");
  1353. return;
  1354. }
  1355. else if(auswahl == 50)
  1356. {
  1357. einstellungen(); // falls nein, zurück zum Einstellungsmenü
  1358. }
  1359. else
  1360. {
  1361. printf("\n\nUng\201ltige Eingabe!\n\n");
  1362. Sleep(2000); // falls eine Taste, die nicht zur Auswahl stand gedrückt wurde, Ungültige Eingabe anzeigen
  1363. system("cls"); // und zurück zum Hautpmenü
  1364. einstellungen();
  1365. }
  1366. }
  1367. else if(auswahl == 54)
  1368. {
  1369. system("cls");
  1370. printf("Sind sie sich sicher, dass sie alle Highscores l\224schen m\224chten?\n\n"); // Fragen, ob der Benutzer sicher ist, dass er die Highscores löschen möchte
  1371. printf("<1> Ja, alle l\224schen\n");
  1372. printf("<2> Nein, zur\201ck zu Einstellungen");
  1373.  
  1374. int auswahl = _getch(); // Benutzereingabe einlesen
  1375.  
  1376. if(auswahl == 49)
  1377. {
  1378. FILE *FDatei;
  1379. FDatei = fopen("C:\\Amateur","w"); // Alte Highscore Textdatei löschen und neue leere Datei erstellen
  1380. fclose(FDatei);
  1381. FDatei = fopen("C:\\Machbar.txt","w"); // Alte Highscore Textdatei löschen und neue leere Datei erstellen
  1382. fclose(FDatei);
  1383. FDatei = fopen("C:\\Veteran.txt","w"); // Alte Highscore Textdatei löschen und neue leere Datei erstellen
  1384. fclose(FDatei);
  1385. FDatei = fopen("C:\\Nervt\224tend.txt","w"); // Alte Highscore Textdatei löschen und neue leere Datei erstellen
  1386. fclose(FDatei);
  1387. FDatei = fopen("C:\\Mehrspieler.txt","w"); // Alte Highscore Textdatei löschen und neue leere Datei erstellen
  1388. fclose(FDatei);
  1389. system("cls");
  1390. printf("Highscores erfolgreich zur\201ckgesetzt!");
  1391. Sleep(2000); // "Erfolgreich" Meldung ausgeben und 2 sekunden warten
  1392. return;
  1393. }
  1394. else if(auswahl == 50)
  1395. {
  1396. einstellungen(); // ansonsten zurück in das Einstellungsmenü
  1397. }
  1398. else
  1399. {
  1400. printf("\n\nUng\201ltige Eingabe!\n\n");
  1401. Sleep(2000); // falls eine Taste, die nicht zur Auswahl steht gedrückt wurde, Ungültige Eingabe anzeigen
  1402. system("cls"); // und zurück zum Hautpmenü
  1403. einstellungen();
  1404. }
  1405. }
  1406. else if(auswahl == 55) // falls im Einstellungenmenü 7 gedrückt wurde dann...
  1407. {
  1408. system("cls"); // ...zurück zum Hauptmenü
  1409. return;
  1410. }
  1411. else
  1412. {
  1413. printf("\n\nUng\201ltige Eingabe!\n\n");
  1414. Sleep(2000); // falls eine Taste, die nicht zur Auswahl steht gedrückt wurde, Ungültige Eingabe anzeigen
  1415. system("cls"); // und zurück zum Hautpmenü
  1416. einstellungen();
  1417. }
  1418.  
  1419.  
  1420.  
  1421. }
  1422.  
  1423. // Hauptmenü anzeigen und Auswahl auswerten
  1424. void menu()
  1425. {
  1426.  
  1427. setWindowSize(80,25); // setWindowSize() Methode aufrufen, um die Standartgröße der Konsole (80,25) nach dem Spiel wiederherzustellen
  1428.  
  1429. system("cls"); // Konsole leeren
  1430. printf("W\204hlen sie eine M\224glichkeit!\n\n");
  1431. printf("<1> Pong spielen\n");
  1432. printf("<2> Steuerung\n"); // Menü darstellen
  1433. printf("<3> Highscore\n");
  1434. printf("<4> Einstellungen\n");
  1435. printf("<5> Spiel beenden\n\n");
  1436. int auswahl = _getch();
  1437. // Auf Benutzereingabe warten und diese in "auswahl" speichern
  1438. system("cls"); // Konsole erneut leeren
  1439.  
  1440. if(auswahl == 49)
  1441. {
  1442. spielen();
  1443. }
  1444. else if(auswahl == 50) // je nach Auswahl, das enstprechende Untermenü öffnen
  1445. {
  1446. steuerung();
  1447. }
  1448. else if(auswahl == 51)
  1449. {
  1450. highscoreAusgeben();
  1451. }
  1452. else if(auswahl == 52)
  1453. {
  1454. einstellungen();
  1455. }
  1456. else if(auswahl == 53) // falls 5 gedrückt...
  1457. {
  1458. mainLoop = 2; // ...Main Schleife unterbrechen und Programm beenden
  1459. }
  1460. else
  1461. {
  1462. printf("\n\nUng\201ltige Eingabe!\n\n");
  1463. Sleep(2000); // falls eine Taste, die nicht zur Auswahl steht gedrückt wurde, Ungültige Eingabe anzeigen
  1464. menu(); // und zurück zum Hautpmenü
  1465. }
  1466. }
  1467.  
  1468. // Beginn des Programms direkter Verweis nach Menü
  1469. int main()
  1470. {
  1471.  
  1472. // Cursor verstecken
  1473. CONSOLE_CURSOR_INFO ConCurInf;
  1474. hOut = GetStdHandle(STD_OUTPUT_HANDLE);
  1475. ConCurInf.dwSize = 10;
  1476. //ConCurInf.bVisible = false;
  1477. SetConsoleCursorInfo(hOut, &ConCurInf);
  1478.  
  1479. while(mainLoop <= 1)
  1480. {
  1481. if(mainLoop == 0)
  1482. {
  1483. menu(); // verhindern, dass das Programm frühzeitig beendet wird
  1484. }
  1485. else if(mainLoop == 1)
  1486. {
  1487. spielende(); // spielende() aufrufen, sobald das Spiel beendet wurde bzw. mainLoop zu 1 gesetzt wurde
  1488. }
  1489.  
  1490. }
  1491.  
  1492. }
Not running #stdin #stdout 0s 0KB
stdin
Standard input is empty
stdout
Standard output is empty