@ -1,4 +1,6 @@
import java.util.* ;
// We are making this an *immutable* class. The state that an object has when constructed is its state permanently.
// We are making this an *immutable* class. The state that an object has when constructed is its state permanently.
// Instead of making changes to objects we create new ones (with attemptMove() and the constructor).
// Instead of making changes to objects we create new ones (with attemptMove() and the constructor).
@ -14,7 +16,7 @@ public class GameState {
boardSquares = new Square [ ] {
boardSquares = new Square [ ] {
new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . OUT_OF_BOUNDS ) ,
new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . OUT_OF_BOUNDS ) ,
new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . OUT_OF_BOUNDS ) ,
new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . OUT_OF_BOUNDS ) ,
new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . ROOK , true ) , new Square ( Square . KNIGHT , true ) , new Square ( Square . BISHOP , true ) , new Square ( Square . QUEEN , true ) , new Square ( Square . KING , true ) , new Square ( Square . BISHOP , true ) , new Square ( Square . KNIGHT , true ) , new Square ( Square . ROOK , true ) , new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . OUT_OF_BOUNDS ) , //white
new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . ROOK , true ) , new Square ( Square . KNIGHT , true ) , new Square ( Square . BISHOP , true ) , new Square ( Square . KING , true ) , new Square ( Square . QUEEN , true ) , new Square ( Square . BISHOP , true ) , new Square ( Square . KNIGHT , true ) , new Square ( Square . ROOK , true ) , new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . OUT_OF_BOUNDS ) , //white
new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . PAWN , true ) , new Square ( Square . PAWN , true ) , new Square ( Square . PAWN , true ) , new Square ( Square . PAWN , true ) , new Square ( Square . PAWN , true ) , new Square ( Square . PAWN , true ) , new Square ( Square . PAWN , true ) , new Square ( Square . PAWN , true ) , new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . OUT_OF_BOUNDS ) , //white pawns
new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . PAWN , true ) , new Square ( Square . PAWN , true ) , new Square ( Square . PAWN , true ) , new Square ( Square . PAWN , true ) , new Square ( Square . PAWN , true ) , new Square ( Square . PAWN , true ) , new Square ( Square . PAWN , true ) , new Square ( Square . PAWN , true ) , new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . OUT_OF_BOUNDS ) , //white pawns
new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . EMPTY ) , new Square ( Square . EMPTY ) , new Square ( Square . EMPTY ) , new Square ( Square . EMPTY ) , new Square ( Square . EMPTY ) , new Square ( Square . EMPTY ) , new Square ( Square . EMPTY ) , new Square ( Square . EMPTY ) , new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . OUT_OF_BOUNDS ) ,
new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . EMPTY ) , new Square ( Square . EMPTY ) , new Square ( Square . EMPTY ) , new Square ( Square . EMPTY ) , new Square ( Square . EMPTY ) , new Square ( Square . EMPTY ) , new Square ( Square . EMPTY ) , new Square ( Square . EMPTY ) , new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . OUT_OF_BOUNDS ) ,
@ -23,7 +25,7 @@ public class GameState {
new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . EMPTY ) , new Square ( Square . EMPTY ) , new Square ( Square . EMPTY ) , new Square ( Square . EMPTY ) , new Square ( Square . EMPTY ) , new Square ( Square . EMPTY ) , new Square ( Square . EMPTY ) , new Square ( Square . EMPTY ) , new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . OUT_OF_BOUNDS ) ,
new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . EMPTY ) , new Square ( Square . EMPTY ) , new Square ( Square . EMPTY ) , new Square ( Square . EMPTY ) , new Square ( Square . EMPTY ) , new Square ( Square . EMPTY ) , new Square ( Square . EMPTY ) , new Square ( Square . EMPTY ) , new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . OUT_OF_BOUNDS ) ,
new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . PAWN , false ) , new Square ( Square . PAWN , false ) , new Square ( Square . PAWN , false ) , new Square ( Square . PAWN , false ) , new Square ( Square . PAWN , false ) , new Square ( Square . PAWN , false ) , new Square ( Square . PAWN , false ) , new Square ( Square . PAWN , false ) , new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . OUT_OF_BOUNDS ) , //white pawns
new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . PAWN , false ) , new Square ( Square . PAWN , false ) , new Square ( Square . PAWN , false ) , new Square ( Square . PAWN , false ) , new Square ( Square . PAWN , false ) , new Square ( Square . PAWN , false ) , new Square ( Square . PAWN , false ) , new Square ( Square . PAWN , false ) , new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . OUT_OF_BOUNDS ) , //white pawns
new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . ROOK , false ) , new Square ( Square . KNIGHT , false ) , new Square ( Square . BISHOP , false ) , new Square ( Square . QUEEN , false ) , new Square ( Square . KING , false ) , new Square ( Square . BISHOP , false ) , new Square ( Square . KNIGHT , false ) , new Square ( Square . ROOK , false ) , new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . OUT_OF_BOUNDS ) , //black
new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . ROOK , false ) , new Square ( Square . KNIGHT , false ) , new Square ( Square . BISHOP , false ) , new Square ( Square . KING , false ) , new Square ( Square . QUEEN , false ) , new Square ( Square . BISHOP , false ) , new Square ( Square . KNIGHT , false ) , new Square ( Square . ROOK , false ) , new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . OUT_OF_BOUNDS ) , //black
new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . OUT_OF_BOUNDS ) ,
new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . OUT_OF_BOUNDS ) ,
new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . OUT_OF_BOUNDS ) ,
new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . OUT_OF_BOUNDS ) , new Square ( Square . OUT_OF_BOUNDS ) ,
} ;
} ;
@ -41,8 +43,41 @@ public class GameState {
return null ;
return null ;
}
}
public Move [ ] getAllPossibleMoves ( ) {
public ArrayList < Move > getAllPossibleMoves ( ) {
return null ;
ArrayList < Move > moves = new ArrayList < Move > ( ) ;
//Loop through all squares
for ( int index = 0 ; index < boardSquares . length ; index + + ) {
int type = boardSquares [ index ] . getType ( ) ;
if ( type = = Square . OUT_OF_BOUNDS ) continue ;
if ( type = = Square . EMPTY ) continue ;
//For each square, find all possible places that piece can move to.
if ( type = = Square . KING ) moves . addAll ( findAllMovesFor ( index , new int [ ] { 1 , - 1 , 12 , - 12 , 13 , - 13 , 11 , - 11 } , false ) ) ;
if ( type = = Square . QUEEN ) moves . addAll ( findAllMovesFor ( index , new int [ ] { 1 , - 1 , 12 , - 12 , 13 , - 13 , 11 , - 11 } , true ) ) ;
if ( type = = Square . BISHOP ) moves . addAll ( findAllMovesFor ( index , new int [ ] { 13 , - 13 , 11 , - 11 } , true ) ) ;
if ( type = = Square . ROOK ) moves . addAll ( findAllMovesFor ( index , new int [ ] { 1 , - 1 , 12 , - 12 } , true ) ) ;
if ( type = = Square . KNIGHT ) moves . addAll ( findAllMovesFor ( index , new int [ ] { 10 , 14 , 23 , 25 , - 10 , - 14 , - 23 , - 25 } , false ) ) ;
}
return moves ;
}
private ArrayList < Move > findAllMovesFor ( int index , int [ ] directions , boolean canMoveMultipleSquares ) {
ArrayList < Move > moves = new ArrayList < Move > ( ) ;
//loop through the directions, see if they work - return the resulting arraylist.
for ( int dir : directions ) {
int destIndex = index + dir ;
int type = boardSquares [ destIndex ] . getType ( ) ;
if ( boardSquares [ index ] . isWhite ( ) ! = isWhitesTurn ) continue ; //don't move other person's pieces!
if ( type = = Square . OUT_OF_BOUNDS ) continue ;
if ( type = = Square . EMPTY | | boardSquares [ destIndex ] . isWhite ( ) ! = isWhitesTurn ) {
moves . add ( new Move ( index , destIndex ) ) ;
}
}
return moves ;
}
}
// returns something like "checkmate", "stalemate", etc.
// returns something like "checkmate", "stalemate", etc.