From 92ed70fa372379482cfc2813c89ddbd1ecdf443f Mon Sep 17 00:00:00 2001
From: arnaudlabourel <arnaud.labourel@univ-amu.fr>
Date: Fri, 1 Oct 2021 17:50:44 +0200
Subject: [PATCH] Changed code to generate a grid of tiles with constrained
 colors.

---
 src/main/java/model/BorderSquareIterator.java |  2 +-
 src/main/java/model/CardinalDirection.java    | 10 +++++-----
 src/main/java/model/RandomTileGenerator.java  |  8 ++++++++
 src/main/java/model/Square.java               | 17 +++++++++++++++-
 src/main/java/model/SquareGrid.java           | 20 ++++++++++---------
 5 files changed, 41 insertions(+), 16 deletions(-)

diff --git a/src/main/java/model/BorderSquareIterator.java b/src/main/java/model/BorderSquareIterator.java
index 93f0fc9..ce5b0f4 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 78d7d06..5190e2b 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 92ffa8d..7f21231 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 61f9488..0606791 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 f224952..8175c5d 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) {
-- 
GitLab