Merge branch 'Development' into 289-server

This commit is contained in:
Bas Antonius de Jong
2026-01-16 13:05:08 +01:00
committed by GitHub
4 changed files with 46 additions and 8 deletions

View File

@@ -2,9 +2,13 @@ package org.toop.app.canvas;
import javafx.scene.paint.Color; import javafx.scene.paint.Color;
import org.toop.app.App; import org.toop.app.App;
import org.toop.framework.game.games.reversi.BitboardReversi;
import org.toop.framework.game.players.LocalPlayer;
import org.toop.framework.gameFramework.model.game.TurnBasedGame; import org.toop.framework.gameFramework.model.game.TurnBasedGame;
public class ReversiBitCanvas extends BitGameCanvas { public class ReversiBitCanvas extends BitGameCanvas {
private TurnBasedGame gameCopy;
private int previousCell;
public ReversiBitCanvas() { 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); 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 -> { canvas.setOnMouseMoved(event -> {
@@ -20,6 +24,9 @@ public class ReversiBitCanvas extends BitGameCanvas {
break; break;
} }
} }
if (hovered != null) {
checkHoverDots(hovered, cellId);
}
}); });
} }
@@ -31,9 +38,31 @@ public class ReversiBitCanvas extends BitGameCanvas {
@Override @Override
public void redraw(TurnBasedGame gameCopy) { public void redraw(TurnBasedGame gameCopy) {
this.gameCopy = gameCopy;
clearAll(); clearAll();
long[] board = gameCopy.getBoard(); long[] board = gameCopy.getBoard();
loopOverBoard(board[0], (i) -> drawDot(Color.WHITE, i)); loopOverBoard(board[0], (i) -> drawDot(Color.WHITE, i));
loopOverBoard(board[1], (i) -> drawDot(Color.BLACK, i)); loopOverBoard(board[1], (i) -> drawDot(Color.BLACK, i));
} }
public void drawLegalDots(TurnBasedGame gameCopy){
long legal = gameCopy.getLegalMoves();
loopOverBoard(legal, (i) -> drawInnerDot(gameCopy.getCurrentTurn()==0?new Color(1f,1f,1f,0.65f) :new Color(0f,0f,0f,0.65f), i,false));
}
private void checkHoverDots(BitGameCanvas.Cell hovered, int cellId){
if (previousCell == cellId){
return;
}
long backflips = ((BitboardReversi)gameCopy).getFlips(1L << previousCell);
loopOverBoard(backflips, (i) -> drawInnerDot(gameCopy.getCurrentTurn()==1?Color.WHITE:Color.BLACK, i,true));
previousCell = cellId;
if (gameCopy.getPlayer(gameCopy.getCurrentTurn()) instanceof LocalPlayer) {
long legal = gameCopy.getLegalMoves();
if ((legal & (1L << cellId)) != 0) {
long flips = ((BitboardReversi) gameCopy).getFlips(1L << cellId);
loopOverBoard(flips, (i) -> drawInnerDot(gameCopy.getCurrentTurn() == 0 ? Color.WHITE : Color.BLACK, i, false));
}
}
}
} }

View File

@@ -5,6 +5,7 @@ import javafx.geometry.Pos;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
import org.toop.app.canvas.GameCanvas; import org.toop.app.canvas.GameCanvas;
import org.toop.app.canvas.ReversiBitCanvas;
import org.toop.app.widget.WidgetContainer; import org.toop.app.widget.WidgetContainer;
import org.toop.app.widget.view.GameView; import org.toop.app.widget.view.GameView;
import org.toop.framework.eventbus.EventFlow; import org.toop.framework.eventbus.EventFlow;
@@ -153,6 +154,12 @@ public class GenericGameController implements GameController {
@Override @Override
public void updateUI() { public void updateUI() {
canvas.redraw(game.deepCopy()); TurnBasedGame gameCopy = game.deepCopy();
canvas.redraw(gameCopy);
String gameType = game.getClass().getSimpleName().replace("Bitboard","");
gameView.nextPlayer(true, getCurrentPlayer().getName(), game.getPlayer(1-getCurrentPlayerIndex()).getName(),gameType);
if (getCurrentPlayer() instanceof LocalPlayer && gameType.equals("Reversi")){
((ReversiBitCanvas)canvas).drawLegalDots(gameCopy);
}
} }
} }

