diff --git a/src/main/java/model/AbstractGrid.java b/src/main/java/model/AbstractGrid.java new file mode 100644 index 0000000000000000000000000000000000000000..0f468c9fc6d3b9d07d2c84d848ba8fa2d911005f --- /dev/null +++ b/src/main/java/model/AbstractGrid.java @@ -0,0 +1,65 @@ +package model; + +import java.util.Iterator; + +public abstract class AbstractGrid implements Grid { + + protected final int numberOfRows; + protected final int numberOfColumns; + + public AbstractGrid(int numberOfRows, int numberOfColumns) { + if(numberOfRows <= 0) + throw new IllegalArgumentException("The number of rows must be positive and not equal to " + numberOfRows); + if(numberOfColumns <= 0) + throw new IllegalArgumentException("The number of columns must be positive and not equal to " + numberOfColumns); + this.numberOfRows = numberOfRows; + this.numberOfColumns = numberOfColumns; + } + + protected void initializeGrid() { + initializeSquares(); + initializeNeighborhood(); + } + + protected abstract void initializeSquares(); + + private void initializeNeighborhood() { + for(int row = 0; row < getNumberOfRows(); row++) + for(int column = 0; column < getNumberOfColumns(); column++) { + for (CardinalDirection direction : CardinalDirection.values()){ + int rowNeighbor = row + direction.deltaRow; + int columnNeighbor = column + direction.deltaColumn; + Square neighboringSquare = + containsCoordinates(rowNeighbor, columnNeighbor) ? getSquare(rowNeighbor, columnNeighbor) : EmptySquare.EMPTY_SQUARE; + getSquare(row, column).setNeighbor(neighboringSquare, direction); + } + } + } + + private boolean containsCoordinates(int row, int column){ + return 0 <= row && row < numberOfRows && 0 <= column && column < numberOfColumns; + } + + /** + * Returns an iterator over Squares. + * + * @return an Iterator. + */ + @Override + public Iterator<Square> iterator() { + return new SquareGridIterator(this); + } + + public int getNumberOfRows() { + return numberOfRows; + } + + public int getNumberOfColumns() { + return numberOfColumns; + } + + public void fill(TileGenerator tileGenerator){ + for(Square square : this) + square.put(tileGenerator.nextTile(square)); + } +} diff --git a/src/main/java/model/ArrayGrid.java b/src/main/java/model/ArrayGrid.java index 05783a225a43f066bdcc9b74ca5e35f64da42c8d..5c958ea713c6900c1649cd84505ed69b78081e08 100644 --- a/src/main/java/model/ArrayGrid.java +++ b/src/main/java/model/ArrayGrid.java @@ -1,9 +1,6 @@ package model; -import java.util.Iterator; -public class ArrayGrid implements Grid { - private final int numberOfRows; - private final int numberOfColumns; +public class ArrayGrid extends AbstractGrid { private final Square[][] squares; /** * Creates a new {@code Grid} instance given the number of rows and columns. @@ -14,68 +11,19 @@ public class ArrayGrid implements Grid { * less than or equal to 0 */ public ArrayGrid(int numberOfRows, int numberOfColumns) { - if(numberOfRows <= 0) - throw new IllegalArgumentException("The number of rows must be positive and not equal to " + numberOfRows); - if(numberOfColumns <= 0) - throw new IllegalArgumentException("The number of columns must be positive and not equal to " + numberOfColumns); - this.numberOfRows = numberOfRows; - this.numberOfColumns = numberOfColumns; + super(numberOfRows, numberOfColumns); squares = new ArraySquare[getNumberOfRows()][getNumberOfColumns()]; initializeGrid(); } - private void initializeGrid() { - initializeSquares(); - initializeNeighborhood(); - } - - private void initializeSquares() { + @Override + protected void initializeSquares() { for(int row = 0; row < getNumberOfRows(); row++) for(int column = 0; column < getNumberOfColumns(); column++) squares[row][column] = new ArraySquare(); } - private void initializeNeighborhood() { - for(int row = 0; row < getNumberOfRows(); row++) - for(int column = 0; column < getNumberOfColumns(); column++) { - for (CardinalDirection direction : CardinalDirection.values()){ - int rowNeighbor = row + direction.deltaRow; - int columnNeighbor = column + direction.deltaColumn; - Square neighboringSquare = - containsCoordinates(rowNeighbor, columnNeighbor) ? getSquare(rowNeighbor, columnNeighbor) : EmptySquare.EMPTY_SQUARE; - getSquare(row, column).setNeighbor(neighboringSquare, direction); - } - } - } - - private boolean containsCoordinates(int row, int column){ - return 0 <= row && row < numberOfRows && 0 <= column && column < numberOfColumns; - } - - /** - * Returns an iterator over Squares. - * - * @return an Iterator. - */ - @Override - public Iterator<Square> iterator() { - return new SquareGridIterator(this); - } - public Square getSquare(int rowIndex, int columnIndex) { return squares[rowIndex][columnIndex]; } - - public int getNumberOfRows() { - return numberOfRows; - } - - public int getNumberOfColumns() { - return numberOfColumns; - } - - public void fill(TileGenerator tileGenerator){ - for(Square square : this) - square.put(tileGenerator.nextTile(square)); - } } diff --git a/src/main/java/model/SquareGridIterator.java b/src/main/java/model/SquareGridIterator.java index ae1dd2f307d4b7c952d086188b3ef81f6fdd2498..e364cea4929adfc03df98fbc27e997924b144fd3 100644 --- a/src/main/java/model/SquareGridIterator.java +++ b/src/main/java/model/SquareGridIterator.java @@ -5,9 +5,9 @@ import java.util.Iterator; public class SquareGridIterator implements Iterator<Square> { private int rowNext; private int columnNext; - private final ArrayGrid grid; + private final Grid grid; - SquareGridIterator(ArrayGrid grid) { + SquareGridIterator(Grid grid) { this.rowNext = 0; this.columnNext = 0; this.grid = grid;