From f1908b4d0d33aa72eaec70e5655f70b57e54290a Mon Sep 17 00:00:00 2001
From: Hang <thi-hang.NGUYEN@etu.univ-amu.fr>
Date: Fri, 18 Nov 2022 17:19:45 +0100
Subject: [PATCH] THN

---
 app/src/main/java/model/ArrayGrid.java        | 76 +++++++++++++------
 .../main/java/model/ColoredCellIterator.java  |  4 +-
 app/src/main/java/model/ComputerPlayer.java   | 41 ++++++++--
 .../main/java/model/CyclicColorGenerator.java |  8 +-
 app/src/main/java/model/CyclicStrategy.java   | 22 ++++++
 app/src/main/java/model/FloodGame.java        |  8 +-
 app/src/main/java/model/Flooder.java          | 18 ++++-
 app/src/main/java/model/GreedyStrategy.java   | 10 +++
 app/src/main/java/model/HumanPlayer.java      | 11 ++-
 app/src/main/java/model/Player.java           |  2 +-
 app/src/main/java/model/RandomStrategy.java   | 20 +++++
 app/src/main/java/model/RandomWalk.java       | 29 +++++++
 12 files changed, 198 insertions(+), 51 deletions(-)
 create mode 100644 app/src/main/java/model/CyclicStrategy.java
 create mode 100644 app/src/main/java/model/GreedyStrategy.java
 create mode 100644 app/src/main/java/model/RandomStrategy.java
 create mode 100644 app/src/main/java/model/RandomWalk.java

