Merge branch 'master' of

https://gitarero.ecam.fr/yohan.montagne/OOP_2B2_Project.git
This commit is contained in:
Tilman Crosetti 2025-05-13 16:25:19 +02:00
commit c9cd74b013
3 changed files with 316 additions and 246 deletions

View File

@ -1,36 +1,48 @@
package backend;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import java.util.ArrayList;
import java.util.LinkedList;
public class Board implements Cloneable {
private int Width;
private int Height;
private ArrayList <Piece> pieces;
private int turnNumber = 0;
private int Width;
private int Height;
private ArrayList <Piece> pieces;
private boolean turnIsWhite = true;
private Integer selectedX = null;
private int turnNumber = 0;
private Integer selectedY = null;
private boolean turnIsWhite = true;
private ArrayList<int[]> highlightedPositions = new ArrayList<>();
private Integer selectedX = null;
private Integer selectedY = null;
private ArrayList<int[]> highlightedPositions = new ArrayList<>();
private LinkedList<ArrayList<Piece>> boardHistory = new LinkedList<>();
/* ====== AUDIO STATE ====== */
private Clip moveClip;
private boolean soundEnabled = false;
public Board(int colNum, int lineNum) {
this.Width=colNum;
this.Height=lineNum;
this.pieces= new ArrayList <> ();
initMoveSound();
}
public int getWidth() {
@ -42,41 +54,41 @@ private ArrayList<int[]> highlightedPositions = new ArrayList<>();
}
public int getTurnNumber() {
return turnNumber;
}
public boolean isTurnWhite() {
return turnIsWhite;
}
public void setPiece(boolean isWhite, PieceType type, int x, int y) {
// Create a new instance of the specific piece type
Piece newPiece;
switch (type) {
case Pawn:
newPiece = new Pawn(isWhite, x, y);
break;
case King:
newPiece = new King(isWhite, x, y);
break;
case Queen:
newPiece = new Queen(isWhite, x, y);
break;
case Rook:
newPiece = new Rook(isWhite, x, y);
break;
case Bishop:
newPiece = new Bishop(isWhite, x, y);
break;
case Knight:
newPiece = new Knight(isWhite, x, y);
break;
default:
throw new IllegalArgumentException("Unknown piece type");
}
pieces.add(newPiece);
// Create a new instance of the specific piece type
Piece newPiece;
switch (type) {
case Pawn:
newPiece = new Pawn(isWhite, x, y);
break;
case King:
newPiece = new King(isWhite, x, y);
break;
case Queen:
newPiece = new Queen(isWhite, x, y);
break;
case Rook:
newPiece = new Rook(isWhite, x, y);
break;
case Bishop:
newPiece = new Bishop(isWhite, x, y);
break;
case Knight:
newPiece = new Knight(isWhite, x, y);
break;
default:
throw new IllegalArgumentException("Unknown piece type");
}
pieces.add(newPiece);
}
public void populateBoard() {
@ -102,148 +114,175 @@ private ArrayList<int[]> highlightedPositions = new ArrayList<>();
for (int i=0;i<8;i++) {
setPiece(false,PieceType.Pawn,i,6);
}
}
public void cleanBoard() {
pieces.clear();
selectedX = null;
selectedY = null;
pieces.clear();
selectedX = null;
selectedY = null;
}
public ArrayList<Piece> getPieces() {
return pieces;
return pieces;
}
public String toString() {
StringBuilder sb = new StringBuilder();
for (int y = 0; y < Height; y++) {
for (int x = 0; x < Width; x++) {
Piece pieceAtPos = null;
for (Piece p : pieces) {
if (p.getX() == x && p.getY() == y) {
pieceAtPos = p;
break;
}
}
for (int y = 0; y < Height; y++) {
for (int x = 0; x < Width; x++) {
Piece pieceAtPos = null;
for (Piece p : pieces) {
if (p.getX() == x && p.getY() == y) {
pieceAtPos = p;
break;
}
}
if (pieceAtPos != null) {
char colorChar = pieceAtPos.isWhite() ? 'W' : 'B';
String typeChar = pieceAtPos.getType().getSummary();
sb.append(colorChar).append(typeChar);
} else {
sb.append(", ");
}
if (pieceAtPos != null) {
char colorChar = pieceAtPos.isWhite() ? 'W' : 'B';
String typeChar = pieceAtPos.getType().getSummary();
sb.append(colorChar).append(typeChar);
} else {
sb.append(", ");
}
sb.append(" ");
}
sb.append("\n");
}
sb.append(" ");
}
sb.append("\n");
}
sb.append("Turn: ").append(turnIsWhite ? "White" : "Black");
sb.append(" (Turn number: ").append(turnNumber).append(")\n");
sb.append("Turn: ").append(turnIsWhite ? "White" : "Black");
sb.append(" (Turn number: ").append(turnNumber).append(")\n");
return sb.toString();
return sb.toString();
}
public void userTouch(int x, int y) {
if (selectedX == null && selectedY == null) {
Piece pieceAtPos = getPieceAt(x, y);
if (pieceAtPos != null) {
selectedX = x;
selectedY = y;
}
} else {
if (selectedX == x && selectedY == y) {
selectedX = null;
selectedY = null;
} else {
Piece pieceToMove = getPieceAt(selectedX, selectedY);
if (pieceToMove != null) {
Piece pieceAtDestination = getPieceAt(x, y);
if (pieceAtDestination == null || pieceAtDestination.isWhite() != pieceToMove.isWhite()) {
if (pieceAtDestination != null) {
pieces.remove(pieceAtDestination);
}
pieces.remove(pieceToMove);
if (selectedX == null && selectedY == null) {
Piece pieceAtPos = getPieceAt(x, y);
if (pieceAtPos != null) {
selectedX = x;
selectedY = y;
}
} else {
if (selectedX == x && selectedY == y) {
selectedX = null;
selectedY = null;
} else {
Piece pieceToMove = getPieceAt(selectedX, selectedY);
if (pieceToMove != null) {
Piece pieceAtDestination = getPieceAt(x, y);
if (pieceAtDestination == null ||
pieceAtDestination.isWhite() != pieceToMove.isWhite()) {
// Create a new instance of the specific piece type
Piece newPiece;
switch (pieceToMove.getType()) {
case Pawn:
newPiece = new Pawn(pieceToMove.isWhite(), x, y);
break;
case King:
newPiece = new King(pieceToMove.isWhite(), x, y);
break;
case Queen:
newPiece = new Queen(pieceToMove.isWhite(), x, y);
break;
case Rook:
newPiece = new Rook(pieceToMove.isWhite(), x, y);
break;
case Bishop:
newPiece = new Bishop(pieceToMove.isWhite(), x, y);
break;
case Knight:
newPiece = new Knight(pieceToMove.isWhite(), x, y);
break;
default:
throw new IllegalArgumentException("Unknown piece type");
}
pieces.add(newPiece);
saveStateToHistory();
if (pieceAtDestination != null) {
pieces.remove(pieceAtDestination);
}
pieces.remove(pieceToMove);
// Create a new instance of the specific piece type
Piece newPiece = makeNewPiece(pieceToMove.getType(),
pieceToMove.isWhite, x, y);
pieces.add(newPiece);
playMoveSound();
turnNumber++;
turnIsWhite = !turnIsWhite;
}
}
selectedX = null;
selectedY = null;
}
}
turnNumber++;
turnIsWhite = !turnIsWhite;
}
}
selectedX = null;
selectedY = null;
}
}
}
private Piece makeNewPiece(PieceType type, boolean isWhite, int x, int y) {
Piece newPiece;
switch (type) {
case Pawn:
newPiece = new Pawn(isWhite, x, y);
break;
case King:
newPiece = new King(isWhite, x, y);
break;
case Queen:
newPiece = new Queen(isWhite, x, y);
break;
case Rook:
newPiece = new Rook(isWhite, x, y);
break;
case Bishop:
newPiece = new Bishop(isWhite, x, y);
break;
case Knight:
newPiece = new Knight(isWhite, x, y);
break;
default:
throw new IllegalArgumentException("Unknown piece type");
}
return newPiece;
}
private void saveStateToHistory() {
ArrayList<Piece> clonedList = new ArrayList<>();
for(int i =0; i<pieces.size();i++) {
Piece pieceToCopy = pieces.get(i);
Piece copy = makeNewPiece(
pieceToCopy.getType(),
pieceToCopy.isWhite(),
pieceToCopy.getX(),
pieceToCopy.getY());
clonedList.add(copy);
}
boardHistory.add(clonedList);
}
public Piece getPieceAt(int x, int y) {
for (Piece piece : pieces) {
if (piece.getX() == x && piece.getY() == y) {
return piece;
}
}
return null;
for (Piece piece : pieces) {
if (piece.getX() == x && piece.getY() == y) {
return piece;
}
}
return null;
}
public boolean isSelected(int x, int y) {
return selectedX != null && selectedY != null && selectedX == x && selectedY == y;
return selectedX != null && selectedY != null && selectedX == x && selectedY == y;
}
/* saving-loading feature :*/
public String[] toFileRep() {
String[] lines = new String[Height + 1];
for (int y = 0; y < Height; y++) {
StringBuilder row = new StringBuilder();
for (int x = 0; x < Width; x++) {
Piece p = getPieceAt(x, y);
if (p != null) {
row.append (p.isWhite() ? "W" : "B").append(p.getType().getSummary());
}
row.append(x < Width - 1? "," : "");
}
lines[y] = row.toString();
}
lines[Height] = isTurnWhite() ? "W" : "B";
return lines;
String[] lines = new String[Height + 1];
for (int y = 0; y < Height; y++) {
StringBuilder row = new StringBuilder();
for (int x = 0; x < Width; x++) {
Piece p = getPieceAt(x, y);
if (p != null) {
row.append (p.isWhite() ? "W" : "B").append(p.getType().getSummary());
}
row.append(x < Width - 1? "," : "");
}
lines[y] = row.toString();
}
lines[Height] = isTurnWhite() ? "W" : "B";
return lines;
}
public Board(String[] array) {
@ -272,8 +311,8 @@ private ArrayList<int[]> highlightedPositions = new ArrayList<>();
turnIsWhite = false;
}
}
/* The following methods require more work ! */
public boolean isHighlighted(int x, int y) {
@ -282,111 +321,142 @@ private ArrayList<int[]> highlightedPositions = new ArrayList<>();
}
public void undoLastMove() {
//TODO
pieces = boardHistory.getLast();
boardHistory.removeLast();
}
public Board(Board board) {
//TODO
}
public void playMove(Move move) {
Piece pieceToMove = getPieceAt(move.getFromCol(), move.getFromRow());
if (pieceToMove != null) {
Piece pieceAtDestination = getPieceAt(move.getToCol(), move.getToRow());
if (pieceAtDestination != null) {
pieces.remove(pieceAtDestination);
}
pieces.remove(pieceToMove);
Piece pieceToMove = getPieceAt(move.getFromCol(), move.getFromRow());
if (pieceToMove != null) {
Piece pieceAtDestination = getPieceAt(move.getToCol(), move.getToRow());
if (pieceAtDestination != null) {
pieces.remove(pieceAtDestination);
}
pieces.remove(pieceToMove);
// Create a new instance of the specific piece type
Piece newPiece;
switch (pieceToMove.getType()) {
case Pawn:
newPiece = new Pawn(pieceToMove.isWhite(), move.getToCol(), move.getToRow());
break;
case King:
newPiece = new King(pieceToMove.isWhite(), move.getToCol(), move.getToRow());
break;
case Queen:
newPiece = new Queen(pieceToMove.isWhite(), move.getToCol(), move.getToRow());
break;
case Rook:
newPiece = new Rook(pieceToMove.isWhite(), move.getToCol(), move.getToRow());
break;
case Bishop:
newPiece = new Bishop(pieceToMove.isWhite(), move.getToCol(), move.getToRow());
break;
case Knight:
newPiece = new Knight(pieceToMove.isWhite(), move.getToCol(), move.getToRow());
break;
default:
throw new IllegalArgumentException("Unknown piece type");
}
pieces.add(newPiece);
// Create a new instance of the specific piece type
Piece newPiece;
switch (pieceToMove.getType()) {
case Pawn:
newPiece = new Pawn(pieceToMove.isWhite(), move.getToCol(), move.getToRow());
break;
case King:
newPiece = new King(pieceToMove.isWhite(), move.getToCol(), move.getToRow());
break;
case Queen:
newPiece = new Queen(pieceToMove.isWhite(), move.getToCol(), move.getToRow());
break;
case Rook:
newPiece = new Rook(pieceToMove.isWhite(), move.getToCol(), move.getToRow());
break;
case Bishop:
newPiece = new Bishop(pieceToMove.isWhite(), move.getToCol(), move.getToRow());
break;
case Knight:
newPiece = new Knight(pieceToMove.isWhite(), move.getToCol(), move.getToRow());
break;
default:
throw new IllegalArgumentException("Unknown piece type");
}
pieces.add(newPiece);
turnNumber++;
turnIsWhite = !turnIsWhite;
}
turnNumber++;
turnIsWhite = !turnIsWhite;
}
}
public ArrayList<Move> getAllLegalMoves(boolean isWhite) {
ArrayList<Move> moves = new ArrayList<>();
for (int row = 0; row < 8; row++) {
for (int col = 0; col < 8; col++) {
Piece piece = getPieceAt(row, col);
if (piece != null && piece.isWhite() == isWhite) {
//LinkedList<Move> pieceMoves = piece.getLegalMoves(this, row, col); // This method must exist in Piece
//moves.addAll(pieceMoves);
}
}
}
return moves;
}
public ArrayList<Piece> getAllPieces() {
ArrayList<Piece> pieces = new ArrayList<>();
for (int row = 0; row < 8; row++) {
for (int col = 0; col < 8; col++) {
Piece p = getPieceAt(row, col);
if (p != null) {
pieces.add(p);
}
}
}
return pieces;
}
public boolean isInBounds(int row, int col) {
return row >= 0 && row < 8 && col >= 0 && col < 8;
}
public ArrayList<Move> getAllLegalMoves(boolean isWhite) {
ArrayList<Move> moves = new ArrayList<>();
@Override
public Board clone() {
try {
Board clonedBoard = (Board) super.clone();
for (int row = 0; row < 8; row++) {
for (int col = 0; col < 8; col++) {
Piece piece = getPieceAt(row, col);
if (piece != null && piece.isWhite() == isWhite) {
//LinkedList<Move> pieceMoves = piece.getLegalMoves(this, row, col); // This method must exist in Piece
//moves.addAll(pieceMoves);
}
}
}
// Deep copy the pieces list
clonedBoard.pieces = new ArrayList<>();
for (Piece piece : this.pieces) {
clonedBoard.pieces.add(piece.clone());
}
return moves;
// Copy other fields as necessary
clonedBoard.selectedX = this.selectedX;
clonedBoard.selectedY = this.selectedY;
clonedBoard.turnNumber = this.turnNumber;
clonedBoard.turnIsWhite = this.turnIsWhite;
return clonedBoard;
} catch (CloneNotSupportedException e) {
throw new AssertionError(); // Should never happen
}
}
public ArrayList<Piece> getAllPieces() {
ArrayList<Piece> pieces = new ArrayList<>();
for (int row = 0; row < 8; row++) {
for (int col = 0; col < 8; col++) {
Piece p = getPieceAt(row, col);
if (p != null) {
pieces.add(p);
}
}
}
private void initMoveSound() {
try {
AudioInputStream ais = AudioSystem.getAudioInputStream(
Board.class.getResource("/sounds/move.wav"));
return pieces;
}
public boolean isInBounds(int row, int col) {
return row >= 0 && row < 8 && col >= 0 && col < 8;
}
if (ais == null) { // resource not found
System.err.println("move.wav not on class-path!");
return;
}
moveClip = AudioSystem.getClip();
moveClip.open(ais);
@Override
public Board clone() {
try {
Board clonedBoard = (Board) super.clone();
soundEnabled = true; // <<< MISSING LINE
System.out.println("Move-sound loaded OK");
} catch (Exception e) {
e.printStackTrace();
soundEnabled = false;
}
}
// Deep copy the pieces list
clonedBoard.pieces = new ArrayList<>();
for (Piece piece : this.pieces) {
clonedBoard.pieces.add(piece.clone());
}
private void playMoveSound() {
if (!soundEnabled || moveClip == null) return;
// Copy other fields as necessary
clonedBoard.selectedX = this.selectedX;
clonedBoard.selectedY = this.selectedY;
clonedBoard.turnNumber = this.turnNumber;
clonedBoard.turnIsWhite = this.turnIsWhite;
return clonedBoard;
} catch (CloneNotSupportedException e) {
throw new AssertionError(); // Should never happen
}
}
if (moveClip.isRunning()) {
moveClip.stop();
}
moveClip.setFramePosition(0);
moveClip.start();
}
}

Binary file not shown.

View File

@ -1,9 +1,9 @@
WR,WN,WB,WQ,WK,WB,WN,WR
,WN,WB,WQ,WK,WB,,WR
WP,WP,WP,WP,WP,WP,WP,WP
,,,,,,,
,,BK,,,,,
,,,,,,,
,,,,,,,
BP,BP,BP,BP,,BP,BP,BP
BR,BN,BB,,BQ,BB,BN,BR
,,WR,BP,,WN,,
,,BN,,,,,
BP,BP,BP,,BP,BP,BP,BP
BR,,BB,BK,BQ,BB,BN,BR
W