Created
          July 5, 2022 23:14 
        
      - 
      
- 
        Save satyajeetkrjha/b3a7dcdd8b5408a3de28162896f370b0 to your computer and use it in GitHub Desktop. 
Revisions
- 
        satyajeetkrjha created this gist Jul 5, 2022 .There are no files selected for viewingThis file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -0,0 +1,185 @@ #include <array> #include <deque> #include <iostream> #include <optional> #include <vector> using namespace std; class PlayingPiece { public: enum PieceType { X, O }; PlayingPiece() : pieceType(std::nullopt) {} PlayingPiece(PieceType pieceType) : pieceType(pieceType) {} std::optional<PieceType> get_pieceType() { return pieceType; } char mark() { if (!pieceType) return ' '; else if (pieceType == O) return 'O'; else return 'X'; } bool operator!=(const PlayingPiece &P) const { return pieceType != P.pieceType; } private: std::optional<PieceType> pieceType; }; class PlayingPieceX : public PlayingPiece { public: PlayingPieceX() : PlayingPiece(X) {} }; class PlayingPieceO : public PlayingPiece { public: PlayingPieceO() : PlayingPiece(O){}; }; class Player { string name; PlayingPiece playingPiece; public: Player(string name, PlayingPiece playingPiece) : name(name), playingPiece(playingPiece) {} string getName() { return name; } PlayingPiece getplayingpiece() { return this->playingPiece; } void setPLayingPiece(PlayingPiece playingPiece1) { this->playingPiece = playingPiece1; } }; class Board { public: bool addPiece(int row, int column, PlayingPiece playingPiece) { // you could not place a piece over there if (board[row][column].get_pieceType()) { return false; } board[row][column] = playingPiece; return true; } vector<pair<int, int>> getfreeCells() { vector<pair<int, int>> freeCells; for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { if (!board[i][j].get_pieceType()) { // cout << "pushed "<< endl; freeCells.push_back({i, j}); } } } return freeCells; } void printBoard() { for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { cout << board[i][j].mark() << " "; } cout << "|"; } cout << endl; } bool checkWinner(int row, int column, PlayingPiece playingPiece) { bool rowmatch, columnmatch, diagonalmatch, antidiagonalmatch; rowmatch = columnmatch = diagonalmatch = antidiagonalmatch = true; // stuck here for (int i = 0; i < 3; i++) { // stuck here if (!board[row][i].get_pieceType() || board[row][i] != playingPiece) { rowmatch = false ; } } for(int i=0;i<3;i++) { if(board[i][column].get_pieceType()|| board[i][column]!= playingPiece) { columnmatch = false; } } //need to check diagonals for(int i=0, j=0; i<3;i++,j++) { if (board[i][j].get_pieceType() || board[i][j] != playingPiece) { diagonalmatch = false; } } //need to check anti-diagonals for(int i=0, j=2; i<3;i++,j--) { if (board[i][j].get_pieceType() || board[i][j]!=playingPiece) { antidiagonalmatch = false; } } return rowmatch || columnmatch || diagonalmatch || antidiagonalmatch ; } private: std::array<std::array<PlayingPiece, 3>, 3> board; // a 2d array of 3 cross 3 of type playingPiece }; class TicToeGame { Board gameboard; deque<Player> players; public: void initializeGame() { PlayingPieceX crosspiece; PlayingPieceO noughtspiece; Player p1("PLAYER JACK", crosspiece); Player p2("PLAYER TOM", noughtspiece); players.push_back(p1); players.push_back(p2); } string startGame() { bool flag = true; while (flag) { Player playerplayingnow = players.front(); players.pop_front(); vector<pair<int, int>> freecells = gameboard.getfreeCells(); if (freecells.size() == 0) { return "tie"; } cout << "Player :" << playerplayingnow.getName() << " " << "Enter Row and Column" << endl; int row, column; cin >> row >> column; bool addedsucessfully = gameboard.addPiece(row, column, playerplayingnow.getplayingpiece()); if (!addedsucessfully) { cout << "Incorrect position" << endl; players.push_front(playerplayingnow); continue; } players.push_back(playerplayingnow); bool iswinner = gameboard.checkWinner(row, column, playerplayingnow.getplayingpiece()); if (iswinner) { return playerplayingnow.getName(); } } } }; int main() { TicToeGame ticToeGame ; ticToeGame.initializeGame(); cout <<ticToeGame.startGame() << endl; return 0; }