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 685a985..d210b16 100644 --- a/app/src/main/java/org/toop/app/canvas/ReversiBitCanvas.java +++ b/app/src/main/java/org/toop/app/canvas/ReversiBitCanvas.java @@ -2,9 +2,13 @@ package org.toop.app.canvas; import javafx.scene.paint.Color; 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; public class ReversiBitCanvas extends BitGameCanvas { + private TurnBasedGame gameCopy; + private int previousCell; 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 -> { @@ -20,6 +24,9 @@ public class ReversiBitCanvas extends BitGameCanvas { break; } } + if (hovered != null) { + checkHoverDots(hovered, cellId); + } }); } @@ -31,9 +38,31 @@ public class ReversiBitCanvas extends BitGameCanvas { @Override public void redraw(TurnBasedGame gameCopy) { + this.gameCopy = gameCopy; clearAll(); long[] board = gameCopy.getBoard(); loopOverBoard(board[0], (i) -> drawDot(Color.WHITE, 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)); + } + } + } } 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 0c68a74..a301fbe 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.ReversiBitCanvas; import org.toop.app.widget.WidgetContainer; import org.toop.app.widget.view.GameView; import org.toop.framework.eventbus.EventFlow; @@ -153,6 +154,12 @@ public class GenericGameController implements GameController { @Override 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); + } } } 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 441cc0e..8362603 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 @@ -6,6 +6,8 @@ import javafx.scene.text.Font; import org.toop.app.widget.Primitive; import org.toop.app.widget.complex.ViewWidget; import org.toop.app.widget.popup.GameOverPopup; + +import java.util.Objects; import java.util.function.Consumer; import javafx.application.Platform; 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(() -> { if (!(hasSet)) { playerHeader.setText(currentPlayer + " vs. " + nextPlayer); @@ -112,8 +114,8 @@ public final class GameView extends ViewWidget { new GameOverPopup(iWon, winner).show(Pos.CENTER); } - private void setPlayerHeaders(boolean isMe, String currentPlayer, String nextPlayer, char GameType) { - if (GameType == 'T') { + private void setPlayerHeaders(boolean isMe, String currentPlayer, String nextPlayer, String GameType) { + if (Objects.equals(GameType, "TicTacToe")) { if (isMe) { player1Header.setText("X: " + currentPlayer); player2Header.setText("O: " + nextPlayer); @@ -124,7 +126,7 @@ public final class GameView extends ViewWidget { } setPlayerInfoTTT(); } - else if (GameType == 'R') { + else if (Objects.equals(GameType, "Reversi")) { if (isMe) { player1Header.setText(currentPlayer); player2Header.setText(nextPlayer); @@ -172,8 +174,8 @@ public final class GameView extends ViewWidget { player1Icon.setRadius(player1Header.fontProperty().map(Font::getSize).getValue()); player2Icon.setRadius(player2Header.fontProperty().map(Font::getSize).getValue()); - player1Icon.setFill(Color.BLACK); - player2Icon.setFill(Color.WHITE); + player1Icon.setFill(Color.WHITE); + player2Icon.setFill(Color.BLACK); add(Pos.TOP_RIGHT, playerInfo); } } \ No newline at end of file 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 9139720..afee3f2 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 @@ -88,7 +88,7 @@ public class LocalMultiplayerView extends ViewWidget { if (information.players[1].isHuman) { players[1] = new LocalPlayer(information.players[1].name); } 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()) { new ShowEnableTutorialWidget(