generic game controller now draws legal moves for instances of bitlegalmovedrawer (reversi),

This commit is contained in:
michiel
2025-12-11 12:38:40 +01:00
parent e5ad144783
commit e6e931b565
6 changed files with 28 additions and 16 deletions

View File

@@ -0,0 +1,5 @@
package org.toop.app.canvas;
public interface BitLegalMoveDrawer {
void showLegalMove(long move, int currentPlayerIndex);
}

View File

@@ -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<BitboardReversi> {
public class ReversiBitCanvas extends BitGameCanvas<BitboardReversi> 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<BitboardReversi> {
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);

View File

@@ -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<T extends TurnBasedGame<T>> implements GameController {
public class GenericGameController<T extends TurnBasedGame<T>, C extends GameCanvas<T>> implements GameController {
protected final EventFlow eventFlow = new EventFlow();
// Logger for logging
@@ -31,13 +32,13 @@ public class GenericGameController<T extends TurnBasedGame<T>> implements GameCo
protected final String gameType;
// Reference to game canvas
protected final GameCanvas<T> canvas;
protected final C canvas;
protected final TurnBasedGame<T> 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<T> 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<T extends TurnBasedGame<T>> 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;
}
}
}
}

View File

@@ -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<BitboardReversi> {
public class ReversiBitController extends GenericGameController<BitboardReversi, ReversiBitCanvas> {
public ReversiBitController(Player<BitboardReversi>[] players) {
BitboardReversi game = new BitboardReversi(players);
ThreadBehaviour thread = new LocalThreadBehaviour<>(game);

View File

@@ -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<BitboardTicTacToe> {
public class TicTacToeBitController extends GenericGameController<BitboardTicTacToe, TicTacToeBitCanvas > {
public TicTacToeBitController(Player<BitboardTicTacToe>[] players) {
BitboardTicTacToe game = new BitboardTicTacToe(players);
ThreadBehaviour thread = new LocalThreadBehaviour<>(game);

View File

@@ -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;