View File

@@ -6,6 +6,8 @@ import javafx.scene.text.Font;
import org.toop.app.widget.Primitive; import org.toop.app.widget.Primitive;
import org.toop.app.widget.complex.ViewWidget; import org.toop.app.widget.complex.ViewWidget;
import org.toop.app.widget.popup.GameOverPopup; import org.toop.app.widget.popup.GameOverPopup;
import java.util.Objects;
import java.util.function.Consumer; import java.util.function.Consumer;
import javafx.application.Platform; import javafx.application.Platform;
import javafx.geometry.Pos; import javafx.geometry.Pos;
@@ -94,7 +96,7 @@ public final class GameView extends ViewWidget {
} }
} }
public void nextPlayer(boolean isMe, String currentPlayer, String currentMove, String nextPlayer, char GameType) { public void nextPlayer(boolean isMe, String currentPlayer, String nextPlayer, String GameType) {
Platform.runLater(() -> { Platform.runLater(() -> {
if (!(hasSet)) { if (!(hasSet)) {
playerHeader.setText(currentPlayer + " vs. " + nextPlayer); playerHeader.setText(currentPlayer + " vs. " + nextPlayer);
@@ -112,8 +114,8 @@ public final class GameView extends ViewWidget {
new GameOverPopup(iWon, winner).show(Pos.CENTER); new GameOverPopup(iWon, winner).show(Pos.CENTER);
} }
private void setPlayerHeaders(boolean isMe, String currentPlayer, String nextPlayer, char GameType) { private void setPlayerHeaders(boolean isMe, String currentPlayer, String nextPlayer, String GameType) {
if (GameType == 'T') { if (Objects.equals(GameType, "TicTacToe")) {
if (isMe) { if (isMe) {
player1Header.setText("X: " + currentPlayer); player1Header.setText("X: " + currentPlayer);
player2Header.setText("O: " + nextPlayer); player2Header.setText("O: " + nextPlayer);
@@ -124,7 +126,7 @@ public final class GameView extends ViewWidget {
} }
setPlayerInfoTTT(); setPlayerInfoTTT();
} }
else if (GameType == 'R') { else if (Objects.equals(GameType, "Reversi")) {
if (isMe) { if (isMe) {
player1Header.setText(currentPlayer); player1Header.setText(currentPlayer);
player2Header.setText(nextPlayer); player2Header.setText(nextPlayer);
@@ -172,8 +174,8 @@ public final class GameView extends ViewWidget {
player1Icon.setRadius(player1Header.fontProperty().map(Font::getSize).getValue()); player1Icon.setRadius(player1Header.fontProperty().map(Font::getSize).getValue());
player2Icon.setRadius(player2Header.fontProperty().map(Font::getSize).getValue()); player2Icon.setRadius(player2Header.fontProperty().map(Font::getSize).getValue());
player1Icon.setFill(Color.BLACK); player1Icon.setFill(Color.WHITE);
player2Icon.setFill(Color.WHITE); player2Icon.setFill(Color.BLACK);
add(Pos.TOP_RIGHT, playerInfo); add(Pos.TOP_RIGHT, playerInfo);
} }
} }

View File

@@ -88,7 +88,7 @@ public class LocalMultiplayerView extends ViewWidget {
if (information.players[1].isHuman) { if (information.players[1].isHuman) {
players[1] = new LocalPlayer(information.players[1].name); players[1] = new LocalPlayer(information.players[1].name);
} else { } else {
players[1] = new ArtificialPlayer(new MCTSAI2(50), "MCTS V2 AI"); players[1] = new ArtificialPlayer(new MCTSAI(50), "MCTS V1 AI");
} }
if (AppSettings.getSettings().getTutorialFlag() && AppSettings.getSettings().getFirstReversi()) { if (AppSettings.getSettings().getTutorialFlag() && AppSettings.getSettings().getFirstReversi()) {
new ShowEnableTutorialWidget( new ShowEnableTutorialWidget(