BOOKS i'm reading |
/* * Module ID: lab2ches.cpp * Titre : Module Secondaire du Lab 2 du cours ELE-440 * * Auteur : Olivier Langlois <olivier@olivierlanglois.net> * Date : 4 Fevrier 1998 * */ #ifdef __BORLANDC__ // Indique au compilateur que les instances de template utilisees dans ce // module seront definies dans un autre module. #pragma option -Jgx #endif #include "collect/pq.cpp" #include "lab2ches.h" #ifdef __GNUG__ Lab2ChessCase *Lab2ChessBoard::sentinel = NULL; #endif Lab2ChessCase::Lab2ChessCase( int oc, unsigned s ) : originCounter(oc), seq(s), possibleNextMoves(NULL) {} Lab2ChessCase::Lab2ChessCase( const Lab2ChessCase &h ) { possibleNextMoves = NULL; operator=(h); } void Lab2ChessCase::init( void ) { ChessCase::init(); PQ<Lab2ChessCase> *tmp = new PQ<Lab2ChessCase>(9); #ifdef __GNUG__ tmp->setSentinel(Lab2ChessBoard::sentinel); #endif possibleNextMoves = dynamic_cast<oliCollection *>(tmp); } void Lab2ChessCase::operator=(const Lab2ChessCase &h) { originCounter = h.originCounter; seq = h.seq; } int Lab2ChessCase::operator==(const Lab2ChessCase &h) const { return (originCounter == h.originCounter); } int Lab2ChessCase::operator!=(const Lab2ChessCase &h) const { return (originCounter != h.originCounter); } int Lab2ChessCase::operator <(const Lab2ChessCase &h) const { // Note : Plus originCounter est petit, plus la priorite est grande. return (originCounter > h.originCounter); } int Lab2ChessCase::operator >(const Lab2ChessCase &h) const { // Note : Plus originCounter est petit, plus la priorite est grande. return (originCounter < h.originCounter); } int Lab2ChessCase::operator<=(const Lab2ChessCase &h) const { return ( operator<(h) || operator==(h) ); } int Lab2ChessCase::operator>=(const Lab2ChessCase &h) const { return ( operator>(h) || operator==(h) ); } Lab2Column::Lab2Column() : Column(0) { for( int i = 0; i < NUMROW; i++ ) ChessCases.insert(new Lab2ChessCase); } Lab2ChessBoard::Lab2ChessBoard() : ChessBoard(0) { #ifndef __GNUG__ PQ<Lab2ChessCase>::setSentinel(new Lab2ChessCase(-1)); #endif for( int i = 0; i < NUMCOL; i++ ) columns.insert(new Lab2Column[NUMCOL]); /* initColumns(); */ } Lab2ChessBoard::~Lab2ChessBoard() { #ifdef __BORLANDC__ delete PQ<Lab2ChessCase>::getSentinel(); #endif } /****************************************************************************** * * Nom : addCase * ****************************************************************************/ void Lab2ChessCase::addCase( int x, int y ) { Lab2ChessCase &refCase = dynamic_cast<Lab2ChessCase &>((*Board)[x][y]); if( !refCase.seq ) /* * Il est important d'espacer les 2 > dans l'expression * dynamic_cast< PQ<Lab2ChessCase> * >(possibleNextMoves) * car autrement il est possible que l'analyseur lexique du compilateur * se confonde avec l'operateur >> */ dynamic_cast< PQ<Lab2ChessCase> * >(possibleNextMoves)->insert( &refCase ); } /****************************************************************************** * * Nom : visitBoard * ****************************************************************************/ void Lab2Knight::visitBoard( ChessBoard &board ) { int u, v; for( int x = 0; x < NUMCOL; x++ ) for( int y = 0; y < NUMROW; y++ ) for( int nm = 0; nm < GamePiece::numMove; nm++ ) { u = x + GamePiece::dx[nm]; v = y + GamePiece::dy[nm]; if( (0 <= u) && (u <= NUMCOL-1) && (0 <= v) && (v <= NUMROW-1) ) ((Lab2ChessCase &)board[u][v]).originCounter++; } } /****************************************************************************** * * Nom : visitCase * ****************************************************************************/ void Lab2Knight::visitCase( ChessCase &c ) { int x, y, new_x, new_y, i; Knight::visitCase(c); Lab2ChessCase &lab2c = dynamic_cast<Lab2ChessCase &>(c); lab2c.possibleNextMoves->clear(); lab2c.getPosition( x, y ); for( i = 0; i < GamePiece::numMove; i++ ) { new_x = x + GamePiece::dx[i]; new_y = y + GamePiece::dy[i]; if( (0 <= new_x) && (new_x <= NUMCOL-1) && (0 <= new_y) && (new_y <= NUMROW-1) ) lab2c.addCase( new_x, new_y ); } } /****************************************************************************** * * Nom : getNext * * Utilite : Retourne la prochaine case a essayer. * (Sert aussi a decoupler PQ du module lab2) * * Reference : lab2ches.h * ****************************************************************************/ Lab2ChessCase *getNext( Lab2ChessCase *ptrCase ) { return dynamic_cast< PQ<Lab2ChessCase> * >(ptrCase->possibleNextMoves)->removeFirst(); } #ifdef __GNUG__ template class PQ<Lab2ChessCase>; #endif |