Merge branch 'master' of
https://gitarero.ecam.fr/yohan.montagne/OOP_2B2_Project.git
This commit is contained in:
commit
c9cd74b013
|
|
@ -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.
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in New Issue