242 lines
6.4 KiB
Java
242 lines
6.4 KiB
Java
package backend;
|
|
|
|
import java.util.ArrayList;
|
|
|
|
public class Board {
|
|
|
|
private int width;
|
|
private int height;
|
|
private int turnNumber;
|
|
private boolean isWhiteTurn;
|
|
private ArrayList<Piece> pieces;
|
|
|
|
public Board(int colNum, int lineNum) {
|
|
this.width = colNum;
|
|
this.height = lineNum;
|
|
this.turnNumber = 0;
|
|
this.isWhiteTurn = true;
|
|
this.pieces = new ArrayList<>();
|
|
}
|
|
|
|
public int getWidth() {
|
|
return width;
|
|
}
|
|
|
|
public int getHeight() {
|
|
return height;
|
|
}
|
|
|
|
public int getTurnNumber() {
|
|
return turnNumber;
|
|
}
|
|
|
|
public boolean isTurnWhite() {
|
|
return isWhiteTurn;
|
|
}
|
|
|
|
public void setPiece(boolean isWhite, PieceType type, int x, int y) {
|
|
for (int i = 0; i < pieces.size(); i++) {
|
|
Piece p = pieces.get(i);
|
|
if (p.getX() == x && p.getY() == y) {
|
|
pieces.remove(i);
|
|
break;
|
|
}
|
|
}
|
|
Piece newPiece = new Piece( x, y, type,isWhite);
|
|
pieces.add(newPiece);
|
|
}
|
|
|
|
public void populateBoard() {
|
|
//TODO
|
|
cleanBoard();
|
|
|
|
PieceType pawn = PieceType.Pawn;
|
|
PieceType rook = PieceType.Rook;
|
|
PieceType knight = PieceType.Knight;
|
|
PieceType bishop = PieceType.Bishop;
|
|
PieceType queen = PieceType.Queen;
|
|
PieceType king = PieceType.King;
|
|
|
|
//all the pawns
|
|
for (int x=0; x<8; x++) {
|
|
pieces.add(new Piece(x, 1, pawn, false));
|
|
pieces.add(new Piece(x, 6, pawn, true));
|
|
}
|
|
|
|
//black pieces
|
|
pieces.add(new Piece(0, 0, rook, false));
|
|
pieces.add(new Piece(1, 0, knight, false));
|
|
pieces.add(new Piece(2, 0, bishop, false));
|
|
pieces.add(new Piece(3, 0, queen, false));
|
|
pieces.add(new Piece(4, 0, king, false));
|
|
pieces.add(new Piece(5, 0, bishop, false));
|
|
pieces.add(new Piece(6, 0, knight, false));
|
|
pieces.add(new Piece(7, 0, rook, false));
|
|
|
|
|
|
//white pieces
|
|
pieces.add(new Piece(0, 7, rook, true));
|
|
pieces.add(new Piece(1, 7, knight, true));
|
|
pieces.add(new Piece(2, 7, bishop, true));
|
|
pieces.add(new Piece(3, 7, queen, true));
|
|
pieces.add(new Piece(4, 7, king, true));
|
|
pieces.add(new Piece(5, 7, bishop, true));
|
|
pieces.add(new Piece(6, 7, knight, true));
|
|
pieces.add(new Piece(7, 7, rook, true));
|
|
|
|
|
|
}
|
|
|
|
public void cleanBoard() {
|
|
pieces.clear();
|
|
}
|
|
|
|
public String toString() {
|
|
String result = "";
|
|
for (int y = 0; y < height; y++) {
|
|
for (int x = 0; x < width; x++) {
|
|
String c = ".";
|
|
for (Piece p : pieces) {
|
|
if (p.getX() == x && p.getY() == y) {
|
|
String letter = p.getType().getSummary();
|
|
if (p.isWhite()) {
|
|
c = "W" + letter;
|
|
} else {
|
|
c = "B" + letter;
|
|
}
|
|
}
|
|
}
|
|
result += c + " ";
|
|
}
|
|
result += "\n";
|
|
}
|
|
return result;
|
|
}
|
|
|
|
public ArrayList<Piece> getPieces() {
|
|
ArrayList<Piece> result = new ArrayList<>();
|
|
for (Piece p : this.pieces) {
|
|
result.add(p);
|
|
}
|
|
return result;
|
|
}
|
|
private Piece getPieceAt(int x, int y) {
|
|
for (Piece p : pieces) {
|
|
if (p.getX() == x && p.getY() == y) {
|
|
return p;
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
private Integer selectedX = null;
|
|
private Integer selectedY = null;
|
|
|
|
public void userTouch(int x, int y) {
|
|
Piece clickedPiece = getPieceAt(x, y);
|
|
|
|
if (selectedX == null || selectedY == null) {
|
|
// No piece selected yet
|
|
if (clickedPiece != null && clickedPiece.isWhite() == isWhiteTurn) {
|
|
selectedX = x;
|
|
selectedY = y;
|
|
}
|
|
} else {
|
|
if (selectedX == x && selectedY == y) {
|
|
// Unselection
|
|
selectedX = null;
|
|
selectedY = null;
|
|
} else {
|
|
// Attempt to move
|
|
Piece selectedPiece = getPieceAt(selectedX, selectedY);
|
|
if (selectedPiece != null) {
|
|
// Remove captured piece (if any)
|
|
Piece toRemove = getPieceAt(x, y);
|
|
if (toRemove != null && toRemove.isWhite() != isWhiteTurn) {
|
|
pieces.remove(toRemove);
|
|
}
|
|
|
|
// Move piece
|
|
selectedPiece.moveTo(x, y);
|
|
|
|
// Advance turn
|
|
turnNumber++;
|
|
isWhiteTurn = !isWhiteTurn;
|
|
|
|
// Unselect
|
|
selectedX = null;
|
|
selectedY = null;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
public boolean isSelected(int x, int y) {
|
|
// Check if the selected coordinates match the given x and y
|
|
if (selectedX != null && selectedY != null) {
|
|
return selectedX == x && selectedY == y;
|
|
}
|
|
return false;
|
|
}
|
|
/* saving-loading feature :*/
|
|
|
|
public String[] toFileRep() {
|
|
ArrayList<String> lines = new ArrayList<>();
|
|
|
|
lines.add(width + " " + height + " " + turnNumber + " " + isWhiteTurn);
|
|
|
|
for (Piece p : pieces) {
|
|
lines.add(p.getX() + " " + p.getY() + " " + p.getType().name() + " " + p.isWhite());
|
|
}
|
|
|
|
return lines.toArray(new String[0]);
|
|
}
|
|
|
|
public Board(String[] array) {
|
|
String[] firstLine = array[0].split(" ");
|
|
this.width = Integer.parseInt(firstLine[0]);
|
|
this.height = Integer.parseInt(firstLine[1]);
|
|
this.turnNumber = Integer.parseInt(firstLine[2]);
|
|
this.isWhiteTurn = Boolean.parseBoolean(firstLine[3]);
|
|
this.pieces = new ArrayList<>();
|
|
|
|
// Remaining lines: x y PieceType isWhite
|
|
for (int i = 1; i < array.length; i++) {
|
|
String[] line = array[i].split(" ");
|
|
int x = Integer.parseInt(line[0]);
|
|
int y = Integer.parseInt(line[1]);
|
|
PieceType type = PieceType.valueOf(line[2]);
|
|
boolean isWhite = Boolean.parseBoolean(line[3]);
|
|
pieces.add(new Piece(x, y, type, isWhite));
|
|
}
|
|
|
|
// Optionally reset selection
|
|
selectedX = null;
|
|
selectedY = null;
|
|
}
|
|
|
|
/* The following methods require more work ! */
|
|
|
|
public boolean isHighlighted(int x, int y) {
|
|
//TODO
|
|
return false;
|
|
}
|
|
|
|
public void undoLastMove() {
|
|
//TODO
|
|
|
|
}
|
|
|
|
public Board(Board board) {
|
|
//TODO
|
|
|
|
}
|
|
|
|
public void playMove(Move move) {
|
|
//TODO
|
|
|
|
}
|
|
|
|
}
|