OOP_Groupe1A2_Project/OOP_1A2_Project/src/backend/Board.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
}
}