Files
tictactoe/main.cpp
2026-04-23 12:50:02 +02:00

133 lines
3.3 KiB
C++

#include <iostream>
#include <iomanip>
#include <vector>
#ifdef _WIN32
#include <windows.h>
#endif
using namespace std;
char spielfeld[3][3];
struct userInput {
bool ok;
int zeile;
int spalte;
};
struct gameState {
bool running = true;
char 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);
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
spielfeld[i][j] = ' ';
}
}
gameState state;
int counter = 1;
while (state.running) {
render();
char 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;
}