package com.editev.chess;
import com.editev.util.Filter;
import com.editev.util.Function;
import com.editev.util.Enum;
import com.editev.chess.piece.Piece;
import java.util.Enumeration;
/** A Game that can enumerate its legal Moves.
*
* @see See the source here.
*/
public class EnumeratedGame extends Game {
/** Enumeration of every legal move for this Game.
* Don't change the game in the middle of getting the enumeration or this might not work.
* @return a new Enumeration of all legal moves for this game.
*/
public Enumeration enumerateAllLegalMoves() {
return
new Enum.Filtered(
acceptLegalMoves, // filter accepts only legal moves..
new Enum.Compound( // for each legal move for the piece.
new Enum.Mapped(
constructMovesFromPieces, // map Pieces to a list of moves for that Piece.
new Enum.Filtered(
acceptSquaresOnTheMove, // filter accepts only pieces that are on-the move
move.source.getEnumeration() // for each square on the board,
)
)
)
);
}
/** A Function that converts a Square to the Piece on that Square. */
public class SquareToPiece implements Function {
/** @param square a Square on the chessboard.
* @return the Piece on that Square. */
public Object eval( Object square ) { return getPiece( (Square) square ); }
}
/** An enumeration of all Moves for the piece in the Move. */
public class AllMovesForPieceMoving extends Enum.Lookahead {
/** the Piece that's doing the moving. */
public final Piece piece;
/** create the iterator starting with a Move. */
public AllMovesForPieceMoving() {
this.piece = getPiece( move ); // get the Piece for this move.
next = move;
piece.firstMoveIndex( move );
}
/** Retrieve the next move (legal or not!)
* @see com.editev.util.Enum.Lookahead. */
protected void next() { next = piece.incrementMoveIndex( move ) ? move : null; }
}
/** Constructs a list of Piece moves from a Square. */
class ConstructMovesFromPieces implements Function {
/** Create a new emumeration of the Pieces
* @return an enumeration of moves for the piece moving.
* @param discard ignore this: we look at the central iterator Move.
*/
public Object eval( Object discard ) { return new AllMovesForPieceMoving(); }
};
/** A class only accept legal moves. */
class AcceptLegalMoves implements Filter {
/** @param move a move to check for legality.
* @return true if the Move is legal.*/
public boolean accept( Object move ) { return !isIllegal( (Move) move ); }
};
/** Only accepts Squares containing pieces that are on-the-move. */
class AcceptSquaresOnTheMove implements Filter {
/** @param square a square which might have a Piece.
*
* @return true if the Square contains a Piece and that Piece is on-the-move.
*/
public boolean accept( Object square ) {
byte piece = getPieceIndex( (Square) square );
return piece != NO_PIECE && isWhiteMove() == White.is( piece );
}
}
/** A Function that constructs a list of Piece moves from a Square in this Game. */
Function constructMovesFromPieces = new ConstructMovesFromPieces();
/** A Filter that only accepts legal moves for this Game. */
Filter acceptLegalMoves = new AcceptLegalMoves();
/** A filter that only accepts Locations with pieces that are on-the-move for this game. */
Filter acceptSquaresOnTheMove = new AcceptSquaresOnTheMove();
}