#include "game.h"
cBoard::cBoard()
{
for ( int x = 0; x <= MAX_CELL; x++ )
board[x] = Neutral;
}
cBoard::cBoard(const char *s)
{
int len = strlen(s);
if ( len != 9 )
Error( "cBoard::cBoard(const char*) -> String length not 9." );
for ( int i = 0; i <= MAX_CELL; i++ )
{
switch( tolower(s[i]) ) {
case 'o': case '0': board[i] = O;
break;
case ' ':
case '-':
board[i] = Neutral;
break;
case 'x':
case '1':
board[i] = X;
break;
default:
Error( "cBoard::cBoard(char*) -> Default case reached." );
break;
}
}
}
cBoard::~cBoard()
{
}
void cBoard::SetCell( int index, CellState value )
{
if ( index < 0 || index > MAX_CELL )
Error( "cBoard::SetCell -> Invalid index." );
board[index] = value;
}
CellState cBoard::GetCell( int index )
{
if ( index < 0 || index > MAX_CELL )
Error( "cBoard::GetCell -> Invalid index." );
return board[index];
}
string cBoard::GetBoard( void )
{
string s;
for ( int i = 0; i <= MAX_CELL; i++ )
switch( board[i] )
{
case X:
s += 'x';
break;
case O:
s += 'o';
break;
default:
case Neutral:
s += ' ';
break;
}
return s;
}
void cBoard::PrintBoard( void )
{
for ( int i = 0; i <= MAX_CELL; i++ )
{
switch( board[i] )
{
case X:
cout << 'X';
break;
case O:
cout << 'O';
break;
case Neutral:
cout << ' ';
break;
default:
cout << "DEFAULT";
break;
}
if ( i == 2 || i == 5 )
cout << "\n------\n";
else if ( i != 8 )
cout << "|";
}
cout << endl << endl;
}
cNode::cNode(cNode *p, short m, short d, const char * s ) : cBoard( s )
{
parent = p;
if ( parent == NULL )
move = m;
else if ( m < 0 || m > MAX_CELL )
Error( "cNode::cNode(cNode, short) -> Bad move." );
move = m;
depth = d;
end_game_value = None;
type = Unknown;
}
cNode::~cNode()
{
}
void cNode::Print( void )
{
cout << endl;
PrintBoard();
#ifdef PRINT_ALL
cout << endl << "Type: ";
if ( type == Min )
cout << "Min\n";
else if ( type == Max )
cout << "Max\n";
else
cout << "Unknown\n";
#endif
cout << endl << "End Game Value: ";
switch ( end_game_value )
{
case Win:
if ( type == Max ) cout << "Lose"; else
cout << "Win";
break;
case Draw:
cout << "Draw";
break;
case None:
default:
cout << "None";
break;
}
#ifdef PRINT_ALL
cout << endl << "Nodal Value: " << value;
#endif
if ( move == -1 ) cout << endl << "Move: No move required.\n\n";
else
cout << endl << "Move: " << (board[move] == X ? 'X' : 'O' ) << " in cell " << move << endl << endl;
}
NodeEndGameValue cNode::CheckEndGame( void )
{
if ( (((board[0] == board[1]) && (board[0] == board[2])) && board[0] != Neutral ) ||
(((board[3] == board[4]) && (board[3] == board[5])) && board[3] != Neutral ) ||
(((board[6] == board[7]) && (board[6] == board[8])) && board[6] != Neutral ))
return Win;
if ( (((board[0] == board[3]) && (board[0] == board[6])) && board[0] != Neutral ) ||
(((board[1] == board[4]) && (board[1] == board[7])) && board[1] != Neutral ) ||
(((board[2] == board[5]) && (board[2] == board[8])) && board[2] != Neutral ))
return Win;
if ( board[4] != Neutral &&
(((board[0] == board[4]) && (board[0] == board[8])) ||
((board[6] == board[4]) && (board[6] == board[2]))))
return Win;
for ( int i = 0; i <= MAX_CELL; i++ )
if ( board[i] == Neutral )
return None;
return Draw;
}