diff --git a/app/src/main/java/chess/controller/commands/PromoteCommand.java b/app/src/main/java/chess/controller/commands/PromoteCommand.java index 1bc0194..f091cb4 100644 --- a/app/src/main/java/chess/controller/commands/PromoteCommand.java +++ b/app/src/main/java/chess/controller/commands/PromoteCommand.java @@ -12,6 +12,7 @@ import chess.model.pieces.Knight; import chess.model.pieces.Pawn; import chess.model.pieces.Queen; import chess.model.pieces.Rook; +import chess.model.visitor.PawnIdentifier; public class PromoteCommand extends PlayerCommand { @@ -39,7 +40,7 @@ public class PromoteCommand extends PlayerCommand { return CommandResult.NotAllowed; Piece pawn = board.pieceAt(this.pieceCoords); - if (pawn == null || !(pawn instanceof Pawn)) + if (!new PawnIdentifier(game.getPlayerTurn()).isPawn(pawn)) return CommandResult.NotAllowed; int destY = this.pieceCoords.getY(); diff --git a/app/src/main/java/chess/model/ChessBoard.java b/app/src/main/java/chess/model/ChessBoard.java index 2da729f..ae47f79 100644 --- a/app/src/main/java/chess/model/ChessBoard.java +++ b/app/src/main/java/chess/model/ChessBoard.java @@ -103,7 +103,7 @@ public class ChessBoard { for (int j = 0; j < Coordinate.VALUE_MAX; j++) { Coordinate coordinate = new Coordinate(i, j); Piece piece = pieceAt(coordinate); - if (piece != null && kingIdentifier.visit(piece)) { + if (kingIdentifier.isKing(piece)) { return coordinate; } } diff --git a/app/src/main/java/chess/model/Game.java b/app/src/main/java/chess/model/Game.java index 93e9e6d..767a022 100644 --- a/app/src/main/java/chess/model/Game.java +++ b/app/src/main/java/chess/model/Game.java @@ -1,6 +1,6 @@ package chess.model; -import chess.model.pieces.Pawn; +import chess.model.visitor.PawnIdentifier; public class Game { private final ChessBoard board; @@ -66,15 +66,15 @@ public class Game { */ private Coordinate pawnPromotePosition(Color color) { int enemyLineY = color == Color.White ? 0 : 7; + PawnIdentifier identifier = new PawnIdentifier(color); for (int x = 0; x < Coordinate.VALUE_MAX; x++) { Coordinate pieceCoords = new Coordinate(x, enemyLineY); Piece piece = getBoard().pieceAt(pieceCoords); - if (piece == null || !(piece instanceof Pawn) || piece.getColor() != color) - continue; + if (identifier.isPawn(piece)) + return pieceCoords; - return pieceCoords; } return null; diff --git a/app/src/main/java/chess/model/visitor/KingIdentifier.java b/app/src/main/java/chess/model/visitor/KingIdentifier.java index fdd29ad..08259de 100644 --- a/app/src/main/java/chess/model/visitor/KingIdentifier.java +++ b/app/src/main/java/chess/model/visitor/KingIdentifier.java @@ -1,6 +1,7 @@ package chess.model.visitor; import chess.model.Color; +import chess.model.Piece; import chess.model.PieceVisitor; import chess.model.pieces.*; @@ -12,6 +13,12 @@ public class KingIdentifier implements PieceVisitor { this.color = color; } + public boolean isKing(Piece piece) { + if (piece == null) + return false; + return visit(piece); + } + @Override public Boolean visitPiece(Bishop bishop) { return false; diff --git a/app/src/main/java/chess/model/visitor/PawnIdentifier.java b/app/src/main/java/chess/model/visitor/PawnIdentifier.java new file mode 100644 index 0000000..9046032 --- /dev/null +++ b/app/src/main/java/chess/model/visitor/PawnIdentifier.java @@ -0,0 +1,52 @@ +package chess.model.visitor; + +import chess.model.Color; +import chess.model.Piece; +import chess.model.PieceVisitor; +import chess.model.pieces.*; + +public class PawnIdentifier implements PieceVisitor { + + private final Color color; + + public PawnIdentifier(Color color) { + this.color = color; + } + + public boolean isPawn(Piece piece) { + if (piece == null) + return false; + return visit(piece); + } + + @Override + public Boolean visitPiece(Bishop bishop) { + return false; + } + + @Override + public Boolean visitPiece(King king) { + return false; + } + + @Override + public Boolean visitPiece(Knight knight) { + return false; + } + + @Override + public Boolean visitPiece(Pawn pawn) { + return pawn.getColor() == color; + } + + @Override + public Boolean visitPiece(Queen queen) { + return false; + } + + @Override + public Boolean visitPiece(Rook rook) { + return false; + } + +}