93 lines
1.6 KiB
C++
93 lines
1.6 KiB
C++
#ifndef _TIC_TAC_TOE_
|
|
#define _TIC_TAC_TOE_
|
|
|
|
#include "computer.h"
|
|
#include "field.h"
|
|
#include "human.h"
|
|
#include "input.h"
|
|
#include "player.h"
|
|
|
|
class TicTacToe {
|
|
public:
|
|
TicTacToe() {
|
|
players_[0] = NULL;
|
|
players_[1] = NULL;
|
|
}
|
|
|
|
~TicTacToe() {
|
|
Reset();
|
|
}
|
|
|
|
bool Start() {
|
|
Reset();
|
|
std::cout << "Tic Tac Toe\n\n[1] Human\n[2] Computer\n[3] Quit\n\n";
|
|
|
|
players_[0] = SelectPlayer( Field::PlayerA, "PlayerA" );
|
|
if ( !players_[0] ) {
|
|
return false;
|
|
}
|
|
|
|
players_[1] = SelectPlayer( Field::PlayerB, "PlayerB" );
|
|
if ( !players_[1] ) {
|
|
return false;
|
|
}
|
|
|
|
std::cout << '\n';
|
|
return true;
|
|
}
|
|
|
|
void Run() {
|
|
field_.Show();
|
|
|
|
int playerIndex = 0;
|
|
|
|
for ( int i = 0; i < 9; i++ ) {
|
|
Player& player = *players_[playerIndex];
|
|
|
|
field_.MakeMove( player.Turn( field_ ), player.token_ );
|
|
field_.Show();
|
|
|
|
if ( field_.SameInRow( player.token_, 3 ) ) {
|
|
std::cout << player.name_ << " won!\n\n";
|
|
return;
|
|
}
|
|
|
|
playerIndex = ( playerIndex + 1 ) % 2;
|
|
}
|
|
|
|
std::cout << "Game ends in draw!\n\n";
|
|
}
|
|
|
|
private:
|
|
void Reset() {
|
|
field_.Clear();
|
|
|
|
for ( int i = 0; i < 2; i++ ) {
|
|
if ( players_[i] ) {
|
|
delete players_[i];
|
|
players_[i] = NULL;
|
|
}
|
|
}
|
|
}
|
|
|
|
Player* SelectPlayer( Field::Token token, const std::string& name ) const {
|
|
int selection;
|
|
|
|
while ( true ) {
|
|
std::cout << "Choose " << name << ": ";
|
|
input::number( &selection );
|
|
|
|
switch ( selection ) {
|
|
case 1 : return new HumanPlayer( token, name );
|
|
case 2 : return new ArtificialPlayer( token, name );
|
|
case 3 : return NULL;
|
|
default : std::cout << "Wrong input!\n";
|
|
}
|
|
}
|
|
}
|
|
|
|
Player* players_[2];
|
|
Field field_;
|
|
};
|
|
|
|
#endif // _TIC_TAC_TOE_
|