package chess; import java.util.Vector; /* * Board.java * * Created on February 10, 2007, 6:19 PM * * To change this template, choose Tools | Template Manager * and open the template in the editor. */ /** * * @author Stanislav Hromek */ public class Board { /** * first parameter is letter (left A to H right) * second parameter is number (bottom 1 to 8 top) * carrefull, Java has 0 - 7 ! */ private Square[][] squares; /** Creates a new instance of Board */ public Board() { squares = new Square[8][8]; // array of objects initialized to null init(); } void init() { for (int i = 0; i < squares.length; i++) { for (int j = 0; j < squares.length; j++) { int c = 'a' + i; squares[i][j] = new Square("" + ((char)c) + (j+1)); } } } /** * gives all squares of the board, (do we really need this function ?) */ protected Square[][] getSquares() { return squares; } /** * from name of the square gets square object */ protected Square getSquare(String squareName) { // correctness of letter and number should be already done by syntax check in processing lines char firstLetter = squareName.charAt(0); // difference between given and first letter int numberBetweenChars = firstLetter - 'a'; // minus one as it starts from zero and not one int secondNumber = Integer.parseInt(squareName.substring(1, 2)) - 1; return squares[numberBetweenChars][secondNumber]; } // protected Square[] getSquaresBetween(String squareNameOne, String squareNameTwo){ // return null; // } // rook, queen protected Square[] getSquaresHorizontal(String squareNameOne, String squareNameTwo){ int secondNumber = Integer.parseInt(squareNameOne.substring(1, 2)) - 1; char firstLetter = squareNameOne.charAt(0); // difference between given and first letter int numberBetweenChars = firstLetter - 'a'; Vector v = new Vector(); int i = Math.abs(squareNameTwo.charAt(0) - squareNameOne.charAt(0)); // starts from one, as we want square between for (int j = 1; j < i; j++) { if(squareNameOne.charAt(0) < squareNameTwo.charAt(0)){ // to the right v.add(squares[numberBetweenChars + j][secondNumber]); } else if(squareNameOne.charAt(0) > squareNameTwo.charAt(0)){ // to the left v.add(squares[numberBetweenChars - j][secondNumber]); } } // if equals, no squares between, empty return (Square[]) v.toArray(new Square[0]); } // rook, queen, pawn protected Square[] getSquaresVertical(String squareNameOne, String squareNameTwo){ int secondNumber = Integer.parseInt(squareNameOne.substring(1, 2)) - 1; char firstLetter = squareNameOne.charAt(0); // difference between given and first letter int numberBetweenChars = firstLetter - 'a'; Vector v = new Vector(); int i = Math.abs(squareNameTwo.charAt(1) - squareNameOne.charAt(1)); // starts from one, as we want square between for (int j = 1; j < i; j++) { if(squareNameOne.charAt(1) < squareNameTwo.charAt(1)){ // to the right v.add(squares[numberBetweenChars][secondNumber + j]); } else if(squareNameOne.charAt(1) > squareNameTwo.charAt(1)){ // to the left v.add(squares[numberBetweenChars][secondNumber - j]); } } // if equals, no squares between, empty return (Square[]) v.toArray(new Square[0]); } // bishop, queen protected Square[] getSquaresDiagonal(String squareNameOne, String squareNameTwo){ int secondNumber = Integer.parseInt(squareNameOne.substring(1, 2)) - 1; char firstLetter = squareNameOne.charAt(0); // difference between given and first letter int numberBetweenChars = firstLetter - 'a'; Vector v = new Vector(); int i = Math.abs(squareNameTwo.charAt(0) - squareNameOne.charAt(0)); // starts from one, as we want square between for (int j = 1; j < i; j++) { if(squareNameOne.charAt(0) < squareNameTwo.charAt(0)){ // to the right if(squareNameOne.charAt(1) < squareNameTwo.charAt(1)){ // to the top v.add(squares[numberBetweenChars + j][secondNumber + j]); } else{ // to the bottom v.add(squares[numberBetweenChars + j][secondNumber - j]); } } else if(squareNameOne.charAt(0) > squareNameTwo.charAt(0)){ // to the left if(squareNameOne.charAt(1) < squareNameTwo.charAt(1)){ // to the top v.add(squares[numberBetweenChars - j][secondNumber + j]); } else{ // to the bottom v.add(squares[numberBetweenChars - j][secondNumber - j]); } } } // if equals, no squares between, empty return (Square[]) v.toArray(new Square[0]); } protected boolean isKnightMove(String squareNameOne, String squareNameTwo){ // get all possible squares char letter = squareNameOne.charAt(0); int number = Integer.parseInt(squareNameOne.substring(1, 2)); String[] knightMoves = knightMoves(letter, number); // is one of this the second square ? for (int i = 0; i < knightMoves.length; i++) { if(knightMoves[i] != null && knightMoves[i].equals(squareNameTwo)) return true; } return false; } protected String[] knightMoves(final char letter, final int number) { String[] knightMoves = new String[8]; if( (char)(letter + 2) <= 'h' && (int)(number + 1) <= 8 ) knightMoves[0] = "" + (char)(letter + 2) + (int)(number + 1); if( (char)(letter + 2) <= 'h' && (int)(number - 1) >= 1 ) knightMoves[1] = "" + (char)(letter + 2) + (int)(number - 1); if( (char)(letter - 2) >= 'a' && (int)(number + 1) <= 8 ) knightMoves[2] = "" + (char)(letter - 2) + (int)(number + 1); if( (char)(letter - 2) >= 'a' && (int)(number - 1) >= 1 ) knightMoves[3] = "" + (char)(letter - 2) + (int)(number - 1); if( (char)(letter + 1) <= 'h' && (int)(number + 2) <= 8 ) knightMoves[4] = "" + (char)(letter + 1) + (int)(number + 2); if( (char)(letter + 1) <= 'h' && (int)(number - 2) >= 1 ) knightMoves[5] = "" + (char)(letter + 1) + (int)(number - 2); if( (char)(letter - 1) >= 'a' && (int)(number + 2) <= 8 ) knightMoves[6] = "" + (char)(letter - 1) + (int)(number + 2); if( (char)(letter - 1) >= 'a' && (int)(number - 2) >= 1 ) knightMoves[7] = "" + (char)(letter - 1) + (int)(number - 2); return knightMoves; } protected boolean isHorizontal(String squareNameOne, String squareNameTwo){ if(squareNameOne.charAt(1) == squareNameTwo.charAt(1)) return true; else return false; } protected boolean isVertical(String squareNameOne, String squareNameTwo){ if(squareNameOne.charAt(0) == squareNameTwo.charAt(0)) return true; else return false; } /** * true if squares are next to each other */ protected boolean isNextSquare(String squareNameOne, String squareNameTwo){ // difference between chars is the same as difference between numbers int i = Math.abs(squareNameOne.charAt(0) - squareNameTwo.charAt(0)); int j = Math.abs(squareNameOne.charAt(1) - squareNameTwo.charAt(1)); if( (i == 1 && j<=1) || (i<=1 && j == 1) ) return true; else return false; } protected boolean isDiagonal(String squareNameOne, String squareNameTwo){ // difference between chars is the same as difference between numbers int i = Math.abs(squareNameOne.charAt(0) - squareNameTwo.charAt(0)); int j = Math.abs(squareNameOne.charAt(1) - squareNameTwo.charAt(1)); if(i == j) return true; else return false; } /** start of the game sets the 32 pieses */ protected void setTheStartingPosition() { // white squares[0][1].setPiece(new Pawn("white")); // A2 squares[1][1].setPiece(new Pawn("white")); // B2 squares[2][1].setPiece(new Pawn("white")); // C2 squares[3][1].setPiece(new Pawn("white")); // D2 squares[4][1].setPiece(new Pawn("white")); // E2 squares[5][1].setPiece(new Pawn("white")); // F2 squares[6][1].setPiece(new Pawn("white")); // G2 squares[7][1].setPiece(new Pawn("white")); // H2 // squares[0][0].setPiece(new Rook("white")); // A1 squares[1][0].setPiece(new Knight("white")); // B2 squares[2][0].setPiece(new Bishop("white")); // C3 squares[3][0].setPiece(new Queen("white")); // D4 squares[4][0].setPiece(new King("white")); // E5 squares[5][0].setPiece(new Bishop("white")); // F6 squares[6][0].setPiece(new Knight("white")); // G7 squares[7][0].setPiece(new Rook("white")); // H8 // black squares[0][6].setPiece(new Pawn("black")); // A2 squares[1][6].setPiece(new Pawn("black")); // B2 squares[2][6].setPiece(new Pawn("black")); // C2 squares[3][6].setPiece(new Pawn("black")); // D2 squares[4][6].setPiece(new Pawn("black")); // E2 squares[5][6].setPiece(new Pawn("black")); // F2 squares[6][6].setPiece(new Pawn("black")); // G2 squares[7][6].setPiece(new Pawn("black")); // H2 // squares[0][7].setPiece(new Rook("black")); // A1 squares[1][7].setPiece(new Knight("black")); // B2 squares[2][7].setPiece(new Bishop("black")); // C3 squares[3][7].setPiece(new Queen("black")); // D4 squares[4][7].setPiece(new King("black")); // E5 squares[5][7].setPiece(new Bishop("black")); // F6 squares[6][7].setPiece(new Knight("black")); // G7 squares[7][7].setPiece(new Rook("black")); // H8 } boolean isOneForward(String color, String movePieceFrom, String movePieceTo) { int firstNumber = Integer.parseInt(movePieceFrom.substring(1, 2)); int secondNumber = Integer.parseInt(movePieceTo.substring(1, 2)); char firstLetter = movePieceFrom.charAt(0); char secondLetter = movePieceTo.charAt(0); if( firstNumber > 8 || firstNumber < 1 ) return false; if( secondNumber > 8 || secondNumber < 1 ) return false; if(color.contentEquals("white")){ if( (secondNumber - firstNumber) == 1 && secondLetter == firstLetter) return true; } else if(color.contentEquals("black")){ if( (firstNumber - secondNumber) == 1 && secondLetter == firstLetter ) return true; } return false; } boolean isTwoForward(String color, String movePieceFrom, String movePieceTo) { int firstNumber = Integer.parseInt(movePieceFrom.substring(1, 2)); int secondNumber = Integer.parseInt(movePieceTo.substring(1, 2)); char firstLetter = movePieceFrom.charAt(0); char secondLetter = movePieceTo.charAt(0); // think not nesessary, already tested if( firstNumber > 8 || firstNumber < 1 ) return false; if( secondNumber > 8 || secondNumber < 1 ) return false; if(color.contentEquals("white")){ if( firstNumber == 2 && (secondNumber - firstNumber) == 2 && secondLetter == firstLetter) return true; } else if(color.contentEquals("black")){ if( firstNumber == 7 && (firstNumber - secondNumber) == 2 && secondLetter == firstLetter) return true; } return false; } /** * test if pawn goes one forward and to the side */ boolean isExchange(String color, String movePieceFrom, String movePieceTo) { int firstNumber = Integer.parseInt(movePieceFrom.substring(1, 2)); int secondNumber = Integer.parseInt(movePieceTo.substring(1, 2)); char firstLetter = movePieceFrom.charAt(0); char secondLetter = movePieceTo.charAt(0); // think not nesessary, already tested if( firstNumber > 8 || firstNumber < 1 ) return false; if( secondNumber > 8 || secondNumber < 1 ) return false; if( firstLetter > 'h' || firstLetter < 'a' ) return false; if( secondLetter > 'h' || secondLetter < 'a' ) return false; if(color.contentEquals("white")){ if( (secondNumber - firstNumber) == 1 && Math.abs(secondLetter - firstLetter) == 1 ) return true; } else if(color.contentEquals("black")){ if( (firstNumber - secondNumber) == 1 && Math.abs(secondLetter - firstLetter) == 1 ) return true; } return false; } /** * is exchange, but previous move was move opposite pawn by two and pawn is exchanging where its no piece */ boolean isExchange2(String color, String movePieceFrom, String movePieceTo) { if(isExchange(color, movePieceFrom, movePieceTo) && Game.previousPawnMove.equals(movePieceTo)) // fill this should be done somewhere already return true; else return false; } }