diff --git a/app/src/main/java/org/toop/app/canvas/BitGameCanvas.java b/app/src/main/java/org/toop/app/canvas/BitGameCanvas.java index 5b62274..b3ea371 100644 --- a/app/src/main/java/org/toop/app/canvas/BitGameCanvas.java +++ b/app/src/main/java/org/toop/app/canvas/BitGameCanvas.java @@ -101,29 +101,13 @@ public abstract class BitGameCanvas> implements GameCa render(); } - protected int[] translateLegalMoves(long legalMoves){ - int[] output = new int[Long.bitCount(legalMoves)]; - int j = 0; - for(int i = 0; i < 64; i++){ - if ((legalMoves & (1L << i)) != 0){ - output[j] = i; - j++; - } - } - return output; - } + public void loopOverBoard(long bb, Consumer onCell){ + while (bb != 0) { + int idx = Long.numberOfTrailingZeros(bb); // index of least-significant 1-bit + onCell.accept(idx); - protected static int[] translateBoard(long[] playerBitboard){ - int[] output = new int[64]; - Arrays.fill(output, -1); - for(int i = 0; i < playerBitboard.length; i++){ - for (int j = 0; j < 64; j++){ - if ((playerBitboard[i] & (1L << j)) != 0){ - output[j] = i; - } - } + bb &= bb - 1; // clear LSB 1-bit } - return output; } private void render() { 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 a4701f6..7c2bde0 100644 --- a/app/src/main/java/org/toop/app/canvas/ReversiBitCanvas.java +++ b/app/src/main/java/org/toop/app/canvas/ReversiBitCanvas.java @@ -7,9 +7,9 @@ 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 { 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 -> { double mouseX = event.getX(); double mouseY = event.getY(); @@ -27,21 +27,16 @@ public class ReversiBitCanvas extends BitGameCanvas{ } private int turnCoordsIntoCellId(double x, double y) { - final int column = (int) ((x / this.width) * rowSize); - final int row = (int) ((y / this.height) * columnSize); - return column + row * rowSize; - } + final int column = (int) ((x / this.width) * rowSize); + final int row = (int) ((y / this.height) * columnSize); + return column + row * rowSize; + } @Override public void redraw(BitboardReversi gameCopy) { clearAll(); - int[] board = translateBoard(gameCopy.getBoard()); - for (int i = 0; i < board.length; i++) { - if (board[i] == 0) { - drawDot(Color.WHITE, i); - } else if (board[i] == 1) { - drawDot(Color.BLACK, i); - } - } + long[] board = gameCopy.getBoard(); + loopOverBoard(board[0], (i) -> drawDot(Color.WHITE, i)); + loopOverBoard(board[1], (i) -> drawDot(Color.BLACK, i)); } } diff --git a/app/src/main/java/org/toop/app/canvas/TicTacToeBitCanvas.java b/app/src/main/java/org/toop/app/canvas/TicTacToeBitCanvas.java index fec412a..443adbd 100644 --- a/app/src/main/java/org/toop/app/canvas/TicTacToeBitCanvas.java +++ b/app/src/main/java/org/toop/app/canvas/TicTacToeBitCanvas.java @@ -5,6 +5,7 @@ import org.toop.app.App; import org.toop.game.games.tictactoe.BitboardTicTacToe; import java.util.Arrays; +import java.util.function.Consumer; public class TicTacToeBitCanvas extends BitGameCanvas{ public TicTacToeBitCanvas() { @@ -23,26 +24,15 @@ public class TicTacToeBitCanvas extends BitGameCanvas{ @Override public void redraw(BitboardTicTacToe gameCopy) { clearAll(); - drawMoves(translateBoard(gameCopy.getBoard())); + drawMoves(gameCopy.getBoard()); } - private void drawMoves(int[] gameBoard){ - // Draw each square - for (int i = 0; i < 9; i++){ - // If square isn't empty, draw player move - if (gameBoard[i] != -1){ - drawPlayerMove(gameBoard[i], i); - } - } + private void drawMoves(long[] gameBoard){ + loopOverBoard(gameBoard[0], (i) -> drawX(Color.RED, i)); + loopOverBoard(gameBoard[1], (i) -> drawO(Color.BLUE, i)); + } - public void drawPlayerMove(int player, int move) { - switch (player) { - case 0 -> drawX(Color.RED, move); - case 1 -> drawO(Color.BLUE, move); - default -> super.drawPlayerMove(player, move); - } - } public void drawX(Color color, int cell) { graphics.setStroke(color); diff --git a/game/src/main/java/org/toop/game/BitboardGame.java b/game/src/main/java/org/toop/game/BitboardGame.java index c6292fb..4ebdb95 100644 --- a/game/src/main/java/org/toop/game/BitboardGame.java +++ b/game/src/main/java/org/toop/game/BitboardGame.java @@ -75,6 +75,8 @@ public abstract class BitboardGame> implements TurnBas return players[getCurrentPlayerIndex()]; } + + @Override public long[] getBoard() {return this.playerBitboard;}