diff --git a/app/src/main/java/org/toop/app/canvas/BitLegalMoveDrawer.java b/app/src/main/java/org/toop/app/canvas/BitLegalMoveDrawer.java new file mode 100644 index 0000000..8cc1612 --- /dev/null +++ b/app/src/main/java/org/toop/app/canvas/BitLegalMoveDrawer.java @@ -0,0 +1,5 @@ +package org.toop.app.canvas; + +public interface BitLegalMoveDrawer { + void showLegalMove(long move, int currentPlayerIndex); +} diff --git a/app/src/main/java/org/toop/app/canvas/ReversiBitCanvas.java b/app/src/main/java/org/toop/app/canvas/ReversiBitCanvas.java index 9a82a21..8246470 100644 --- a/app/src/main/java/org/toop/app/canvas/ReversiBitCanvas.java +++ b/app/src/main/java/org/toop/app/canvas/ReversiBitCanvas.java @@ -4,10 +4,7 @@ import javafx.scene.paint.Color; import org.toop.app.App; import org.toop.game.games.reversi.BitboardReversi; -import java.util.Arrays; -import java.util.function.Consumer; - -public class ReversiBitCanvas extends BitGameCanvas { +public class ReversiBitCanvas extends BitGameCanvas implements BitLegalMoveDrawer { public ReversiBitCanvas() { super(Color.GRAY, new Color(0f, 0.4f, 0.2f, 1f), (App.getHeight() / 4) * 3, (App.getHeight() / 4) * 3, 8, 8, 5, true); canvas.setOnMouseMoved(event -> { @@ -40,13 +37,13 @@ public class ReversiBitCanvas extends BitGameCanvas { loopOverBoard(board[1], (i) -> drawDot(Color.BLACK, i)); } - private void showLegalMoves(long[] legalMoves, int currentPlayerIndex) { - for (long legalMove : legalMoves) { - drawLegalMove(legalMove, currentPlayerIndex); - } + @Override + public void showLegalMove(long move, int currentPlayerIndex) { + int idx = Long.numberOfTrailingZeros(move); + drawLegalMove(idx, currentPlayerIndex); } - public void drawLegalMove(long cell, int player) { + public void drawLegalMove(int cell, int player) { Color innerColor; if (player == 1) { innerColor = new Color(0.0f, 0.0f, 0.0f, 0.6f); diff --git a/app/src/main/java/org/toop/app/gameControllers/GenericGameController.java b/app/src/main/java/org/toop/app/gameControllers/GenericGameController.java index d535941..abf56a3 100644 --- a/app/src/main/java/org/toop/app/gameControllers/GenericGameController.java +++ b/app/src/main/java/org/toop/app/gameControllers/GenericGameController.java @@ -5,6 +5,7 @@ import javafx.geometry.Pos; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.toop.app.canvas.GameCanvas; +import org.toop.app.canvas.BitLegalMoveDrawer; import org.toop.app.widget.WidgetContainer; import org.toop.app.widget.view.GameView; import org.toop.framework.eventbus.EventFlow; @@ -18,7 +19,7 @@ import org.toop.framework.gameFramework.view.GUIEvents; import org.toop.framework.networking.events.NetworkEvents; import org.toop.game.players.LocalPlayer; -public class GenericGameController> implements GameController { +public class GenericGameController, C extends GameCanvas> implements GameController { protected final EventFlow eventFlow = new EventFlow(); // Logger for logging @@ -31,13 +32,13 @@ public class GenericGameController> implements GameCo protected final String gameType; // Reference to game canvas - protected final GameCanvas canvas; + protected final C canvas; protected final TurnBasedGame game; // Reference to game instance private final ThreadBehaviour gameThreadBehaviour; // TODO: Change gameType to automatically happen with either dependency injection or something else. - public GenericGameController(GameCanvas canvas, T game, ThreadBehaviour gameThreadBehaviour, String gameType) { + public GenericGameController(C canvas, T game, ThreadBehaviour gameThreadBehaviour, String gameType) { logger.info("Creating: " + this.getClass()); this.canvas = canvas; @@ -147,5 +148,14 @@ public class GenericGameController> implements GameCo getPlayer((game.getCurrentTurn() + 1 ) % 2).getName(), this.gameType ); + // draw legal moves for bit canvasses + if (canvas instanceof BitLegalMoveDrawer) { + long movesLoop = game.getLegalMoves(); + while (movesLoop != 0) { + long move = 1L << Long.numberOfTrailingZeros(movesLoop); + ((BitLegalMoveDrawer) canvas).showLegalMove(move, getCurrentPlayerIndex()); + movesLoop &= movesLoop - 1; + } + } } } 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 d66be09..d2b9559 100644 --- a/app/src/main/java/org/toop/app/gameControllers/ReversiBitController.java +++ b/app/src/main/java/org/toop/app/gameControllers/ReversiBitController.java @@ -10,7 +10,7 @@ import org.toop.game.games.reversi.BitboardReversi; import org.toop.game.players.LocalPlayer; import org.toop.game.players.OnlinePlayer; -public class ReversiBitController extends GenericGameController { +public class ReversiBitController extends GenericGameController { public ReversiBitController(Player[] players) { BitboardReversi game = new BitboardReversi(players); ThreadBehaviour thread = new LocalThreadBehaviour<>(game); 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 6307894..0ebe3da 100644 --- a/app/src/main/java/org/toop/app/gameControllers/TicTacToeBitController.java +++ b/app/src/main/java/org/toop/app/gameControllers/TicTacToeBitController.java @@ -9,7 +9,7 @@ import org.toop.game.gameThreads.OnlineThreadBehaviour; import org.toop.game.games.tictactoe.BitboardTicTacToe; import org.toop.game.players.OnlinePlayer; -public class TicTacToeBitController extends GenericGameController { +public class TicTacToeBitController extends GenericGameController { public TicTacToeBitController(Player[] players) { BitboardTicTacToe game = new BitboardTicTacToe(players); ThreadBehaviour thread = new LocalThreadBehaviour<>(game); diff --git a/app/src/main/java/org/toop/app/widget/view/GameView.java b/app/src/main/java/org/toop/app/widget/view/GameView.java index 182b826..3792876 100644 --- a/app/src/main/java/org/toop/app/widget/view/GameView.java +++ b/app/src/main/java/org/toop/app/widget/view/GameView.java @@ -22,8 +22,8 @@ public final class GameView extends ViewWidget { private final Text turnHeader; private final Text player1Header; private final Text player2Header; - private Circle player1Icon; - private Circle player2Icon; + private final Circle player1Icon; + private final Circle player2Icon; private final Button forfeitButton; private final Button exitButton; private final TextField chatInput;