finished wincheck and system detection
This commit is contained in:
60
main.cpp
60
main.cpp
@@ -1,10 +1,12 @@
|
||||
#include <iostream>
|
||||
#include <windows.h>
|
||||
#include <iomanip>
|
||||
#include <vector>
|
||||
|
||||
using namespace std;
|
||||
#ifdef _WIN32
|
||||
#include <windows.h>
|
||||
#endif
|
||||
|
||||
using namespace std;
|
||||
|
||||
string spielfeld[3][3] = {
|
||||
{" ", " ", " "},
|
||||
@@ -20,11 +22,18 @@ struct userInput {
|
||||
|
||||
struct gameState {
|
||||
bool running = true;
|
||||
char winner;
|
||||
string winner;
|
||||
int filledCells = 0;
|
||||
};
|
||||
|
||||
void render() {
|
||||
#ifdef _WIN32
|
||||
system("cls");
|
||||
#endif
|
||||
|
||||
#ifdef linux
|
||||
system("clear");
|
||||
#endif
|
||||
|
||||
cout << " | 1 | 2 | 3 |" << endl;
|
||||
cout << "---------------" << endl;
|
||||
@@ -55,24 +64,47 @@ userInput getUserInput() {
|
||||
|
||||
void checkforWin(gameState &state) {
|
||||
// TODO: implement a proper efficent check that doesnt end when every tile is filled
|
||||
// we simulate for debugging purposes that once every field in the spielfeld array is filled, the game ends
|
||||
int counter = 0;
|
||||
// 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++) {
|
||||
for (int j = 0; j < 3; j++) {
|
||||
if (spielfeld[i][j] != " ") {
|
||||
counter++;
|
||||
}
|
||||
// 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;
|
||||
}
|
||||
}
|
||||
if (counter == 9) {
|
||||
// top left to bottom right
|
||||
if (spielfeld[0][0] == spielfeld[1][1] && spielfeld[1][1] == spielfeld[2][2] && spielfeld[2][2] != " ") {
|
||||
state.running = false;
|
||||
render();
|
||||
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;
|
||||
@@ -84,9 +116,15 @@ int main() {
|
||||
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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user