From 8b8eb428e5f6d95290a9455e27561b53462c30c7 Mon Sep 17 00:00:00 2001 From: Persson-dev Date: Sun, 13 Apr 2025 15:58:26 +0200 Subject: [PATCH] refactor draw --- .../chess/controller/CommandExecutor.java | 9 +++-- app/src/main/java/chess/model/Game.java | 33 +++++++++++++++---- 2 files changed, 31 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/chess/controller/CommandExecutor.java b/app/src/main/java/chess/controller/CommandExecutor.java index f2a8974..764c905 100644 --- a/app/src/main/java/chess/controller/CommandExecutor.java +++ b/app/src/main/java/chess/controller/CommandExecutor.java @@ -59,11 +59,7 @@ public class CommandExecutor { } private void switchPlayerTurn() { - if(this.game.switchPlayerTurn()) { - this.dispatcher.onDraw(); - this.dispatcher.onGameEnd(); - return; - } + this.game.switchPlayerTurn(); this.dispatcher.onPlayerTurn(this.game.getPlayerTurn()); } @@ -75,6 +71,9 @@ public class CommandExecutor { GameStatus gameStatus = this.game.checkGameStatus(); switch (gameStatus) { + case Draw: + this.dispatcher.onDraw(); + return true; case Check: this.dispatcher.onKingInCheck(); return false; diff --git a/app/src/main/java/chess/model/Game.java b/app/src/main/java/chess/model/Game.java index 6025b89..de842f5 100644 --- a/app/src/main/java/chess/model/Game.java +++ b/app/src/main/java/chess/model/Game.java @@ -13,8 +13,10 @@ public class Game { private final Stack movesHistory; private final Map> traitsPos; + private static final int DRAW_REPETITONS = 3; + public enum GameStatus { - Check, CheckMate, OnGoing, Pat; + Draw, Check, CheckMate, OnGoing, Pat; } public Game(ChessBoard board) { @@ -42,26 +44,45 @@ public class Game { * @param color the current player turn * @return true if a draw should be declared */ - private boolean saveTraitPiecesPos(Color color) { + private void saveTraitPiecesPos(Color color) { int piecesHash = this.board.hashPlayerPieces(color); Integer count = this.traitsPos.get(color).get(piecesHash); this.traitsPos.get(color).put(piecesHash, count == null ? 1 : count + 1); - return count == null ? false : count == (3 - 1); + } + + /** + * + * @param player the trait to check + * @return true if a position is repeated DRAW_REPETITONS times + */ + private boolean checkDraw(Color player) { + return this.traitsPos.get(player).containsValue(DRAW_REPETITONS); + } + + /** + * @return whether the game is in a draw situation + */ + private boolean checkDraw() { + if (checkDraw(Color.White)) + return true; + return checkDraw(Color.Black); } /** * * @return true if a draw should occur */ - public boolean switchPlayerTurn() { - boolean draw = saveTraitPiecesPos(this.playerTurn); + public void switchPlayerTurn() { + saveTraitPiecesPos(this.playerTurn); playerTurn = Color.getEnemy(playerTurn); - return draw; } public GameStatus checkGameStatus() { final Color enemy = Color.getEnemy(getPlayerTurn()); + if(checkDraw()) + return GameStatus.Draw; + if (this.board.isKingInCheck(enemy)) if (this.board.hasAllowedMoves(enemy)) return GameStatus.Check;