From 81f4d307a2157d45a8cb200d21ae7ff796e22f39 Mon Sep 17 00:00:00 2001 From: Ticho Hidding Date: Thu, 27 Nov 2025 15:41:09 +0100 Subject: [PATCH 1/2] fixed turn skip bug fixed end score bug now only shows legal and highlight moves when human --- .../java/org/toop/app/game/ReversiGame.java | 57 ++++++++++++------- .../java/org/toop/game/reversi/ReversiAI.java | 1 + 2 files changed, 37 insertions(+), 21 deletions(-) diff --git a/app/src/main/java/org/toop/app/game/ReversiGame.java b/app/src/main/java/org/toop/app/game/ReversiGame.java index ec9a5e6..660a6a2 100644 --- a/app/src/main/java/org/toop/app/game/ReversiGame.java +++ b/app/src/main/java/org/toop/app/game/ReversiGame.java @@ -168,9 +168,13 @@ public final class ReversiGame { updateCanvas(true); if (state != GameState.NORMAL) { - if (state == GameState.WIN) { - view.gameOver(true, information.players[currentTurn].name); - } else if (state == GameState.DRAW) { + if (state == GameState.TURN_SKIPPED){ + continue; + } + int winningPLayerNumber = getPlayerNumberWithHighestScore(); + if (state == GameState.WIN && winningPLayerNumber > -1) { + view.gameOver(true, information.players[winningPLayerNumber].name); + } else if (state == GameState.DRAW || winningPLayerNumber == -1) { view.gameOver(false, ""); } @@ -179,6 +183,13 @@ public final class ReversiGame { } } + private int getPlayerNumberWithHighestScore(){ + Reversi.Score score = game.getScore(); + if (score.player1Score() > score.player2Score()) return 0; + if (score.player1Score() < score.player2Score()) return 1; + return -1; + } + private void onMoveResponse(NetworkEvents.GameMoveResponse response) { if (!isRunning.get()) { return; @@ -287,11 +298,13 @@ public final class ReversiGame { animation.setOnFinished(_ -> { isPaused.set(false); - final Move[] legalMoves = game.getLegalMoves(); + if (information.players[game.getCurrentTurn()].isHuman) { + final Move[] legalMoves = game.getLegalMoves(); - for (final Move legalMove : legalMoves) { - canvas.drawLegalPosition(legalMove.position(), game.getCurrentPlayer()); - } + for (final Move legalMove : legalMoves) { + canvas.drawLegalPosition(legalMove.position(), game.getCurrentPlayer()); + } + } }); animation.play(); @@ -308,23 +321,25 @@ public final class ReversiGame { } private void highlightCells(int cellEntered) { - Move[] legalMoves = game.getLegalMoves(); - boolean isLegalMove = false; - for (Move move : legalMoves) { - if (move.position() == cellEntered){ - isLegalMove = true; - break; + if (information.players[game.getCurrentTurn()].isHuman) { + Move[] legalMoves = game.getLegalMoves(); + boolean isLegalMove = false; + for (Move move : legalMoves) { + if (move.position() == cellEntered){ + isLegalMove = true; + break; + } } - } - if (cellEntered >= 0){ - Move[] moves = null; - if (isLegalMove) { - moves = game.getFlipsForPotentialMove( - new Point(cellEntered%game.getColumnSize(),cellEntered/game.getRowSize()), - game.getCurrentPlayer()); + if (cellEntered >= 0){ + Move[] moves = null; + if (isLegalMove) { + moves = game.getFlipsForPotentialMove( + new Point(cellEntered%game.getColumnSize(),cellEntered/game.getRowSize()), + game.getCurrentPlayer()); + } + canvas.drawHighlightDots(moves); } - canvas.drawHighlightDots(moves); } } } \ No newline at end of file diff --git a/game/src/main/java/org/toop/game/reversi/ReversiAI.java b/game/src/main/java/org/toop/game/reversi/ReversiAI.java index 495db52..2fc78d5 100644 --- a/game/src/main/java/org/toop/game/reversi/ReversiAI.java +++ b/game/src/main/java/org/toop/game/reversi/ReversiAI.java @@ -8,6 +8,7 @@ public final class ReversiAI extends AI { public Move findBestMove(Reversi game, int depth) { Move[] moves = game.getLegalMoves(); int inty = (int)(Math.random() * moves.length-.5f); + if (moves.length == 0) return null; return moves[inty]; } } From 71c918e9ee690871cd6a802edca95f065d043f24 Mon Sep 17 00:00:00 2001 From: Stef Date: Thu, 27 Nov 2025 15:45:31 +0100 Subject: [PATCH 2/2] Squashed commit of the following: commit a517f2f302baa89f8ef59946a31c7bb59c56770f Author: Stef Date: Thu Nov 27 15:43:43 2025 +0100 Make it so the game shows "Waiting on ... to make their move". Styling isn't done but it is easier to see who's turn it is. There is a lot of structuring to do in the previous code... --- .../org/toop/app/view/views/GameView.java | 33 ++++++++----------- 1 file changed, 14 insertions(+), 19 deletions(-) diff --git a/app/src/main/java/org/toop/app/view/views/GameView.java b/app/src/main/java/org/toop/app/view/views/GameView.java index df69240..5b9b1d6 100644 --- a/app/src/main/java/org/toop/app/view/views/GameView.java +++ b/app/src/main/java/org/toop/app/view/views/GameView.java @@ -15,10 +15,12 @@ import javafx.scene.text.Text; import java.util.function.Consumer; public final class GameView extends View { + // TODO: This should be it's own file... private static class GameOverView extends View { private final boolean iWon; private final String winner; + // TODO: Make winner generic, there is no "I won" unless you play online or against bot. Should be a generic "... won" to simplify public GameOverView(boolean iWon, String winner) { super(false, "bg-popup"); @@ -71,6 +73,8 @@ public final class GameView extends View { private final Text nextPlayerHeader; + private final Text gameStateFeedback = text(); + private final ListView chatListView; private final TextField chatInput; @@ -112,34 +116,24 @@ public final class GameView extends View { exitButton.setText(AppContext.getString("exit")); exitButton.setOnAction(_ -> onExit.run()); - currentPlayerHeader = header("", "current-player"); + currentPlayerHeader = header("", "header"); currentMoveHeader = header(); - nextPlayerHeader = header(); } @Override public void setup() { - add(Pos.TOP_RIGHT, - fit(vboxFill( - currentPlayerHeader, - - hboxFill( - separator(), - currentMoveHeader, - separator() - ), - - nextPlayerHeader - )) + add( + Pos.TOP_CENTER, + gameStateFeedback ); add(Pos.BOTTOM_LEFT, - vboxFill( - forfeitButton, - exitButton - ) - ); + vboxFill( + forfeitButton, + exitButton + ) + ); if (chatListView != null) { add(Pos.BOTTOM_RIGHT, @@ -153,6 +147,7 @@ public final class GameView extends View { public void nextPlayer(boolean isMe, String currentPlayer, String currentMove, String nextPlayer) { Platform.runLater(() -> { + gameStateFeedback.setText("Waiting on " + currentPlayer + " to make their move."); currentPlayerHeader.setText(currentPlayer); currentMoveHeader.setText(currentMove);