Skip to content
Snippets Groups Projects
Commit a2868657 authored by AREZKI Celia's avatar AREZKI Celia
Browse files

CloudMovements : correct the methode updateElements

parent ec4e7bbb
No related branches found
No related tags found
No related merge requests found
Pipeline #41671 passed
Showing
with 81 additions and 74 deletions
No preview for this file type
No preview for this file type
No preview for this file type
No preview for this file type
No preview for this file type
No preview for this file type
No preview for this file type
No preview for this file type
No preview for this file type
No preview for this file type
......@@ -18,6 +18,7 @@ public class BoardFireFighterBehavior implements BoardBehavior{
static Movements fireFighterMovements;
static Movements cloudMovements;
static Movements motorizedMovements;
private ElementGenerator moutainGenerator;
public BoardFireFighterBehavior(Map<Position, List<Position>> neighbors, ElementFactory<Fire> fireFactory ,ElementFactory<FireFighter> firefighterFactory,
ElementFactory<Cloud> cloudFactory,ElementFactory<MotorizedFireFighter> motorizedFactory,ElementFactory<Rocky> rockyFactory) {
......@@ -28,6 +29,7 @@ public class BoardFireFighterBehavior implements BoardBehavior{
fireFighterMovements=new FireFighterMovements(firefighterFactory);
cloudMovements=new CloudMovements(cloudFactory);
motorizedMovements=new MotorizedMovements(motorizedFactory);
moutainGenerator=new MountainGenerator();
}
public void initializeElements(int rowCount, int columnCount) {
......@@ -43,7 +45,7 @@ public class BoardFireFighterBehavior implements BoardBehavior{
rocky.add(rockyElement.getPosition());
}
generateMountainBlocks(rowCount, columnCount);
moutainGenerator.generateElement(rowCount,columnCount);
generateRoads(rowCount,columnCount);
}
......@@ -55,12 +57,7 @@ public class BoardFireFighterBehavior implements BoardBehavior{
public static void extinguish(Position position) {
fireMovements.getPositions().remove(position);
// Si la position est une montagne, elle cesse d'être une montagne
if (rocky.contains(position)) {
rocky.remove(position);
terrainMap.remove(position); // Optionnel, si vous utilisez terrainMap pour gérer les types de terrain
System.out.println("Une montagne a brûlé à la position : " + position);
}
}
......@@ -105,53 +102,7 @@ public class BoardFireFighterBehavior implements BoardBehavior{
}
public Collection<Position> getCloudPositions() {
return cloudMovements.getPositions();
}
public List<Position> getMotorizedFighters() {
return (List<Position>) motorizedMovements.getPositions();
}
private void generateMountainBlocks(int rowCount, int columnCount) {
Random random = new Random();
int maxMountains = 5; // Par exemple, générer 5 blocs de montagnes
int blockSize = 4; // Taille du bloc de montagnes (4 cases)
for (int i = 0; i < maxMountains; i++) {
// Générer un coin aléatoire pour chaque bloc de montagne (en s'assurant que les blocs ne dépassent pas la grille)
int startRow = random.nextInt(rowCount - 1); // -1 pour éviter le débordement
int startCol = random.nextInt(columnCount - 1);
// Vérifier si les cases sont libres avant d'y placer une montagne
if (canPlaceMountainBlock(startRow, startCol)) {
// Placer les montagnes sur la grille
placeMountainBlock(startRow, startCol);
}
}
}
private boolean canPlaceMountainBlock(int startRow, int startCol) {
// Vérifier si les 4 cases sont libres
for (int row = startRow; row < startRow + 2; row++) {
for (int col = startCol; col < startCol + 2; col++) {
Position pos = new Position(row, col);
if (terrainMap.containsKey(pos)) {
return false; // Une case est déjà occupée
}
}
}
return true; // Toutes les cases sont libres
}
private void placeMountainBlock(int startRow, int startCol) {
// Placer les 4 cases de montagne
for (int row = startRow; row < startRow + 2; row++) {
for (int col = startCol; col < startCol + 2; col++) {
Position pos = new Position(row, col);
terrainMap.put(pos, new Mountain(pos));
}
}
}
/**
* Éteint les feux à proximité d'une position donnée.
*
......@@ -170,7 +121,7 @@ public class BoardFireFighterBehavior implements BoardBehavior{
}
}
public Map<Position, Terrain> getTerrainMap() {
public static Map<Position, Terrain> getTerrainMap() {
return terrainMap;
}
public static boolean canMoveTo(Position position, Set<Position> firePositions, List<Position> firefighterPositions) {
......@@ -180,15 +131,10 @@ public class BoardFireFighterBehavior implements BoardBehavior{
}
// Si la position est occupée par un feu et que le terrain n'est pas traversable par le feu
if (firePositions.contains(position)) {
return false; // Impossible de traverser une case contenant un feu
}
// Si la position est occupée par un pompier et que le pompier ne peut pas franchir
if (firefighterPositions.contains(position)) {
return false; // Impossible de se déplacer sur la position d'un autre pompier
if(cloudMovements.getPositions().contains(position))
{
return false;
}
// Si la position est une montagne, aucun élément ne peut la franchir sauf les nuages
if (terrainMap.get(position) != null && !cloudMovements.getPositions().contains(position)) {
return false; // Impossible de franchir une montagne, sauf pour un nuage
......@@ -275,4 +221,13 @@ public class BoardFireFighterBehavior implements BoardBehavior{
public static Collection<Position> getFirefighterPositions() {
return fireFighterMovements.getPositions();
}
public Collection<Position> getCloudPositions() {
return cloudMovements.getPositions();
}
public List<Position> getMotorizedFighters() {
return (List<Position>) motorizedMovements.getPositions();
}
}
......@@ -29,30 +29,39 @@ public class CloudMovements implements Movements{
List<Position> modifiedPositions = new ArrayList<>();
List<Position> newCloudPositions = new ArrayList<>();
// Copier les positions actuelles des feux pour éviter les incohérences pendant l'itération
Set<Position> firePositions = new HashSet<>(fireMovements.getPositions());
for (Position cloudPosition : cloudPositions) {
// Déplacement aléatoire
// Déplacement aléatoire parmi les voisins
List<Position> possibleMoves = getNeighbors().get(cloudPosition);
Position newCloudPosition = possibleMoves.get(new Random().nextInt(possibleMoves.size()));
// Vérification que le nuage ne se déplace pas vers une montagne
if (!canMoveTo(newCloudPosition, (Set<Position>) fireMovements.getPositions(), (List<Position>) fireFighterMovements.getPositions())) {
continue; // Si la position est invalide ou une montagne, le nuage reste sur place
// Vérification que le nuage ne se déplace pas vers une montagne ou une position invalide
if (!canMoveTo(newCloudPosition, firePositions, (List<Position>) getFirefighterPositions())) {
newCloudPositions.add(cloudPosition); // Le nuage reste sur place
continue;
}
// Ajouter la nouvelle position du nuage
newCloudPositions.add(newCloudPosition);
// Éteindre le feu à la position du nuage (le nuage mange le feu)
if (fireMovements.getPositions().contains(newCloudPosition)) {
extinguish(newCloudPosition); // Supprimer le feu
modifiedPositions.add(newCloudPosition); // Ajouter la position du feu éteint aux positions modifiées
System.out.println("Feu éteint par nuage à : " + newCloudPosition);
// Si la nouvelle position contient un feu, l'éteindre
if (firePositions.contains(newCloudPosition)) {
extinguish(newCloudPosition); // Extinction du feu
firePositions.remove(newCloudPosition); // Mise à jour locale des positions des feux
modifiedPositions.add(newCloudPosition);
System.out.println("Feu éteint par un nuage à : " + newCloudPosition);
}
modifiedPositions.add(cloudPosition); // Ajouter l'ancienne position du nuage
modifiedPositions.add(newCloudPosition); // Ajouter la nouvelle position du nuage
// Ajouter les positions modifiées pour le nuage
modifiedPositions.add(cloudPosition);
modifiedPositions.add(newCloudPosition);
}
// Mise à jour des positions des nuages
cloudPositions = newCloudPositions;
return modifiedPositions;
}
......
package model;
import util.Position;
import java.util.Random;
import static model.BoardFireFighterBehavior.getTerrainMap;
public class MountainGenerator implements ElementGenerator{
@Override
public void generateElement(int rowCount, int columnCount) {
Random random = new Random();
int maxMountains = 5; // Par exemple, générer 5 blocs de montagnes
int blockSize = 4; // Taille du bloc de montagnes (4 cases)
for (int i = 0; i < maxMountains; i++) {
// Générer un coin aléatoire pour chaque bloc de montagne (en s'assurant que les blocs ne dépassent pas la grille)
int startRow = random.nextInt(rowCount - 1); // -1 pour éviter le débordement
int startCol = random.nextInt(columnCount - 1);
// Vérifier si les cases sont libres avant d'y placer une montagne
if (canPlaceMountainBlock(startRow, startCol)) {
// Placer les montagnes sur la grille
placeMountainBlock(startRow, startCol);
}
}
}
private boolean canPlaceMountainBlock(int startRow, int startCol) {
// Vérifier si les 4 cases sont libres
for (int row = startRow; row < startRow + 2; row++) {
for (int col = startCol; col < startCol + 2; col++) {
Position pos = new Position(row, col);
if (getTerrainMap().containsKey(pos)) {
return false; // Une case est déjà occupée
}
}
}
return true; // Toutes les cases sont libres
}
private void placeMountainBlock(int startRow, int startCol) {
// Placer les 4 cases de montagne
for (int row = startRow; row < startRow + 2; row++) {
for (int col = startCol; col < startCol + 2; col++) {
Position pos = new Position(row, col);
getTerrainMap().put(pos, new Mountain(pos));
}
}
}
}
......@@ -3,7 +3,7 @@ package view;
import javafx.scene.paint.Color;
public enum ViewElement {
FIREFIGHTER(Color.AQUA), FIRE(Color.RED), EMPTY(Color.WHITE) , CLOUD(Color.GRAY),MOTORIZED(Color.DARKBLUE) , MOUNTAIN(Color.DARKGRAY), ROCKY(Color.GREEN),
FIREFIGHTER(Color.AQUA), FIRE(Color.RED), EMPTY(Color.WHITE) , CLOUD(Color.PINK),MOTORIZED(Color.DARKBLUE) , MOUNTAIN(Color.DARKGRAY), ROCKY(Color.GREEN),
ROAD(Color.BLACK);
final Color color;
ViewElement(Color color) {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment