refactor: move promote to chessboard
This commit is contained in:
@@ -20,12 +20,12 @@ public class CastlingCommand extends PlayerCommand {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public CommandResult execute(Game game, OutputSystem outputSystem) {
|
public CommandResult execute(Game game, OutputSystem outputSystem) {
|
||||||
// we must promote the pending pawn before
|
|
||||||
if (game.pawnShouldBePromoted())
|
|
||||||
return CommandResult.NotAllowed;
|
|
||||||
|
|
||||||
final ChessBoard board = game.getBoard();
|
final ChessBoard board = game.getBoard();
|
||||||
|
|
||||||
|
// we must promote the pending pawn before
|
||||||
|
if (board.pawnShouldBePromoted())
|
||||||
|
return CommandResult.NotAllowed;
|
||||||
|
|
||||||
if (bigCastling && !board.canBigCastle(game.getPlayerTurn()))
|
if (bigCastling && !board.canBigCastle(game.getPlayerTurn()))
|
||||||
return CommandResult.NotAllowed;
|
return CommandResult.NotAllowed;
|
||||||
|
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ public class MoveCommand extends PlayerCommand {
|
|||||||
final ChessBoard board = game.getBoard();
|
final ChessBoard board = game.getBoard();
|
||||||
|
|
||||||
// we must promote the pending pawn before
|
// we must promote the pending pawn before
|
||||||
if (game.pawnShouldBePromoted())
|
if (board.pawnShouldBePromoted())
|
||||||
return CommandResult.NotAllowed;
|
return CommandResult.NotAllowed;
|
||||||
|
|
||||||
Piece piece = board.pieceAt(move.getStart());
|
Piece piece = board.pieceAt(move.getStart());
|
||||||
@@ -50,7 +50,7 @@ public class MoveCommand extends PlayerCommand {
|
|||||||
return CommandResult.NotAllowed;
|
return CommandResult.NotAllowed;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (game.pawnShouldBePromoted())
|
if (board.pawnShouldBePromoted())
|
||||||
return CommandResult.ActionNeeded;
|
return CommandResult.ActionNeeded;
|
||||||
|
|
||||||
board.setLastMove(this.move);
|
board.setLastMove(this.move);
|
||||||
@@ -71,7 +71,7 @@ public class MoveCommand extends PlayerCommand {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void tryPromote(Game game, OutputSystem outputSystem) {
|
private void tryPromote(Game game, OutputSystem outputSystem) {
|
||||||
Coordinate pawnPos = game.pawnPromotePosition();
|
Coordinate pawnPos = game.getBoard().pawnPromotePosition();
|
||||||
|
|
||||||
if (pawnPos == null)
|
if (pawnPos == null)
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ public class PromoteCommand extends PlayerCommand {
|
|||||||
public CommandResult execute(Game game, OutputSystem outputSystem) {
|
public CommandResult execute(Game game, OutputSystem outputSystem) {
|
||||||
final ChessBoard board = game.getBoard();
|
final ChessBoard board = game.getBoard();
|
||||||
|
|
||||||
this.pieceCoords = game.pawnPromotePosition();
|
this.pieceCoords = board.pawnPromotePosition();
|
||||||
|
|
||||||
if (this.pieceCoords == null)
|
if (this.pieceCoords == null)
|
||||||
return CommandResult.NotAllowed;
|
return CommandResult.NotAllowed;
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import java.util.ArrayList;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import chess.model.visitor.KingIdentifier;
|
import chess.model.visitor.KingIdentifier;
|
||||||
|
import chess.model.visitor.PawnIdentifier;
|
||||||
import chess.model.visitor.PiecePathChecker;
|
import chess.model.visitor.PiecePathChecker;
|
||||||
|
|
||||||
public class ChessBoard {
|
public class ChessBoard {
|
||||||
@@ -220,6 +221,42 @@ public class ChessBoard {
|
|||||||
return canCastle(color, 0, Direction.Left);
|
return canCastle(color, 0, Direction.Left);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean pawnShouldBePromoted() {
|
||||||
|
return pawnPromotePosition() != null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @return Null if there is no pawn to promote
|
||||||
|
*/
|
||||||
|
public Coordinate pawnPromotePosition() {
|
||||||
|
Coordinate piecePos = pawnPromotePosition(Color.White);
|
||||||
|
if (piecePos != null)
|
||||||
|
return piecePos;
|
||||||
|
return pawnPromotePosition(Color.Black);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @return Null if there is no pawn to promote
|
||||||
|
*/
|
||||||
|
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 = pieceAt(pieceCoords);
|
||||||
|
|
||||||
|
if (identifier.isPawn(piece))
|
||||||
|
return pieceCoords;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
public Move getLastMove() {
|
public Move getLastMove() {
|
||||||
return this.lastMove;
|
return this.lastMove;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,7 +4,6 @@ import java.util.Stack;
|
|||||||
|
|
||||||
import chess.controller.PlayerCommand;
|
import chess.controller.PlayerCommand;
|
||||||
import chess.controller.commands.MoveCommand;
|
import chess.controller.commands.MoveCommand;
|
||||||
import chess.model.visitor.PawnIdentifier;
|
|
||||||
|
|
||||||
public class Game {
|
public class Game {
|
||||||
private final ChessBoard board;
|
private final ChessBoard board;
|
||||||
@@ -51,41 +50,6 @@ public class Game {
|
|||||||
return GameStatus.OnGoing;
|
return GameStatus.OnGoing;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean pawnShouldBePromoted() {
|
|
||||||
return pawnPromotePosition() != null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @return Null if there is no pawn to promote
|
|
||||||
*/
|
|
||||||
public Coordinate pawnPromotePosition() {
|
|
||||||
Coordinate piecePos = pawnPromotePosition(Color.White);
|
|
||||||
if (piecePos != null)
|
|
||||||
return piecePos;
|
|
||||||
return pawnPromotePosition(Color.Black);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @return Null if there is no pawn to promote
|
|
||||||
*/
|
|
||||||
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 (identifier.isPawn(piece))
|
|
||||||
return pieceCoords;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void addAction(PlayerCommand command) {
|
public void addAction(PlayerCommand command) {
|
||||||
this.movesHistory.add(command);
|
this.movesHistory.add(command);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user