#ifndef _TTT_PLAYERS_HPP_ #define _TTT_PLAYERS_HPP_ class tttPlayGround; // dichiarazione di una classe definita altrove class TTT_Move { public: int row; int col; TTT_Move(int i, int j): row(i), col(j) {} }; class TTT_Player{ protected: int playerID; tttPlayGround *match; public: TTT_Player(int ID, tttPlayGround *m): playerID(ID), match(m) {}; int getID() const { return playerID; } virtual bool move(TTT_Move&) = 0; // metodo virtuale "puro" // restituisce false se non vuole/puo' muovere. }; class TTT_HumanPlayer: public TTT_Player { public: TTT_HumanPlayer(int ID, tttPlayGround *m): TTT_Player(ID,m) {} bool move(TTT_Move&) override; }; class TTT_AutoPlayer: public TTT_Player { protected: char myPlayground[3][3]; public: TTT_AutoPlayer(int ID, tttPlayGround *m): TTT_Player(ID,m) {} // virtual bool move(TTT_Move&) override; // questa classe non implementa un metodo virtuale puro // questo fa anche di lei una classe astratta }; class TTT_FirstFree: public TTT_AutoPlayer { public: TTT_FirstFree(int ID, tttPlayGround *m): TTT_AutoPlayer(ID,m) {} bool move(TTT_Move&) override; }; class TTT_RandomPlayer: public TTT_AutoPlayer { int seed; static const int maxiter=100000; public: TTT_RandomPlayer(int ID, tttPlayGround *m); TTT_RandomPlayer(int ID, tttPlayGround *m, int s); virtual void reset(int); bool move(TTT_Move&) override; }; #endif