Example #1
0
void King::listMoves(vector<Move *> *mList)
{
    Piece *p;
	unsigned int castlingFlags = pulchess_board->castlingFlags;
	
    // mosse normali
    //
    for(int i=-1; i<2; i++) {
		for(int j=-1; j<2; j++) {
			if( !COORDSOK(x+i, y+j) )
				continue;
			
			if(i==0 && j==0)
				continue;
			
			p = pulchess_board->GetPiece(x+i, y+j);
			
			// se esiste una pedina nel posto scelto, ed e' del colore opposto
			// oppure se la casella prescelta e' vuota, allora e' una mossa valida.
			if( p != NULL && IsEnemy(p) ) {
				mList->push_back( new Move( xy2pos(x+i,y+j), pos, 1) );
			}
			else if( p == NULL) {
				mList->push_back( new Move( xy2pos(x+i,y+j), pos, 0) );
			}
		}
    }	
   
    // Kingside castling
    // 
    if( //moveCount == 0 &&
        (( colour == WHITE && (castlingFlags&CASTLING_WHITE_K) ) || ( colour == BLACK && (castlingFlags&CASTLING_BLACK_K) )) &&
        pulchess_board->GetPiece(pos+1) == NULL &&
        pulchess_board->GetPiece(pos+2) == NULL )
    {
      p = pulchess_board->GetPiece(pos+3);
      if( p != NULL &&
          p->GetKind() == PIECE_ROOK &&
          //p->moveCount == 0 &&
		    !pulchess_board->CanEatThis(pos+1, colour) &&
		    !pulchess_board->CanEatThis(pos+2, colour) )
      {
        mList->push_back( new CastlingMove(KINGSIDE_CASTLING, colour) );
      }
    }
	
	// Queenside castling
	//
	if(( ( colour == WHITE && (castlingFlags&CASTLING_WHITE_Q) ) ||
         ( colour == BLACK && (castlingFlags&CASTLING_BLACK_Q) ) ) &&
		pulchess_board->GetPiece(pos-1) == NULL &&
		pulchess_board->GetPiece(pos-2) == NULL &&
		pulchess_board->GetPiece(pos-3) == NULL )
	{
		if( !pulchess_board->CanEatThis(pos-1, colour) &&
		    !pulchess_board->CanEatThis(pos-2, colour) )
		{
			mList->push_back( new CastlingMove(QUEENSIDE_CASTLING, colour) );
		}
	}
}