// ConsoleTicTacToe.cpp // (c) Markus Lumpe, CS 229 Spring 2007 #include #include #include "TicTacToe.h" class ConsoleView : public TicTacToeView { private: string fPlayers[2]; bool fComputerPlayer[2]; TicTacToe* fModel; int fPlayerId; void performMove( int aMove ) { fModel->setField( aMove, fPlayerId) ; fModel->isGameOver( fPlayerId ); fPlayerId = ++fPlayerId % 2; } void performPlayerMove() { for ( ; ; ) { int lRow; int lColumn; cout << "Player " << fPlayers[fPlayerId] << " make a move: " << flush; try { int lNumber; cin >> lNumber; lRow = lNumber / 10 - 1; lColumn = lNumber % 10 - 1; performMove( lRow * 3 + lColumn ); break; } catch (MoveException& e) { cout << "Illegal move (" << lRow+1 << "," << lColumn+1 << ")! Try again." << endl; } } } void performComputerMove() { int lMove = fModel->performComputerMove( (fPlayerId + 1) % 2, fPlayerId ); int lRow = lMove / 3; int lColumn = lMove % 3; cout << fPlayers[fPlayerId] << "'s move: (" << lRow+1 << "," << lColumn+1 << ")" << endl; performMove( lMove ); } char getFieldString( int aIndex ) { char Result = '_'; switch ( fModel->getField( aIndex ) ) { case 0: Result = 'O'; break; case 1: Result = 'X'; break; } return Result; } public: ConsoleView() { TicTacToe( *this ); cout << "Name of the 1. player: " << flush; cin >> fPlayers[0]; cout << "Name of the 2. player: " << flush; cin >> fPlayers[1]; cout << "The board:" << endl; printBoard(); fPlayerId = 0; for ( int i = 0; i < 2; i++ ) { string lTest(""); for ( unsigned int j = 0; j < fPlayers[i].size(); j++ ) lTest += toupper( fPlayers[i][j] ); if ( lTest == "COMPUTER" ) fComputerPlayer[i] = true; else fComputerPlayer[i] = false; } // game loop while ( fModel->isActive() ) { if ( fComputerPlayer[fPlayerId] ) performComputerMove(); else performPlayerMove(); } } virtual ~ConsoleView() { cout << "Deleting ConsoleView ..." << endl; } void registerGame( TicTacToe* aGame ) { fModel = aGame; } void printBoard() { cout << getFieldString( 0 ) << ' ' << getFieldString( 1 ) << ' ' << getFieldString( 2 ) << endl; cout << getFieldString( 3 ) << ' ' << getFieldString( 4 ) << ' ' << getFieldString( 5 ) << endl; cout << getFieldString( 6 ) << ' ' << getFieldString( 7 ) << ' ' << getFieldString( 8 ) << endl; } void draw() { cout << "Game over!" << endl; } void declareWinner( int aPlayer ) { cout << "Player " << fPlayers[aPlayer] << " has won!" << endl; } }; int main() { ConsoleView lView; return 0; }