diff --git a/app/src/main/java/model/ArrayGrid.java b/app/src/main/java/model/ArrayGrid.java
index 8838c64..0f5904b 100644
--- a/app/src/main/java/model/ArrayGrid.java
+++ b/app/src/main/java/model/ArrayGrid.java
@@ -12,34 +12,62 @@ public class ArrayGrid implements Grid{
     public ArrayGrid(int numberOfRows, int numberOfColumns){
         if (numberOfRows <= 0 || numberOfColumns <= 0){
             throw new IllegalArgumentException();}
-        else{
-            this.numberOfColumns=numberOfColumns;
-            this.numberOfRows=numberOfRows;
-            this.cells=new SquareCell[numberOfRows][numberOfColumns];
-            for (int i=0; i< numberOfRows;i++){
-                for (int j=0; j < numberOfColumns; j++){
+        else {
+            this.numberOfColumns = numberOfColumns;
+            this.numberOfRows = numberOfRows;
+            this.cells = new SquareCell[numberOfRows][numberOfColumns];
+            for (int i = 0; i < numberOfRows; i++) {
+                for (int j = 0; j < numberOfColumns; j++) {
                     cells[i][j] = new SquareCell();
                 }
             }
-        }
-        for(int i=0; i< this.numberOfRows;i++){
-            for(int j=0; j< this.numberOfColumns; j++){
-                List<Cell> neighbours= new ArrayList<Cell>();
-                if (i==0)
-                    neighbours.add(getCell(i+1,j));
-                if (i==numberOfRows-1)
-                    neighbours.add(getCell(i-1,j));
-                if (j==0)
-                    neighbours.add(getCell(i,j+1));
-                if (j==numberOfColumns-1)
-                    neighbours.add(getCell(i, j-1));
-                else {
-                    neighbours.add(getCell(i - 1, j));
-                    neighbours.add(getCell(i, j - 1));
-                    neighbours.add(getCell(i + 1, j));
-                    neighbours.add(getCell(i, j + 1));
+
+            for (int i = 0; i < this.numberOfRows; i++) {
+                for (int j = 0; j < this.numberOfColumns; j++) {
+                    if ((0 < i && i < this.numberOfRows - 1) && (0 < j && j < this.numberOfColumns - 1)) {
+                        this.getCell(i,i).getNeighbours().add(this.cells[i - 1][j]);
+                        this.getCell(i,i).getNeighbours().add(getCell(i, j - 1));
+                        this.getCell(i,i).getNeighbours().add(getCell(i + 1, j));
+                        this.getCell(i,i).getNeighbours().add(getCell(i, j + 1));
+                    }
+                    if (i == 0 && j == 0) {
+                        this.getCell(i,i).getNeighbours().add(this.cells[i + 1][j]);
+                        this.getCell(i,i).getNeighbours().add(this.cells[i][j + 1]);
+                    }
+                    if (i == numberOfRows - 1 && j == this.numberOfColumns - 1) {
+                        this.getCell(i,i).getNeighbours().add(this.cells[i - 1][j]);
+                        this.getCell(i,i).getNeighbours().add(this.cells[i][j - 1]);
+                    }
+                    if (i == this.numberOfRows - 1 && j == 0) {
+                        this.getCell(i,i).getNeighbours().add(this.cells[i - 1][j]);
+                        this.getCell(i,i).getNeighbours().add(this.cells[i][j + 1]);
+                    }
+                    if (i == 0 && j == numberOfColumns - 1) {
+                        this.getCell(i,i).getNeighbours().add(this.cells[i + 1][j]);
+                        this.getCell(i,i).getNeighbours().add(this.cells[i][j - 1]);
+                    }
+                    if (i == 0 & 0 < j && j < this.numberOfColumns - 1) {
+                        this.getCell(i,i).getNeighbours().add(this.cells[i][j - 1]);
+                        this.getCell(i,i).getNeighbours().add(this.cells[i + 1][j]);
+                        this.getCell(i,i).getNeighbours().add(this.cells[i][j + 1]);
+
+                    }
+                    if (i == this.numberOfRows - 1 & 0 < j && j < this.numberOfColumns - 1) {
+                        this.getCell(i,i).getNeighbours().add(this.cells[i][j - 1]);
+                        this.getCell(i,i).getNeighbours().add(this.cells[i][j + 1]);
+                        this.getCell(i,i).getNeighbours().add(this.cells[i - 1][j]);
+                    }
+                    if ((0 < i && i < this.numberOfRows - 1) && j == 0) {
+                        this.getCell(i,i).getNeighbours().add(this.cells[i - 1][j]);
+                        this.getCell(i,i).getNeighbours().add(this.cells[i + 1][j]);
+                        this.getCell(i,i).getNeighbours().add(this.cells[i][j + 1]);
+                    }
+                    if ((0 < i && i < this.numberOfRows - 1) && j == this.numberOfColumns - 1) {
+                        this.getCell(i,i).getNeighbours().add(this.cells[i - 1][j]);
+                        this.getCell(i,i).getNeighbours().add(this.cells[i + 1][j]);
+                        this.getCell(i,i).getNeighbours().add(this.cells[i][j - 1]);
+                    }
                 }
-                getCell(i,j).setNeighbours(neighbours);
             }
         }
     }
diff --git a/app/src/main/java/model/ColoredCellIterator.java b/app/src/main/java/model/ColoredCellIterator.java
index 010e0c7..6afd377 100644
--- a/app/src/main/java/model/ColoredCellIterator.java
+++ b/app/src/main/java/model/ColoredCellIterator.java
@@ -10,8 +10,8 @@ import java.util.*;
 public class ColoredCellIterator implements Iterator<Cell> {
 
     private final Color color;
-    Set<Cell> visitedCells;
-    Set<Cell> pendingCells=new HashSet<Cell>();
+    public Set<Cell> visitedCells;
+    public Set<Cell> pendingCells=new HashSet<Cell>();
 
 
     public ColoredCellIterator(Cell startCell){
diff --git a/app/src/main/java/model/ComputerPlayer.java b/app/src/main/java/model/ComputerPlayer.java
index b97bf17..fd7ac9f 100644
--- a/app/src/main/java/model/ComputerPlayer.java
+++ b/app/src/main/java/model/ComputerPlayer.java
@@ -1,30 +1,55 @@
 package model;
 
-import com.sun.prism.paint.Color;
+import javafx.scene.paint.Color;
 
 public class ComputerPlayer implements Player{
-    //PlayStrate  sdfdsfdsfm
+
+    private String name;
+    private Cell cellStart;
+    private PlayStrategy strategi;
+    public ComputerPlayer(String name, Cell start){
+        this.name=name;
+        this.cellStart=start;
+    }
+    public ComputerPlayer(Cell start, PlayStrategy strategi){
+        this.name="player";
+        this.cellStart=start;
+        this.strategi=strategi;
+
+    }
+    public ComputerPlayer(String name, Cell start,PlayStrategy strategi){
+        this.name=name;
+        this.cellStart=start;
+        this.strategi= strategi;
+    }
     @Override
     public boolean isHuman() {
         return false;
     }
 
     @Override
-    public int coloredArea(Cell startCell) {
-        return 0;
+    public void setName(String name) {
+        this.name = name;
     }
 
     @Override
     public String getName() {
-        return null;
+        return this.name;
     }
 
     @Override
     public Cell getStartCell() {
-        return null;
+        return this.cellStart;
+    }
+    public Color play(){
+        return this.strategi.play(this.getStartCell());//  Color.RED;
+    }
+    public Color setStrategy(PlayStrategy strategy){
+        this.strategi=strategy;
+        return this.play();
     }
-    public javafx.scene.paint.Color play(){
-        return null ;//  Color.RED;
+    public void setStartCell(Cell start){
+        this.cellStart=start;
     }
 
 }
diff --git a/app/src/main/java/model/CyclicColorGenerator.java b/app/src/main/java/model/CyclicColorGenerator.java
index 7e6df5c..00dc1e4 100644
--- a/app/src/main/java/model/CyclicColorGenerator.java
+++ b/app/src/main/java/model/CyclicColorGenerator.java
@@ -6,13 +6,13 @@ import javafx.scene.paint.Color;
 import java.util.List;
 
 public class CyclicColorGenerator implements ColorGenerator {
-    List<Color> colors;
-
+    private final List<Color> colors;
+    private int count;
     public CyclicColorGenerator(List<Color> colors){
         this.colors=colors;
-
+        this.count=0;
     }
-    int count=0;
+
 
 
     @Override
diff --git a/app/src/main/java/model/CyclicStrategy.java b/app/src/main/java/model/CyclicStrategy.java
new file mode 100644
index 0000000..450fc16
--- /dev/null
+++ b/app/src/main/java/model/CyclicStrategy.java
@@ -0,0 +1,22 @@
+package model;
+
+import javafx.scene.paint.Color;
+
+import java.util.List;
+
+public class CyclicStrategy implements PlayStrategy{
+
+    private final List<Color>colors;
+    private int count;
+    public CyclicStrategy(List<Color> colors){
+        this.colors=colors;
+        this.count=0;
+
+    }
+    @Override
+    public Color play(Cell startCell) {
+        int color_index = count % this.colors.size();
+        count++;
+        return this.colors.get(color_index);
+    }
+}
diff --git a/app/src/main/java/model/FloodGame.java b/app/src/main/java/model/FloodGame.java
index c451a6e..317b3ec 100644
--- a/app/src/main/java/model/FloodGame.java
+++ b/app/src/main/java/model/FloodGame.java
@@ -50,17 +50,19 @@ public class FloodGame {
 
     public int getPlayerScore(Player player) {
         //todo
-        return this.getPlayerScore(player);
+        if (player.getStartCell().getColor() == AbstractCell.DEFAULT_CELL_COLOR)
+            return 0;
+        return Flooder.coloredArea(player.getStartCell());
     }
 
     public boolean hasWon(Player player){
-        return this.getPlayerScore(player)==this.totalFloodingArea;
+        return this.getPlayerScore(player)==this.totalFloodingArea&& this.getTurn()<26;
         // TODO
     }
 
     public boolean hasEnded(){
         // TODO
-        return this.getTurn()>=25;
+        return (this.getTurn()>=25 || hasWon(player));
     }
 
 }
diff --git a/app/src/main/java/model/Flooder.java b/app/src/main/java/model/Flooder.java
index 52f78e7..b984f52 100644
--- a/app/src/main/java/model/Flooder.java
+++ b/app/src/main/java/model/Flooder.java
@@ -2,13 +2,25 @@ package model;
 
 import javafx.scene.paint.Color;
 
-public class Flooder {
+import java.util.ArrayList;
+import java.util.List;
 
+public class Flooder {
     public static void flood(Cell startCell, Color floodingColor){
-
+        ColoredCellIterator start= new ColoredCellIterator(startCell);
+        while(start.hasNext()){
+             start.next().setColor(floodingColor);
+        }
     }
     public static int coloredArea(Cell startCell){
-        return 0;
+        ColoredCellIterator start= new ColoredCellIterator(startCell);
+        int count=0;
+        while(start.hasNext()) {
+            start.next();
+            count++;
+        }
 
+        return count;
     }
+
 }
diff --git a/app/src/main/java/model/GreedyStrategy.java b/app/src/main/java/model/GreedyStrategy.java
new file mode 100644
index 0000000..79676a2
--- /dev/null
+++ b/app/src/main/java/model/GreedyStrategy.java
@@ -0,0 +1,10 @@
+package model;
+
+import javafx.scene.paint.Color;
+
+public class GreedyStrategy implements PlayStrategy{
+    @Override
+    public Color play(Cell startCell) {
+        return null;
+    }
+}
diff --git a/app/src/main/java/model/HumanPlayer.java b/app/src/main/java/model/HumanPlayer.java
index e83c215..bd12f9f 100644
--- a/app/src/main/java/model/HumanPlayer.java
+++ b/app/src/main/java/model/HumanPlayer.java
@@ -14,21 +14,20 @@ public class HumanPlayer implements Player{
     }
     @Override
     public boolean isHuman() {
-        return false;
+        return true;
     }
 
     @Override
-    public int coloredArea(Cell startCell) {
-        return 0;
+    public void setName(String name) {
+        this.name=name;
     }
-
     @Override
     public String getName() {
-        return null;
+        return this.name;
     }
 
     @Override
     public Cell getStartCell() {
-        return null;
+        return this.startCell;
     }
 }
diff --git a/app/src/main/java/model/Player.java b/app/src/main/java/model/Player.java
index 4ab3d75..22a6ebf 100644
--- a/app/src/main/java/model/Player.java
+++ b/app/src/main/java/model/Player.java
@@ -2,7 +2,7 @@ package model;
 
 public interface Player {
     boolean isHuman();
-    int coloredArea(Cell startCell);
+    void setName(String name);
     String getName();
     Cell getStartCell();
     
diff --git a/app/src/main/java/model/RandomStrategy.java b/app/src/main/java/model/RandomStrategy.java
new file mode 100644
index 0000000..bbeefab
--- /dev/null
+++ b/app/src/main/java/model/RandomStrategy.java
@@ -0,0 +1,20 @@
+package model;
+import javafx.scene.paint.Color;
+import java.awt.*;
+import java.util.Random;
+import java.util.List;
+import util.RandomUtil;
+public class RandomStrategy implements PlayStrategy{
+    private final List<Color> colors;
+    private Random randomColor;
+
+    public RandomStrategy(List<Color>colors,Random randomColor){
+        this.colors=colors;
+        this.randomColor=randomColor;
+
+    }
+    @Override
+    public Color play(Cell startCell) {
+        return RandomUtil.randomElement(this.colors, this.randomColor);
+    }
+}
diff --git a/app/src/main/java/model/RandomWalk.java b/app/src/main/java/model/RandomWalk.java
new file mode 100644
index 0000000..6acc7b5
--- /dev/null
+++ b/app/src/main/java/model/RandomWalk.java
@@ -0,0 +1,29 @@
+package model;
+
+import javafx.scene.paint.Color;
+import util.RandomUtil;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Random;
+
+public class RandomWalk implements PlayStrategy{
+    private List<Color> colors;
+    private Random randomColor;
+    private Cell cellStart;
+    public RandomWalk(List<Color> colors, Random randomColor){
+        this.colors=colors;
+        this.randomColor=randomColor ;
+
+
+    }
+    @Override
+    public Color play(Cell startCell) {
+        List<Color>colorNeighbor=new ArrayList<Color>();
+        for(Cell cell:startCell.getNeighbours())
+            colorNeighbor.add(cell.getColor());
+        if (colorNeighbor.contains(startCell.getColor())){
+            colorNeighbor.remove(startCell.getColor());}
+        return RandomUtil.randomElement(colorNeighbor,this.randomColor);
+    }
+}
-- 
GitLab