package com.editev.chess;
import com.editev.util.Function;
import com.editev.util.ExceptionWrapper;
import java.util.Enumeration;
import java.util.NoSuchElementException;
/** Represents a move in the game of chess.
*
* A move is identified with its start square.
* There's also a target square, and perhaps a promotion piece.
* This class is used promiscuously as an interator, perhaps the
* ultimate reverse of an immutable class.
*
* @see See the source here.
*/
public class Move implements Enumeration, Cloneable {
/** The target square that this move is going to. */
//public final Square source = this;
public Square source = new Square();
/** The target square that this move is going to. */
public Square target = new Square();
/** Index the move in the series of offsets in the Piece.
* The Piece manipulates this variable to iterate through all the
* the offsets that represent possible moves.
*/
public byte index;
/** What piece is being created if this move is a promotion?
* Most of the time, Moves are not promotions and this field is wasted.
*/
public byte promotion = Chess.Black.QUEEN;
/** Reset the promotion variable to the start. */
public void resetPromotion() { promotion = Chess.Black.QUEEN; }
/** Two Moves are equal if they are equal as squares and their targets are equal as Squares. */
public boolean equals( Object object ) {
if (!(object instanceof Move)) return false;
Move move = (Move) object;
return super.equals( move ) && target.equals( move.target );
}
/** Clone this Move as an Object. @return an Object that clones this Move. */
public Object clone() { return cloneMove(); }
/** Clone this Move as a Move. @return a Move that clones this Move. */
public Move cloneMove() {
try {
Move move = (Move) super.clone();
move.source = new Square( source.column, source.row );
move.target = new Square( target.column, target.row );
return move;
}
catch (CloneNotSupportedException e) {
throw new ExceptionWrapper( e ); // should never get here!
}
}
/** Represent the Move as the source and target Squares.*/
public String toString() { return source.toString() +"-"+target.toString(); }
/** Copy the contents of another Move into this Move. */
public void copyFrom( Move move ) {
target.copyFrom( move.target );
source.copyFrom( move.source );
index = move.index;
promotion = move.promotion;
}
/** Enumerates all squares in row-major order, start right before the first element. */
public Enumeration getEnumeration() { return getEnumeration( (byte) 0, (byte) 0 ); }
/** Enumerates all squares in row-major order, start right before the first element. */
public Enumeration getEnumeration( byte row, byte column ) { source.row = row; source.column = --column; return this; }
/** Implements Enumeration in row-major order. */
public boolean hasMoreElements() { return source.row < 7 || source.column < 7; }
/** Implements Enumeration in row-major order. */
public Object nextElement() {
if (!hasMoreElements()) throw new NoSuchElementException();
if (++source.column > 7) {
source.column = 0;
source.row++;
}
return this;
}
}