#include #include #include #ifdef _WIN32 #include #endif using namespace std; string spielfeld[3][3] = { {" ", " ", " "}, {" ", " ", " "}, {" ", " ", " "} }; struct userInput { bool ok; int zeile; int spalte; }; struct gameState { bool running = true; string winner; int filledCells = 0; }; void render() { #ifdef _WIN32 system("cls"); #endif #ifdef linux system("clear"); #endif cout << " | 1 | 2 | 3 |" << endl; cout << "---------------" << endl; for (int i = 0; i < 3; i++) { cout << i+1 << " | "; for (int j = 0; j < 3; j++) { cout << spielfeld[i][j] << " | "; } cout << endl; cout << "---------------" << endl; } } userInput getUserInput() { int inputSpalte, inputZeile; cout << "Zeile: "; cin >> inputZeile; cout << "Spalte: "; cin >> inputSpalte; cout << endl; if (spielfeld[inputZeile-1][inputSpalte-1] == " ") { return {true, inputZeile-1, inputSpalte-1}; } else { cout << endl << "Input konnte nicht gelesen werden" << endl; return getUserInput(); } } void checkforWin(gameState &state) { // TODO: implement a proper efficent check that doesnt end when every tile is filled // simplest way would be to check all 8 different solutions. 3 from top to bottom, 3 from left to right and 2 diagonals for (int i = 0; i < 3; i++) { // left to right if (spielfeld[i][0] == spielfeld[i][1] && spielfeld[i][2] == spielfeld[i][1] && spielfeld[i][2] != " ") { state.running = false; state.winner = spielfeld[i][1]; return; } // top to bottom if (spielfeld[0][i] == spielfeld[1][i] && spielfeld[1][i] == spielfeld[2][i] && spielfeld[1][i] != " ") { state.running = false; state.winner = spielfeld[1][i]; return; } } // top left to bottom right if (spielfeld[0][0] == spielfeld[1][1] && spielfeld[1][1] == spielfeld[2][2] && spielfeld[2][2] != " ") { state.running = false; state.winner = spielfeld[2][2]; return; } // top right to bottom left if (spielfeld[0][2] == spielfeld[1][1] && spielfeld[1][1] == spielfeld[2][0] && spielfeld[2][0] != " ") { state.running = false; state.winner = spielfeld[2][0]; return; } //draw if (state.filledCells >= 9) { state.running = false; state.winner = "-"; return; } } int main() { #ifdef _WIN32 SetConsoleOutputCP(CP_UTF8); #endif cout << fixed << setprecision(2); gameState state; int counter = 1; while (state.running) { render(); string current_player = counter++ % 2 == 1 ? "X" : "O"; cout << endl << "Am Zug ist Spieler: " << current_player << endl; if (auto [ok, zeile, spalte] = getUserInput(); ok) { spielfeld[zeile][spalte] = current_player; state.filledCells += 1; } checkforWin(state); } render(); cout << endl << "Der gewinner ist: " << state.winner << endl; #ifdef _WIN32 system("pause"); #endif return 0; }