From 5db5fe280f8f7350ac688b3e3f0afc5d6275c4b8 Mon Sep 17 00:00:00 2001 From: Dorian HAMDANI Date: Mon, 7 Apr 2025 09:01:04 +0200 Subject: [PATCH] Add console renderer base and fix load() issues --- src/ConsoleRenderer.java | 40 +++++++++- src/GomokuBoard.java | 158 +++++++++++---------------------------- src/GomokuGame.java | 3 +- 3 files changed, 81 insertions(+), 120 deletions(-) diff --git a/src/ConsoleRenderer.java b/src/ConsoleRenderer.java index 8388013..547179e 100644 --- a/src/ConsoleRenderer.java +++ b/src/ConsoleRenderer.java @@ -1,16 +1,48 @@ - public class ConsoleRenderer extends GomokuRenderer { - public ConsoleRenderer() {} + public ConsoleRenderer() { + } @Override public void init(GomokuGame game) { - System.out.println("Console Renderer initialized."); + this.game = game; + System.out.println("ConsoleRenderer initialized"); } @Override public void update() { - // TODO: draw the board + // Print the board to the console + + String[] board = game.getBoard().toString().split("\n"); + String horizontalLine = getHorizontalLine(); + int width = game.getBoard().getWidth(); + int height = game.getBoard().getHeight(); + + // Print a separator line, followed by the game infos + System.out.println(horizontalLine); + System.out.println("|" + String.format(" %-" + (width - 1) + "s", "Gomoku Game!") + "|"); + // System.out.println("Current player: " + game.getCurrentPlayer().getName()); + // System.out.println("Number of tokens left: " + game.getCurrentPlayer().getTokensLeft()); + + // Print the board + System.out.println(horizontalLine); + for (int i = 0; i < height; i++) { + System.out.print("|"); + System.out.print(board[i]); + System.out.println("|"); + } + System.out.println(horizontalLine); + + } + + private String getHorizontalLine() { + StringBuilder sb = new StringBuilder(); + sb.append("+"); + for (int i = 0; i < game.getBoard().getWidth(); i++) { + sb.append("-"); + } + sb.append("+"); + return sb.toString(); } } diff --git a/src/GomokuBoard.java b/src/GomokuBoard.java index 2bd412b..6f469be 100644 --- a/src/GomokuBoard.java +++ b/src/GomokuBoard.java @@ -32,13 +32,13 @@ public class GomokuBoard{ System.out.println(Cardinal.NE.inverse()); System.out.println(test); - test.expandBoardv2(Cardinal.N); + test.expandBoard(Cardinal.N); System.out.println(test); - test.expandBoardv2(Cardinal.S); + test.expandBoard(Cardinal.S); System.out.println(test); - test.expandBoardv2(Cardinal.W); + test.expandBoard(Cardinal.W); System.out.println(test); - test.expandBoardv2(Cardinal.SE); + test.expandBoard(Cardinal.SE); System.out.println(test); } @@ -105,7 +105,23 @@ public class GomokuBoard{ } //------------------Gets-------------------------- - + + /** + * Returns the width of the board. + * @return The width of the board. + */ + public int getWidth() { + return this.boardWidth; + } + + /** + * Returns the height of the board. + * @return The height of the board. + */ + public int getHeight() { + return this.boardHeight; + } + /** * This method get a cell in specific position in the board. * @param x The position x on the board. @@ -165,6 +181,25 @@ public class GomokuBoard{ return output; } + + //------------------Gets-------------------------- + + /** + * Set the width of the board. + * @param width The new width of the board. + */ + public void setWidth(int width) { + this.boardWidth = width; + } + + /** + * Set the height of the board. + * @param height The new height of the board. + */ + public void setHeight(int height) { + this.boardHeight = height; + } + //------------------Methods-------------------------- /** @@ -202,112 +237,6 @@ public class GomokuBoard{ return max; } - /** - * This method create one line/column in a specific direction. This method is used in expandBoard, it's no recommended to - * used it in other context. - * @param act Is the cell of the start of the line/column. - * @param top Is the cell of the start of the line/column already existing. - * @param topDir The direction of the line top in relation of the line/column we create. - * @param m The direction topDir - 1. - * @param p The direction topDir + 1. - * @param dir Direction where to add the next cell. - * @param maxLen Number of cell ton gen. - */ - private void genLineOrColumn(GomokuCell act, GomokuCell top, Cardinal topDir, Cardinal m, Cardinal p, Cardinal dir, int maxLen){ - for (int i = 0; i < maxLen; i++) { - if (top != null) { - GomokuCell.link(act, top.getNeighbour(topDir),m); - GomokuCell.link(act, top, topDir); - top = top.getNeighbour(dir); - GomokuCell.link(act, top , m); - - } - if (i != maxLen -1 ){ - GomokuCell right = new GomokuCell(Color.NIL); - GomokuCell.link(act, right, dir); - act = right; - } - } - - } - - /** - * This method expand the board. - * @param direction Is the direction where the method expand the board. - */ - public void expandBoard(Cardinal direction){ - switch (direction) { - case Cardinal.SE: - this.expandBoard(Cardinal.S); - this.expandBoard(Cardinal.E); - return; - - case Cardinal.NE: - this.expandBoard(Cardinal.N); - this.expandBoard(Cardinal.E); - return; - - case Cardinal.SW: - this.expandBoard(Cardinal.S); - this.expandBoard(Cardinal.W); - return; - - case Cardinal.NW: - this.expandBoard(Cardinal.N); - this.expandBoard(Cardinal.W); - return; - - default: - break; - } - - List cardinals = Arrays.asList(Cardinal.values()); - Cardinal topDirection = cardinals.get((cardinals.indexOf(direction) + 4)%8); - - GomokuCell act = new GomokuCell(Color.NIL); - int maxLen = 0; - GomokuCell top = null; - GomokuCell newOrigin = null; - switch (direction) { - case Cardinal.N: - top = this.get(0, 0); - maxLen = this.boardWidth; - newOrigin = act; - this.genLineOrColumn(act, top, topDirection, Cardinal.SW, Cardinal.SE, Cardinal.E, maxLen); - this.boardHeight += 1; - break; - - case Cardinal.W: - top = this.get(0,0); - maxLen = this.boardHeight; - newOrigin = act; - this.genLineOrColumn(act, top, topDirection, Cardinal.NE, Cardinal.SE, Cardinal.S, maxLen); - this.boardWidth += 1; - break; - - case Cardinal.S: - top = this.get(this.boardHeight-1, 0); - maxLen = this.boardWidth; - newOrigin = this.get(0, 0); - this.genLineOrColumn(act, top, topDirection, Cardinal.NW, Cardinal.NE, Cardinal.E, maxLen); - this.boardHeight += 1; - break; - - case Cardinal.E: - top = this.get(0, this.boardWidth-1); - maxLen = this.boardHeight; - newOrigin = this.get(0, 0); - this.genLineOrColumn(act, top, topDirection, Cardinal.NW, Cardinal.SW, Cardinal.S, maxLen); - this.boardWidth += 1; - break; - - default: - throw new IllegalStateException("Why are you here ?"); - } - this.firstCell = newOrigin; - } - - /** * Expands the board in the specified direction. * This method is used to add a new row, column, or both to the board. @@ -315,16 +244,15 @@ public class GomokuBoard{ * It also updates the board dimensions accordingly. * @param direction The cardinal direction in which to expand the board. * @see Cardinal - * @version 2.0 */ - public void expandBoardv2(Cardinal direction) { + public void expandBoard(Cardinal direction) { // for composed directions, expand in both components // e.g. SE -> expand in S and E if ((direction.asInt() % 2) != 0) { // if the direction is not even, it is a composed direction // call the same function in both components - this.expandBoardv2(direction.rotate(-1)); - this.expandBoardv2(direction.rotate(1)); + this.expandBoard(direction.rotate(-1)); + this.expandBoard(direction.rotate(1)); return; } diff --git a/src/GomokuGame.java b/src/GomokuGame.java index 91d04cd..a6a3b50 100644 --- a/src/GomokuGame.java +++ b/src/GomokuGame.java @@ -2,6 +2,7 @@ import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.util.Random; +import java.io.BufferedReader; import java.io.BufferedWriter; public class GomokuGame { @@ -87,7 +88,7 @@ public class GomokuGame { // Write the board for (int i = 0; i < this.getBoard().getHeight(); ++i) { for (int j = 0; j < this.getBoard().getWidth(); ++j) { - char c; + char c = ' '; switch (board.get(i, j).getState()) { case BLACK: c = 'X';