diff --git a/main.cpp b/main.cpp index 4789232..110072c 100644 --- a/main.cpp +++ b/main.cpp @@ -4,6 +4,8 @@ #include #include +#include +#include using namespace std; @@ -21,6 +23,7 @@ private: vector board; Player *player1, *player2; int currentPlayer; + public: void initBoard() { currentPlayer = 1; @@ -33,7 +36,7 @@ public: } Board(Board& b) { - currentPlayer = 1; + currentPlayer = b.currentPlayer; for (int i=0; i<9; i++) board.push_back(b.board[i]); } @@ -48,15 +51,24 @@ public: return board; } - void nextMove() { - if (currentPlayer == 1) makeMove(player1->getMove(*this)); - else makeMove(player2->getMove(*this)); - currentPlayer = currentPlayer % 2 + 1; + int getCurrentPlayer() { + return currentPlayer; } - bool makeMove(int move) { - if (!isValidMove(move)) return false; - board[move] = currentPlayer; + int nextMove() { + int tileToMakeMove = -1; + if (currentPlayer == 1) tileToMakeMove = player1->getMove(*this); + else tileToMakeMove = player2->getMove(*this); + return makeMove(tileToMakeMove); + } + + int makeMove(int move) { + if (isValidMove(move)) { + board[move] = currentPlayer; + currentPlayer = currentPlayer % 2 + 1; + return move; + } + return -1; } bool isValidMove(int move) { @@ -86,6 +98,8 @@ public: if (won) return p; } } + if (std::find(board.begin(), board.end(), 0) == board.end()) + return 3; return 0; } @@ -109,14 +123,65 @@ class User : public Player { cout << "Tile: "; cin >> move; if (b.isValidMove(move-1)) return move-1; - cout << endl << "Invalid move\e[2A"; + cout << endl << "\e[sInvalid move\e[u\e[2A\e[K"; } } }; +int max(int a, int b) { + return (a>b) ? a : b; +} + +int min(int a, int b) { + return (a scoreToMove; + for (int i=0; i<9; i++) { + Board dup(b); + int move = dup.makeMove(i); + if (move != -1) { + int score = getScore(dup, dup.getCurrentPlayer()); + maxScore = max(maxScore, score); + scoreToMove[score] = move; + if (debug) printf("- Move %d got score %d\n", move, score); + } + } + return scoreToMove[maxScore]; +} + class CPU: public Player { int getMove(Board b) { - + cout << "Calculating..." << endl; + return searchTreeRunner(b, true); } }; @@ -135,8 +200,8 @@ int main() { player1 = new CPU(); player2 = new CPU(); } else if (selection == 1) { - player1 = new User(); - player2 = new CPU(); + player1 = new CPU(); + player2 = new User(); } else { player1 = new User(); player2 = new User(); @@ -144,16 +209,20 @@ int main() { Board main(player1, player2); int winningPlayer = 0; + int previousMove = -1; while (true) { + printf("\e[2J\e[0;2H"); + if (previousMove != -1) printf("Previous move was %d", previousMove); main.print(); winningPlayer = main.hasWon(); if (winningPlayer != 0) break; - main.nextMove(); + previousMove = main.nextMove(); } - printf("Player %d won!", winningPlayer); + if (winningPlayer == 3) printf("Stalemate."); + else printf("Player %d won!", winningPlayer); delete player1; delete player2;