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 }