chess/src/main/java/org/apidesign/html/demo/chess/Rules.java
branchchess
changeset 51 3f1866fdb2a1
parent 49 945fbfff28f3
child 53 bc0094a5f88c
     1.1 --- a/chess/src/main/java/org/apidesign/html/demo/chess/Rules.java	Tue Sep 24 22:20:24 2013 +0200
     1.2 +++ b/chess/src/main/java/org/apidesign/html/demo/chess/Rules.java	Tue Sep 24 22:37:17 2013 +0200
     1.3 @@ -23,6 +23,9 @@
     1.4   */
     1.5  package org.apidesign.html.demo.chess;
     1.6  
     1.7 +import java.util.ArrayList;
     1.8 +import java.util.List;
     1.9 +
    1.10  /** Common chess rules.
    1.11   *
    1.12   * @author Jaroslav Tulach <jtulach@netbeans.org>
    1.13 @@ -51,6 +54,7 @@
    1.14                  computeAccessible(b, s, 0, -1, 1);
    1.15                  computeAccessible(b, s, 0, 1, 1);
    1.16                  computeAccessible(b, s, -1, 0, 1);
    1.17 +                checkRochade(b, s);
    1.18                  break;
    1.19              case ROCK:
    1.20                  moveRock(b, s);
    1.21 @@ -114,19 +118,19 @@
    1.22      }
    1.23      
    1.24      private static void pawns(Board b, Square s) {
    1.25 -        final boolean white = s.getPieceColor() == BoardModel.ColorType.WHITE;
    1.26 +        final boolean white = s.getPieceColor() == Color.W;
    1.27          int dy = white ? 1 : -1;
    1.28          Square step = BoardModel.findSquare(b, (char)s.getX(), s.getY() + dy);
    1.29          if (step != null && step.getPiece() == null) {
    1.30              step.setAccessible(true);
    1.31              if ((s.getY() == 2 && white) || (s.getY() == 7 && !white)) {
    1.32                  Square nextSTep = BoardModel.findSquare(b, (char)s.getX(), step.getY() + dy);
    1.33 -                if (nextSTep != null && step.getPiece() == null) {
    1.34 +                if (nextSTep != null && step.getPiece() == null && nextSTep.getPiece() == null) {
    1.35                      nextSTep.setAccessible(true);
    1.36                  }
    1.37              }
    1.38          }
    1.39 -        BoardModel.ColorType opposite = white ? BoardModel.ColorType.BLACK : BoardModel.ColorType.WHITE;
    1.40 +        Color opposite = white ? Color.B : Color.W;
    1.41          Square takeLeft = BoardModel.findSquare(b, (char)(s.getX() - 1), s.getY() + dy);
    1.42          if (takeLeft != null && takeLeft.getPieceColor() == opposite) {
    1.43              takeLeft.setAccessible(true);
    1.44 @@ -135,5 +139,176 @@
    1.45          if (takeRight != null && takeRight.getPieceColor() == opposite) {
    1.46              takeRight.setAccessible(true);
    1.47          }
    1.48 +        if ((white && s.getY() == 5) || (!white && s.getY() == 4)) {
    1.49 +            int enPassantFrom = white ? 7 : 2;
    1.50 +            int enPassantTo = white ? 5 : 4;
    1.51 +            if (!b.getMoves().isEmpty()) {
    1.52 +                Move last = b.getMoves().get(b.getMoves().size() - 1);
    1.53 +                if (
    1.54 +                    last.getPiece() == BoardModel.PieceType.PAWN &&
    1.55 +                    last.getFrom().getY() == enPassantFrom &&
    1.56 +                    last.getTo().getY() == enPassantTo
    1.57 +                ) {
    1.58 +                    if (takeLeft != null && last.getFrom().getX() == s.getX() - 1) {
    1.59 +                        takeLeft.setAccessible(true);
    1.60 +                    }
    1.61 +                    if (takeRight != null && last.getFrom().getX() == s.getX() + 1) {
    1.62 +                        takeRight.setAccessible(true);
    1.63 +                    }
    1.64 +                }
    1.65 +            }
    1.66 +        }
    1.67 +    }
    1.68 +
    1.69 +    static Board createBoard() {
    1.70 +        Board b = new Board();
    1.71 +        initBoardField(b);
    1.72 +        initBoard(b);
    1.73 +        return b;
    1.74 +    }
    1.75 +
    1.76 +    private static void initBoardField(Board b) {
    1.77 +        List<Row> addRows = new ArrayList<>(8);
    1.78 +        for (int i = 8; i > 0; i--) {
    1.79 +            Square[] arr = new Square[8];
    1.80 +            for (char j = 'A'; j <= 'H'; j++) {
    1.81 +                arr[j - 'A'] = new Square(
    1.82 +                    new Position(j, i),
    1.83 +                    (i + j) % 2 == 1 ? Color.W : Color.B,
    1.84 +                    null, null, // figure
    1.85 +                    false, false, false
    1.86 +                );
    1.87 +            }
    1.88 +            addRows.add(new Row(arr));
    1.89 +        }
    1.90 +        b.getRows().addAll(addRows);
    1.91 +    }
    1.92 +    
    1.93 +    static void initBoard(Board b) {
    1.94 +        initBoard(b, true);
    1.95 +    }
    1.96 +    private static void initBoard(Board b, boolean init) {
    1.97 +        if (init) {
    1.98 +            b.setTurn(Color.W);
    1.99 +        }
   1.100 +        if (b.getRows().isEmpty()) {
   1.101 +            for (int i = 8; i > 0; i--) {
   1.102 +                Row r = b.getRows().get(8 - i);
   1.103 +                for (char j = 'A'; j <= 'H'; j++) {
   1.104 +                    Square s = r.getColumns().get(j - 'A');
   1.105 +                    s.setAccessible(false);
   1.106 +                    s.setPending(false);
   1.107 +                    r.getColumns().set(j - 'A', s);
   1.108 +                    initialPosition(s, init);
   1.109 +                }
   1.110 +            }
   1.111 +        } else {
   1.112 +            for (Row r : b.getRows()) {
   1.113 +                for (Square square : r.getColumns()) {
   1.114 +                    square.setAccessible(false);
   1.115 +                    square.setPending(false);
   1.116 +                    square.setPiece(null);
   1.117 +                    square.setPieceColor(null);
   1.118 +                    square.setSelected(false);
   1.119 +                    initialPosition(square, init);
   1.120 +                }
   1.121 +            }
   1.122 +        }
   1.123 +        b.setPendingMove(null);
   1.124 +    }
   1.125 +
   1.126 +    private static void initialPosition(Square s, boolean init) {
   1.127 +        int row = s.getPosition().getY();
   1.128 +        char column = s.getPosition().getX();
   1.129 +        s.setPiece(null);
   1.130 +        s.setPieceColor(null);
   1.131 +        if (init) {
   1.132 +            if (row == 2) {
   1.133 +                s.setPiece(BoardModel.PieceType.PAWN);
   1.134 +                s.setPieceColor(Color.W);
   1.135 +            } else if (row == 7) {
   1.136 +                s.setPiece(BoardModel.PieceType.PAWN);
   1.137 +                s.setPieceColor(Color.B);
   1.138 +            } else if (row == 8 || row == 1) {
   1.139 +                s.setPieceColor(row == 1 ? Color.W : Color.B);
   1.140 +                BoardModel.PieceType t;
   1.141 +                switch (column) {
   1.142 +                    case 'A':
   1.143 +                    case 'H':
   1.144 +                        t = BoardModel.PieceType.ROCK;
   1.145 +                        break;
   1.146 +                    case 'B':
   1.147 +                    case 'G':
   1.148 +                        t = BoardModel.PieceType.KNIGHT;
   1.149 +                        break;
   1.150 +                    case 'C':
   1.151 +                    case 'F':
   1.152 +                        t = BoardModel.PieceType.BISHOP;
   1.153 +                        break;
   1.154 +                    case 'D':
   1.155 +                        t = BoardModel.PieceType.QUEEN;
   1.156 +                        break;
   1.157 +                    default:
   1.158 +                        t = BoardModel.PieceType.KING;
   1.159 +                        break;
   1.160 +                }
   1.161 +                s.setPiece(t);
   1.162 +            }
   1.163 +        }
   1.164 +    }
   1.165 +
   1.166 +    static void initBoard(
   1.167 +        Board board, List<String> whites, List<String> blacks, Color turn
   1.168 +    ) {
   1.169 +        initBoard(board, false);
   1.170 +        for (String w : whites) {
   1.171 +            assert w.length() == 3 : "Expecting three letter string: '" + w + "'";
   1.172 +            w = w.toUpperCase();
   1.173 +            char column = w.charAt(1);
   1.174 +            int row = (w.charAt(2) - '0');
   1.175 +            
   1.176 +            Square s = BoardModel.findSquare(board, column, row);
   1.177 +            s.setPieceColor(Color.W);
   1.178 +            s.setPiece(BoardModel.PieceType.fromNotation(w.charAt(0)));
   1.179 +        }
   1.180 +        for (String w : blacks) {
   1.181 +            assert w.length() == 3 : "Expecting three letter string: '" + w + "'";
   1.182 +            w = w.toUpperCase();
   1.183 +            char column = w.charAt(1);
   1.184 +            int row = (w.charAt(2) - '0');
   1.185 +            
   1.186 +            Square s = BoardModel.findSquare(board, column, row);
   1.187 +            s.setPieceColor(Color.B);
   1.188 +            s.setPiece(BoardModel.PieceType.fromNotation(w.charAt(0)));
   1.189 +        }
   1.190 +        board.setTurn(turn);
   1.191 +    }
   1.192 +
   1.193 +    private static void checkRochade(Board b, Square s) {
   1.194 +        if (s.getPosition().getX() == 'E') {
   1.195 +            int y = s.getPosition().getY();
   1.196 +            final Square gRow = BoardModel.findSquare(b, 'G', y);
   1.197 +            if (
   1.198 +                BoardModel.findSquare(b, 'H', y).getPiece() == BoardModel.PieceType.ROCK 
   1.199 +                &&
   1.200 +                BoardModel.findSquare(b, 'F', y).getPiece() == null
   1.201 +                &&
   1.202 +                gRow.getPiece() == null
   1.203 +            ) {
   1.204 +                gRow.setAccessible(true);
   1.205 +            }
   1.206 +            final Square cRow = BoardModel.findSquare(b, 'C', y);
   1.207 +            if (
   1.208 +                BoardModel.findSquare(b, 'A', y).getPiece() == BoardModel.PieceType.ROCK 
   1.209 +                &&
   1.210 +                BoardModel.findSquare(b, 'B', y).getPiece() == null
   1.211 +                &&
   1.212 +                BoardModel.findSquare(b, 'D', y).getPiece() == null
   1.213 +                &&
   1.214 +                cRow.getPiece() == null
   1.215 +            ) {
   1.216 +                cRow.setAccessible(true);
   1.217 +            }
   1.218 +        }
   1.219      }
   1.220  }