3 * @purpose Represent a quantum chess board
6 import java.util.Vector;
10 public static final int WIDTH = 8;
11 public static final int HEIGHT = 8;
15 this.grid = new Square[Board.WIDTH][Board.HEIGHT];
16 for (int x = 0; x < Board.WIDTH; ++x)
18 for (int y = 0; y < Board.HEIGHT; ++y)
20 this.grid[x][y] = new Square(x, y, null);
21 this.grid[x][y].x = x;
22 this.grid[x][y].y = y;
25 Piece.Colour[] colours = {Piece.Colour.BLACK, Piece.Colour.WHITE};
27 this.white = new Vector<Piece>();
28 this.black = new Vector<Piece>();
29 for (int i = 0; i < colours.length; ++i)
31 Vector<Piece> p = pieces(colours[i]);
34 int y = (i == 0) ? 1 : Board.HEIGHT-2;
35 for (int x = 0; x < Board.WIDTH; ++x)
37 p.add(new Piece(x, y, colours[i], Piece.Type.PAWN, Piece.Type.UNKNOWN));
41 y = (i == 0) ? 1 : Board.HEIGHT-1;
43 p.add(new Piece(0, y, colours[i], Piece.Type.ROOK, Piece.Type.UNKNOWN));
44 p.add(new Piece(1, y, colours[i], Piece.Type.KNIGHT, Piece.Type.UNKNOWN));
45 p.add(new Piece(2, y, colours[i], Piece.Type.BISHOP, Piece.Type.UNKNOWN));
46 Piece k = new Piece(3, y, colours[i], Piece.Type.KING, Piece.Type.KING);
52 p.add(new Piece(4, y, colours[i], Piece.Type.QUEEN, Piece.Type.UNKNOWN));
53 p.add(new Piece(5, y, colours[i], Piece.Type.BISHOP, Piece.Type.UNKNOWN));
54 p.add(new Piece(6, y, colours[i], Piece.Type.KNIGHT, Piece.Type.UNKNOWN));
55 p.add(new Piece(7, y, colours[i], Piece.Type.ROOK, Piece.Type.UNKNOWN));
57 for (int j = 0; j < p.size(); ++j)
60 grid[pp.x][pp.y].piece = pp;
68 public Vector<Piece> pieces(Piece.Colour colour)
70 return ((colour == Piece.Colour.WHITE) ? white : black);
72 public Piece king(Piece.Colour colour)
74 return ((colour == Piece.Colour.WHITE) ? white_king : black_king);
77 public void Update_move(int x, int y, int x2, int y2)
79 Square s1 = grid[x][y];
80 Square s2 = grid[x2][y2];
83 Vector<Piece> v = pieces(s2.piece.colour);
86 if (s2.piece == king(s2.piece.colour))
88 if (s2.piece.colour == Piece.Colour.WHITE)
100 public void Update_select(int x, int y, int index, String type) throws Exception
102 Square s = grid[x][y];
103 s.piece.type_index = index;
104 s.piece.types[index] = Piece.str2type(type);
105 s.piece.current_type = s.piece.types[index];
109 public Square Get_square(int x, int y)
111 return grid[x][y]; // get square on board
114 public void Get_moves(Piece p, Vector<Square> v)
118 if (p.current_type == Piece.Type.KING)
124 Move(p, x+1, y+1, v);
125 Move(p, x+1, y-1, v);
126 Move(p, x-1, y+1, v);
127 Move(p, x-1, y-1, v);
129 else if (p.current_type == Piece.Type.KNIGHT)
131 Move(p, x+2, y+1, v);
132 Move(p, x+2, y-1, v);
133 Move(p, x-2, y+1, v);
134 Move(p, x-2, y-1, v);
135 Move(p, x+1, y+2, v);
136 Move(p, x-1, y+2, v);
137 Move(p, x+1, y-2, v);
138 Move(p, x-1, y-2, v);
140 else if (p.current_type == Piece.Type.PAWN)
142 int y1 = (p.colour == Piece.Colour.WHITE) ? Board.HEIGHT-2 : 1;
143 int y2 = (p.colour == Piece.Colour.WHITE) ? y1 - 2 : y1 + 2;
144 if (p.types[0] == Piece.Type.PAWN && p.y == y1)
149 y2 = (p.colour == Piece.Colour.WHITE) ? y - 1 : y + 1;
152 if (Valid_position(x-1, y2) && grid[x-1][y2].piece != null)
154 if (Valid_position(x+1, y2) && grid[x+1][y2].piece != null)
157 else if (p.current_type == Piece.Type.BISHOP)
164 else if (p.current_type == Piece.Type.ROOK)
171 else if (p.current_type == Piece.Type.QUEEN)
185 // determine if position is on the board
186 public boolean Valid_position(int x, int y)
188 return (x >= 0 && x <= Board.WIDTH-1 && y >= 0 && y <= Board.HEIGHT-1);
191 private Square[][] grid;
194 private Vector<Piece> white;
195 private Vector<Piece> black;
196 private Piece white_king;
197 private Piece black_king;
199 // Add a move to the vector if it is valid
200 private void Move(Piece p, int x, int y, Vector<Square> v)
202 if (Valid_position(x, y) && (grid[x][y].piece == null || grid[x][y].piece.colour != p.colour))
208 // Add all valid moves in a direction, stopping at the first invalid move
209 private void Scan(Piece p, int vx, int vy, Vector<Square> v)
213 while (Valid_position(x, y) && (grid[x][y].piece == null || grid[x][y].piece.colour != p.colour))
217 if (grid[x][y].piece != null)