diff --git a/src/main/java/model/BorderSquareIterator.java b/src/main/java/model/BorderSquareIterator.java index 93f0fc9eab40ef81156f97bf8c51e45174a77b55..ce5b0f4c38f73dcedc218315500939a108ad5d60 100644 --- a/src/main/java/model/BorderSquareIterator.java +++ b/src/main/java/model/BorderSquareIterator.java @@ -63,7 +63,7 @@ public class BorderSquareIterator implements Iterator<Square> { } } else { - if(columnIndex == grid.getNumberOfColumns()-2){ + if(columnIndex == grid.getNumberOfColumns() - 2){ rowIndex = grid.getNumberOfRows(); } else{ diff --git a/src/main/java/model/CardinalDirection.java b/src/main/java/model/CardinalDirection.java index 78d7d061b971f856f5e56a367e8aa54c89a83ab5..5190e2bd8e5b160f1c4152d884cf86a630f18439 100644 --- a/src/main/java/model/CardinalDirection.java +++ b/src/main/java/model/CardinalDirection.java @@ -6,12 +6,12 @@ public enum CardinalDirection { SOUTH(1, 0), WEST(0, -1); - public final int deltaX; - public final int deltaY; + public final int deltaRow; + public final int deltaColumn; - CardinalDirection(int deltaX, int deltaY) { - this.deltaX = deltaX; - this.deltaY = deltaY; + CardinalDirection(int deltaRow, int deltaColumn) { + this.deltaRow = deltaRow; + this.deltaColumn = deltaColumn; } public CardinalDirection oppositeDirection(){ diff --git a/src/main/java/model/RandomTileGenerator.java b/src/main/java/model/RandomTileGenerator.java index 92ffa8dc6906ad739008b3153395f99974e83544..7f21231790e7571e13cd33038ddfaf7e64ebcc76 100644 --- a/src/main/java/model/RandomTileGenerator.java +++ b/src/main/java/model/RandomTileGenerator.java @@ -33,4 +33,12 @@ public class RandomTileGenerator { return new Tile(colorsOfTile); } + public Tile nextTileWithColorConstraint(Square square){ + Color[] colorsOfTile = new Color[4]; + for(CardinalDirection side : CardinalDirection.values()){ + colorsOfTile[side.ordinal()] = square.getColorConstraint(side).orElse(randomColor()); + } + return new Tile(colorsOfTile); + } + } diff --git a/src/main/java/model/Square.java b/src/main/java/model/Square.java index 61f9488b971c06e645464a40b2e13b0c94c421a4..060679133086fb1e37326ea7eddd2680e667018a 100644 --- a/src/main/java/model/Square.java +++ b/src/main/java/model/Square.java @@ -1,5 +1,7 @@ package model; +import javafx.scene.paint.Color; + import java.util.NoSuchElementException; import java.util.Optional; @@ -11,7 +13,7 @@ public class Square { this.tile = tile; this.neighboringSquares = neighboringSquares; } - private Square(Square[] neighboringSquares) { + public Square(Square[] neighboringSquares) { this(null, neighboringSquares); } @@ -33,4 +35,17 @@ public class Square { public boolean hasTile() { return tile != null; } + + public Optional<Color> getColorConstraint(CardinalDirection side) { + if (neighboringSquares == null) + throw new NoSuchElementException(); + Square neighboringSquare = neighboringSquares[side.ordinal()]; + if(!neighboringSquare.hasTile()) + return Optional.empty(); + return Optional.of(neighboringSquare.getTile().getColor(side.oppositeDirection())); + } + + public void setNeighboringSquares(Square[] neighboringSquares) { + this.neighboringSquares = neighboringSquares; + } } diff --git a/src/main/java/model/SquareGrid.java b/src/main/java/model/SquareGrid.java index f224952497982c8cb837b16b4e746c927f17bf62..8175c5db1e430ba68f6a557a0902b9094aa20551 100644 --- a/src/main/java/model/SquareGrid.java +++ b/src/main/java/model/SquareGrid.java @@ -28,19 +28,20 @@ public class SquareGrid implements Iterable<Square> { private Square[][] allocateMatrix() { Square[][] matrix = new Square[getNumberOfRows()][getNumberOfColumns()]; for(int row = 0; row < getNumberOfRows(); row++) - for(int column = 0; column < getNumberOfRows(); column++) - if(!squareIsInternal(row, column)) - matrix[row][column] = new Square(); - else { + for(int column = 0; column < getNumberOfColumns(); column++) matrix[row][column] = new Square(); + for(int row = 1; row < getNumberOfRows() - 1; row++) + for(int column = 1; column < getNumberOfColumns() - 1; column++) { + Square[] neighboringSquares = new Square[CardinalDirection.values().length]; + for (int index = 0; index < neighboringSquares.length; index++){ + CardinalDirection direction = CardinalDirection.values()[index]; + neighboringSquares[index] = matrix[row + direction.deltaRow][column + direction.deltaColumn]; + } + matrix[row][column].setNeighboringSquares(neighboringSquares); } return matrix; } - private boolean squareIsInternal(int row, int column){ - return 1 <= row && row < getNumberOfRows()-1 && 1 <= column && column < getNumberOfColumns()-1; - } - /** * Returns an iterator over elements of type {@code T}. * @@ -76,8 +77,9 @@ public class SquareGrid implements Iterable<Square> { public void fillWithRandomTiles(List<Color> colors, Random randomGenerator){ RandomTileGenerator randomTileGenerator = new RandomTileGenerator(colors, randomGenerator); - internalSquareIterator().forEachRemaining(square -> square.add(randomTileGenerator.nextTile())); + borderSquareIterator().forEachRemaining(square -> square.add(randomTileGenerator.nextUniformTile())); + internalSquareIterator().forEachRemaining(square -> square.add(randomTileGenerator.nextTileWithColorConstraint(square))); } public boolean hasTile(int row, int column) {