From 86e740a34ac594a856d4bba9f21de16dbd4a14c3 Mon Sep 17 00:00:00 2001 From: Stef Date: Thu, 4 Dec 2025 20:50:58 +0100 Subject: [PATCH] Fixed local and online play for both games --- .../gameControllers/ReversiBitController.java | 7 ++-- .../TicTacToeBitController.java | 5 ++- .../app/widget/view/LocalMultiplayerView.java | 20 +++++------ .../main/java/org/toop/game/BitboardGame.java | 10 +++--- .../LocalFixedRateThreadBehaviour.java | 8 ++--- .../games/tictactoe/BitboardTicTacToe.java | 34 +++++++++++++------ 6 files changed, 42 insertions(+), 42 deletions(-) diff --git a/app/src/main/java/org/toop/app/gameControllers/ReversiBitController.java b/app/src/main/java/org/toop/app/gameControllers/ReversiBitController.java index 2bba88f..89fceba 100644 --- a/app/src/main/java/org/toop/app/gameControllers/ReversiBitController.java +++ b/app/src/main/java/org/toop/app/gameControllers/ReversiBitController.java @@ -1,15 +1,12 @@ package org.toop.app.gameControllers; -import org.toop.app.canvas.GameCanvas; import org.toop.app.canvas.ReversiBitCanvas; -import org.toop.framework.gameFramework.model.game.SupportsOnlinePlay; import org.toop.framework.gameFramework.model.game.threadBehaviour.ThreadBehaviour; import org.toop.framework.gameFramework.model.player.Player; +import org.toop.game.gameThreads.LocalFixedRateThreadBehaviour; import org.toop.game.gameThreads.LocalThreadBehaviour; import org.toop.game.gameThreads.OnlineThreadBehaviour; -import org.toop.game.gameThreads.OnlineWithSleepThreadBehaviour; import org.toop.game.games.reversi.BitboardReversi; -import org.toop.game.games.tictactoe.BitboardTicTacToe; import org.toop.game.players.OnlinePlayer; public class ReversiBitController extends GenericGameController { @@ -18,7 +15,7 @@ public class ReversiBitController extends GenericGameController ThreadBehaviour thread = new LocalThreadBehaviour<>(game); for (Player player : players) { if (player instanceof OnlinePlayer){ - thread = new OnlineWithSleepThreadBehaviour<>(game); + thread = new OnlineThreadBehaviour<>(game); } } super(new ReversiBitCanvas(), game, thread, "Reversi"); diff --git a/app/src/main/java/org/toop/app/gameControllers/TicTacToeBitController.java b/app/src/main/java/org/toop/app/gameControllers/TicTacToeBitController.java index 5347cbf..0b8491c 100644 --- a/app/src/main/java/org/toop/app/gameControllers/TicTacToeBitController.java +++ b/app/src/main/java/org/toop/app/gameControllers/TicTacToeBitController.java @@ -1,10 +1,9 @@ package org.toop.app.gameControllers; -import org.toop.app.canvas.GameCanvas; import org.toop.app.canvas.TicTacToeBitCanvas; -import org.toop.framework.gameFramework.model.game.SupportsOnlinePlay; import org.toop.framework.gameFramework.model.game.threadBehaviour.ThreadBehaviour; import org.toop.framework.gameFramework.model.player.Player; +import org.toop.game.gameThreads.LocalFixedRateThreadBehaviour; import org.toop.game.gameThreads.LocalThreadBehaviour; import org.toop.game.gameThreads.OnlineThreadBehaviour; import org.toop.game.gameThreads.OnlineWithSleepThreadBehaviour; @@ -17,7 +16,7 @@ public class TicTacToeBitController extends GenericGameController(game); for (Player player : players) { if (player instanceof OnlinePlayer){ - thread = new OnlineWithSleepThreadBehaviour<>(game); + thread = new OnlineThreadBehaviour<>(game); } } super(new TicTacToeBitCanvas(), game, thread , "TicTacToe"); diff --git a/app/src/main/java/org/toop/app/widget/view/LocalMultiplayerView.java b/app/src/main/java/org/toop/app/widget/view/LocalMultiplayerView.java index 20d33ad..0351722 100644 --- a/app/src/main/java/org/toop/app/widget/view/LocalMultiplayerView.java +++ b/app/src/main/java/org/toop/app/widget/view/LocalMultiplayerView.java @@ -5,6 +5,8 @@ import org.toop.app.GameInformation; import org.toop.app.canvas.ReversiBitCanvas; import org.toop.app.canvas.TicTacToeBitCanvas; import org.toop.app.gameControllers.GenericGameController; +import org.toop.app.gameControllers.ReversiBitController; +import org.toop.app.gameControllers.TicTacToeBitController; import org.toop.framework.gameFramework.controller.GameController; import org.toop.framework.gameFramework.model.player.Player; import org.toop.game.gameThreads.LocalThreadBehaviour; @@ -70,20 +72,17 @@ public class LocalMultiplayerView extends ViewWidget { if (AppSettings.getSettings().getTutorialFlag() && AppSettings.getSettings().getFirstTTT()) { new ShowEnableTutorialWidget( () -> new TicTacToeTutorialWidget(() -> { - BitboardTicTacToe game = new BitboardTicTacToe(players); // TODO: ThreadBehaviour might need to be created by game idk - gameController = new GenericGameController(new TicTacToeBitCanvas(), game, new LocalThreadBehaviour(game), "TicTacToe"); + gameController = new TicTacToeBitController(players); gameController.start(); }), () -> Platform.runLater(() -> { - BitboardTicTacToe game = new BitboardTicTacToe(players); // TODO: ThreadBehaviour might need to be created by game idk - gameController = new GenericGameController(new TicTacToeBitCanvas(), game, new LocalThreadBehaviour(game), "TicTacToe"); + gameController = new TicTacToeBitController(players); gameController.start(); }), () -> AppSettings.getSettings().setFirstTTT(false) ); } else { - BitboardTicTacToe game = new BitboardTicTacToe(players); // TODO: ThreadBehaviour might need to be created by game idk - gameController = new GenericGameController(new TicTacToeBitCanvas(), game, new LocalThreadBehaviour(game), "TicTacToe"); + gameController = new TicTacToeBitController(players); gameController.start(); } break; @@ -101,20 +100,17 @@ public class LocalMultiplayerView extends ViewWidget { if (AppSettings.getSettings().getTutorialFlag() && AppSettings.getSettings().getFirstReversi()) { new ShowEnableTutorialWidget( () -> new ReversiTutorialWidget(() -> { - BitboardReversi game = new BitboardReversi(players); - gameController = new GenericGameController<>(new ReversiBitCanvas(), game, new LocalThreadBehaviour<>(game), "Reversi"); + gameController = new ReversiBitController(players); gameController.start(); }), () -> Platform.runLater(() -> { - BitboardReversi game = new BitboardReversi(players); - gameController = new GenericGameController<>(new ReversiBitCanvas(), game, new LocalThreadBehaviour<>(game), "Reversi"); + gameController = new ReversiBitController(players); gameController.start(); }), () -> AppSettings.getSettings().setFirstReversi(false) ); } else { - BitboardReversi game = new BitboardReversi(players); - gameController = new GenericGameController<>(new ReversiBitCanvas(), game, new LocalThreadBehaviour<>(game), "Reversi"); + gameController = new ReversiBitController(players); gameController.start(); } break; diff --git a/game/src/main/java/org/toop/game/BitboardGame.java b/game/src/main/java/org/toop/game/BitboardGame.java index 31ff705..5e4faef 100644 --- a/game/src/main/java/org/toop/game/BitboardGame.java +++ b/game/src/main/java/org/toop/game/BitboardGame.java @@ -14,7 +14,7 @@ public abstract class BitboardGame> implements TurnBas // long is 64 bits. Every game has a limit of 64 cells maximum. private final long[] playerBitboard; - private AtomicInteger currentTurn = new AtomicInteger(0); + private int currentTurn = 0; public BitboardGame(int columnSize, int rowSize, int playerCount, Player[] players) { this.columnSize = columnSize; @@ -91,12 +91,12 @@ public abstract class BitboardGame> implements TurnBas public Player getPlayer(int index) {return players[index];} public int getCurrentPlayerIndex() { - System.out.println(currentTurn.get() % playerBitboard.length); - return currentTurn.get() % playerBitboard.length; + System.out.println(currentTurn % playerBitboard.length); + return currentTurn % playerBitboard.length; } public int getNextPlayer() { - return (currentTurn.get() + 1) % playerBitboard.length; + return (currentTurn + 1) % playerBitboard.length; } public Player getCurrentPlayer(){ @@ -105,6 +105,6 @@ public abstract class BitboardGame> implements TurnBas public void nextTurn() { System.out.println("Incrementing turn"); - currentTurn.incrementAndGet(); + currentTurn++; } } \ No newline at end of file diff --git a/game/src/main/java/org/toop/game/gameThreads/LocalFixedRateThreadBehaviour.java b/game/src/main/java/org/toop/game/gameThreads/LocalFixedRateThreadBehaviour.java index dc13519..b7a2002 100644 --- a/game/src/main/java/org/toop/game/gameThreads/LocalFixedRateThreadBehaviour.java +++ b/game/src/main/java/org/toop/game/gameThreads/LocalFixedRateThreadBehaviour.java @@ -16,18 +16,14 @@ import org.toop.framework.gameFramework.model.player.Player; */ public class LocalFixedRateThreadBehaviour> extends AbstractThreadBehaviour implements Runnable { - /** All players participating in the game. */ - private final Player[] players; /** * Creates a fixed-rate behaviour for a local turn-based game. * * @param game the game instance - * @param players the list of players in turn order */ - public LocalFixedRateThreadBehaviour(T game, Player[] players) { + public LocalFixedRateThreadBehaviour(T game) { super(game); - this.players = players; } /** Starts the game loop thread if not already running. */ @@ -52,7 +48,7 @@ public class LocalFixedRateThreadBehaviour> extends A */ @Override public void run() { - final int UPS = 60; + final int UPS = 1; final long UPDATE_INTERVAL = 1_000_000_000L / UPS; long nextUpdate = System.nanoTime(); diff --git a/game/src/main/java/org/toop/game/games/tictactoe/BitboardTicTacToe.java b/game/src/main/java/org/toop/game/games/tictactoe/BitboardTicTacToe.java index 0cecbb7..df2568a 100644 --- a/game/src/main/java/org/toop/game/games/tictactoe/BitboardTicTacToe.java +++ b/game/src/main/java/org/toop/game/games/tictactoe/BitboardTicTacToe.java @@ -20,6 +20,9 @@ public class BitboardTicTacToe extends BitboardGame { public BitboardTicTacToe(Player[] players) { super(3, 3, 2, players); } + public BitboardTicTacToe(BitboardTicTacToe other) { + super(other); + } @Override public int[] getLegalMoves(){ @@ -28,7 +31,7 @@ public class BitboardTicTacToe extends BitboardGame { @Override public PlayResult play(int move) { - return new PlayResult(play2(translateMove(move)), getCurrentPlayerIndex()); + return play2(translateMove(move)); } public long getLegalMoves2() { @@ -39,24 +42,34 @@ public class BitboardTicTacToe extends BitboardGame { return (~taken) & 0x1ffL; } - public GameState play2(long move) { + public PlayResult play2(long move) { + // Player loses if move is invalid + if ((move & getLegalMoves2()) == 0 || Long.bitCount(move) != 1){ + return new PlayResult(GameState.WIN, getNextPlayer()); + } + + // Move is legal, make move long playerBitboard = getPlayerBitboard(getCurrentPlayerIndex()); playerBitboard |= move; setPlayerBitboard(getCurrentPlayerIndex(), playerBitboard); + + // Check if current player won + if (checkWin(playerBitboard)) { + return new PlayResult(GameState.WIN, getCurrentPlayerIndex()); + } + + // Proceed to next turn nextTurn(); - if (checkWin(playerBitboard)) { - return GameState.WIN; - } + // Check for early draw if (getLegalMoves2() == 0L || checkEarlyDraw()) { - return GameState.DRAW; + return new PlayResult(GameState.DRAW, -1); } - - - return GameState.NORMAL; + // Nothing weird happened, continue on as normal + return new PlayResult(GameState.NORMAL, -1); } private boolean checkWin(long board) { @@ -94,9 +107,8 @@ public class BitboardTicTacToe extends BitboardGame { return translateBoard(); } - // TODO: Implement @Override public BitboardTicTacToe deepCopy() { - return this; + return new BitboardTicTacToe(this); } } \ No newline at end of file