Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!
Werbeanzeige
Anonymous
unregistriert
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
char key_input (char *field) { char input = ' '; // Eingabe Buffer char sign = ' '; // Das Zeichen, welches in die jeweiligen Felder platziert werden soll (X oder O) static bool player_1 = true; // Ist der 1. Spieler dran? Dies ist nur eine Hilfsvariable... if (player_1) // Ist der 1. Spieler dran? { std::cout << std::endl << std::endl << "Spieler 1: "; // Dann gib "Spieler 1:" aus und setzte das Zeichen sign = 'X'; // das dem erstens Spieler gehört der "sign" Variablen zu } else // Doch 2. Spieler? { // Genau das gleiche für den 2. Spieler machen: std::cout << std::endl << std::endl << "Spieler 2: "; sign = 'O'; } std::cin >> input; // Auf eine Eingabe warten // In dieser if Abfrage wird folgendes abgefragt: // Wenn "input" kleiner oder gleich dem Zeichen 0 oder größer als das Zeichen 9 und nicht gleich "q" ist, tue das: if ((input <= '0') || (input > '9') && input != 'q') { std::cin.sync (); std::cout << std::endl << "Falsche Eingabe!"; std::cin.get (); } // Ähnliche if Abfrage, nur andersrum: Wenn irgendwas zwischen 1 und 9 gedrückt wurde, tu folgendes: if ((input > '0') && (input <= '9')) { // Erstmal abfragen, ob ein Feld schon ein "X" oder ein "O" beinhaltet. // Da der ASCII Code für 1-9 von 49-57 geht und die field Variable nur Felder von 1-9 hat, sollten wir die input Variable, die wir // dem Feld übergeben mit 48 subtrahieren. if (field[input - 48] == 'X' || field[input - 48] == 'O') { // Sollte klar sein std::cin.sync (); std::cout << std::endl << "Dieses Feld ist bereits belegt!"; std::cin.get (); } else { field[input - 48] = sign; // Das Zeichen des jeweiligen Spielers auf dem jeweiligem Feld ausgeben player_1 = !player_1; // Wert der bool Variablen umdrehen } } return input; // "input" zurückgeben und fertig ist die Funktion =) } |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
bool winner (char *field) { for (int i = 1; i < 9; i += 3) // Vertikal if ((field[i] == 'X') && (field[i+1] == 'X') && (field[i+2] == 'X')) // X überprüfen { std::cout << std::endl << std::endl << "Spieler 1 hat gewonnen!"; std::cin.sync (); std::cin.get (); return false; } else if ((field[i] == 'O') && (field[i+1] == 'O') && (field[i+2] == 'O')) // O überprüfen { std::cout << std::endl << std::endl << "Spieler 2 hat gewonnen!"; std::cin.sync (); std::cin.get (); return false; } for (int i = 1; i < 4; ++i) // Horzontal if ((field[i] == 'X') && (field[i+3] == 'X') && (field[i+6] == 'X')) // X überprüfen { std::cout << std::endl << std::endl << "Spieler 1 hat gewonnen!"; std::cin.sync (); std::cin.get (); return false; } else if ((field[i] == 'O') && (field[i+3] == 'O') && (field[i+6] == 'O')) // O überprüfen { std::cout << std::endl << std::endl << "Spieler 2 hat gewonnen!"; std::cin.sync (); std::cin.get (); return false; } // Diagonal für X überprüfen if ((field[1] == 'X') && (field[5] == 'X') && (field[9] == 'X') || (field[3] == 'X') && (field[5] == 'X') && (field[7] == 'X')) { std::cout << std::endl << std::endl << "Spieler 1 hat gewonnen!"; std::cin.sync (); std::cin.get (); return false; } // Diagonal für O überprüfen else if ((field[1] == 'X') && (field[5] == 'X') && (field[9] == 'X') || (field[3] == 'X') && (field[5] == 'X') && (field[7] == 'X')) { std::cout << std::endl << std::endl << "Spieler 2 hat gewonnen!"; std::cin.sync (); std::cin.get (); return false; } // Unentschieden? Hier wird überprüft, ob irgendein Feld noch frei ist // Wenn nicht, und kein Spieler gewonnen hat, wir "Unentschieden!" ausgegeben. else if ((field[1] != ' ') && (field[2] != ' ') && (field[3] != ' ') && (field[4] != ' ') && (field[5] != ' ') && (field[6] != ' ') && (field[7] != ' ') && (field[8] != ' ') && (field[9] != ' ')) { std::cout << std::endl << std::endl << "Unentschieden!"; std::cin.sync (); std::cin.get (); return false; } return true; // Falls alles gut lief, true zurückgeben. } |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
bool winner (char *field) { // Alle Möglichkeiten für X abfragen if ((field[1] == 'X') && (field[2] == 'X') && (field[3] == 'X') || (field[4] == 'X') && (field[5] == 'X') && (field[6] == 'X') || (field[7] == 'X') && (field[8] == 'X') && (field[9] == 'X') || (field[1] == 'X') && (field[4] == 'X') && (field[7] == 'X') || (field[2] == 'X') && (field[5] == 'X') && (field[8] == 'X') || (field[3] == 'X') && (field[6] == 'X') && (field[9] == 'X') || (field[1] == 'X') && (field[5] == 'X') && (field[9] == 'X') || (field[3] == 'X') && (field[5] == 'X') && (field[7] == 'X')) { std::cout << std::endl << std::endl << "Spieler 1 hat gewonnen!"; std::cin.sync (); std::cin.get (); return false; } // Alle Möglichkeiten für O abfragen else if ((field[1] == 'O') && (field[2] == 'O') && (field[3] == 'O') || (field[4] == 'O') && (field[5] == 'O') && (field[6] == 'O') || (field[7] == 'O') && (field[8] == 'O') && (field[9] == 'O') || (field[1] == 'O') && (field[4] == 'O') && (field[7] == 'O') || (field[2] == 'O') && (field[5] == 'O') && (field[8] == 'O') || (field[3] == 'O') && (field[6] == 'O') && (field[9] == 'O') || (field[1] == 'O') && (field[5] == 'O') && (field[9] == 'O') || (field[3] == 'O') && (field[5] == 'O') && (field[7] == 'O')) { std::cout << std::endl << std::endl << "Spieler 2 hat gewonnen!"; std::cin.sync (); std::cin.get (); return false; } // Unentschieden? else if ((field[1] != ' ') && (field[2] != ' ') && (field[3] != ' ') && (field[4] != ' ') && (field[5] != ' ') && (field[6] != ' ') && (field[7] != ' ') && (field[8] != ' ') && (field[9] != ' ')) { std::cout << std::endl << std::endl << "Unentschieden!"; std::cin.sync (); std::cin.get (); return false; } return true; // Falls alles gut lief, true zurückgeben. } |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
int main () { SetConsoleTitleW (L"Tic Tac Toe"); bool quit = true; // Variable zum abfragen, ob das Programm geschlossen werden soll char input = ' '; char field[10]; for (int i = 0; i < 10; ++i) field[i] = ' '; while (input != 'q') { draw_field (field); quit = winner (field); // "winner" liefert einen Wert zurück, den wir abfangen, um im Falle eines Sieges // das Programm beenden zu können. if (!quit) // Wenn "quit" gleich "false" ist, dann... break; // Springe aus der while Schleife, wo in diesem Falle das Programm beendet wird. // Nun geben wir die Beschreibung aus. Sogar mit Umlauten ;) std::cout << std::endl << std::endl << "Geben Sie eine Zahl zwischen 1 und 9 ein, um ein Feld auszuw\204hlen" << std::endl << "oder geben Sie \"q\" ein, um das Programm zu beenden."; // Der Rest sollte klar sein. input = key_input (field); std::cin.sync (); } return 0; } |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 |
#include <iostream> #include <windows.h> void draw_field (char *field) { system ("cls"); std::cout << std::endl << std::endl << std::endl << " " << field[1] << " | " << field[2] << " | " << field[3] << std::endl << " ---|---|---" << std::endl << " " << field[4] << " | " << field[5] << " | " << field[6] << std::endl << " ---|---|---" << std::endl << " " << field[7] << " | " << field[8] << " | " << field[9] << std::endl; } char key_input (char *field) { char input = ' '; char sign = ' '; static bool player_1 = true; if (player_1) { std::cout << std::endl << std::endl << "Spieler 1: "; sign = 'X'; } else { std::cout << std::endl << std::endl << "Spieler 2: "; sign = 'O'; } std::cin >> input; if ((input <= '0') || (input > '9') && input != 'q') { std::cin.sync (); std::cout << std::endl << "Falsche Eingabe!"; std::cin.get (); } if ((input > '0') && (input <= '9')) { if (field[input - 48] == 'X' || field[input - 48] == 'O') { std::cin.sync (); std::cout << std::endl << "Dieses Feld ist bereits belegt!"; std::cin.get (); } else { field[input - 48] = sign; player_1 = !player_1; } } return input; } bool winner (char *field) { if ((field[1] == 'X') && (field[2] == 'X') && (field[3] == 'X') || (field[4] == 'X') && (field[5] == 'X') && (field[6] == 'X') || (field[7] == 'X') && (field[8] == 'X') && (field[9] == 'X') || (field[1] == 'X') && (field[4] == 'X') && (field[7] == 'X') || (field[2] == 'X') && (field[5] == 'X') && (field[8] == 'X') || (field[3] == 'X') && (field[6] == 'X') && (field[9] == 'X') || (field[1] == 'X') && (field[5] == 'X') && (field[9] == 'X') || (field[3] == 'X') && (field[5] == 'X') && (field[7] == 'X')) { std::cout << std::endl << std::endl << "Spieler 1 hat gewonnen!"; std::cin.sync (); std::cin.get (); return false; } else if ((field[1] == 'O') && (field[2] == 'O') && (field[3] == 'O') || (field[4] == 'O') && (field[5] == 'O') && (field[6] == 'O') || (field[7] == 'O') && (field[8] == 'O') && (field[9] == 'O') || (field[1] == 'O') && (field[4] == 'O') && (field[7] == 'O') || (field[2] == 'O') && (field[5] == 'O') && (field[8] == 'O') || (field[3] == 'O') && (field[6] == 'O') && (field[9] == 'O') || (field[1] == 'O') && (field[5] == 'O') && (field[9] == 'O') || (field[3] == 'O') && (field[5] == 'O') && (field[7] == 'O')) { std::cout << std::endl << std::endl << "Spieler 2 hat gewonnen!"; std::cin.sync (); std::cin.get (); return false; } else if ((field[1] != ' ') && (field[2] != ' ') && (field[3] != ' ') && (field[4] != ' ') && (field[5] != ' ') && (field[6] != ' ') && (field[7] != ' ') && (field[8] != ' ') && (field[9] != ' ')) { std::cout << std::endl << std::endl << "Unentschieden!"; std::cin.sync (); std::cin.get (); return false; } return true; } int main () { SetConsoleTitleW (L"Tic Tac Toe"); bool quit = true; char input = ' '; char field[10]; for (int i = 0; i < 10; ++i) field[i] = ' '; while (input != 'q') { draw_field (field); quit = winner (field); if (!quit) break; std::cout << std::endl << std::endl << "Geben Sie eine Zahl zwischen 1 und 9 ein, um ein Feld auszuw\204hlen" << std::endl << "oder geben Sie \"q\" ein, um das Programm zu beenden."; input = key_input (field); std::cin.sync (); } return 0; } |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 |
// 1. Die bool player bereits in der main()-Funktion deklarieren // 2. key_input und winner bekommen ein bool bPlayer1-Parameter dazu, // key_input wurd dann entsprechend verändert (static bool gleich "weg" und Parameter verwenden!). // Hier: Brauch ich einen Zeiger auf die bool, weil wir sie dann später umkehren wollen(siehe unten!) char key_input (char *field, bool *bPlayer1) { char input = ' '; char sign = ' '; if (bPlayer1) { std::cout << std::endl << std::endl << "Spieler 1: "; sign = 'X'; } else { std::cout << std::endl << std::endl << "Spieler 2: "; sign = 'O'; } std::cin >> input; if ((input < 49) || (input > 57) && input != 113) { std::cin.sync (); std::cout << std::endl << "Falsche Eingabe!"; std::cin.get (); } if ((input > 48) && (input < 58)) { if (field[input - 48] == 'X' || field[input - 48] == 'O') { std::cin.sync (); std::cout << std::endl << "Dieses Feld ist bereits belegt!"; std::cin.get (); } else { field[input - 48] = sign; bPlayer1 = !bPlayer1; } } return input; } bool winner (char *field, bool bPlayer1) { // Alle Möglichkeiten für X abfragen if ((field[1] == field[2]) && (field[3] == field[2]) || (field[4] == field[5]) && (field[6] == field[5]) || (field[7] == field[8]) && (field[9] == field[8]) || (field[1] == field[4]) && (field[7] == field[4]) || (field[2] == field[5]) && (field[8] == field[5]) || (field[3] == field[6]) && (field[9] == field[6]) || (field[1] == field[5]) && (field[9] == field[5]) || (field[3] == field[5]) && (field[7] == field[5])) { if(bPlayer1 == true) { std::cout << std::endl << std::endl << "Spieler 1 hat gewonnen!"; std::cin.sync (); std::cin.get (); return false; } else { std::cout << std::endl << std::endl << "Spieler 2 hat gewonnen!"; std::cin.sync (); std::cin.get (); return false; } return true; // Falls alles gut lief, true zurückgeben. } int main () { SetConsoleTitleW (L"Tic Tac Toe"); bool quit = true; // Variable zum abfragen, ob das Programm geschlossen werden soll char input = ' '; bool bPlayer1 = true; char field[10]; for (int i = 0; i < 10; ++i) field[i] = ' '; while (input != 'q') { draw_field (field); quit = winner (field, bPlayer1); // "winner" liefert einen Wert zurück, den wir abfangen, um im Falle eines Sieges // das Programm beenden zu können. if (!quit) // Wenn "quit" gleich "false" ist, dann... break; // Springe aus der while Schleife, wo in diesem Falle das Programm beendet wird. // Nun geben wir die Beschreibung aus. Sogar mit Umlauten ;) std::cout << std::endl << std::endl << "Geben Sie eine Zahl zwischen 1 und 9 ein, um ein Feld auszuw\204hlen" << std::endl << "oder geben Sie \"q\" ein, um das Programm zu beenden."; // Der Rest sollte klar sein. input = key_input (field, &bPlayer1); std::cin.sync (); } return 0; } |
Anonymous
unregistriert
Anonymous
unregistriert
Zitat von »"Frede"«
Die Umkehreung von bPlayer1 kann man ebenso nach dem Aufruf der key_input-funktion in main() machen..........
C-/C++-Quelltext |
|
1 |
statt input > 48 && input < 57 |
C-/C++-Quelltext |
|
1 |
input > '0' && input <= '9' |
Anonymous
unregistriert
C-/C++-Quelltext |
|
1 |
bPlayer1 = !bPlayer1; |
Anonymous
unregistriert
Werbeanzeige