Skip to content
Snippets Groups Projects
Commit 554e6a80 authored by LATIOUI's avatar LATIOUI
Browse files

Implementation of Road.class and refactoring MotorizedFireFighter.class

parent 342cb9d8
No related branches found
No related tags found
No related merge requests found
Pipeline #25023 passed
......@@ -7,6 +7,7 @@ public interface GameBuilder {
model.Builder.GameBuilder setCloud(int cloud);
model.Builder.GameBuilder setMotorizedFireFighter(int motorizedFireFighter);
model.Builder.GameBuilder setMountain(int mountain);
model.Builder.GameBuilder setRoad(int mountain);
// TODO: 15/11/2023 la suite
GameManage build();
......
......@@ -6,6 +6,7 @@ import model.ExtinguishFire.FireFighter;
import model.ExtinguishFire.MotorizedFireFighter;
import model.Flammable.Fire;
import model.Obstacle.Mountain;
import model.Obstacle.Road;
public class GameManage {
private final int fires;
......@@ -32,7 +33,7 @@ public class GameManage {
new Fire(Color.RED);
}
for(int i=0;i<clouds;i++) {
new Cloud(Color.GRAY);
new Cloud(Color.DARKCYAN);
}
for(int i=0;i<motorizedFireFighters;i++) {
new MotorizedFireFighter(Color.ORANGE);
......@@ -43,6 +44,9 @@ public class GameManage {
for(int i=0;i<firefighters;i++) {
new FireFighter(Color.BLUE);
}
for(int i=0;i<roads;i++) {
new Road(Color.GRAY);
}
}
}
......
......@@ -14,7 +14,7 @@ import java.util.*;
import static model.GameBoard.elementPosition;
public class FireFighter implements ExtinguishFire {
public class FireFighter extends FireFighters {
private final Color color;
public FireFighter(Color color) {
......@@ -31,83 +31,35 @@ public class FireFighter implements ExtinguishFire {
return visitor.visit(this);
}
@Override
public void initialize() {
Position position = GameBoard.randomPosition();
while(!canInitialise(position)){
position = GameBoard.randomPosition();
}
addElementToElementPosition(elementPosition,position);
}
private void addElementToElementPosition(HashMap<Position, ArrayList<BoardElement>> elementPosition, Position position) {
if (elementPosition.containsKey(position) ) {
elementPosition.get(position).add(this);
} else {
ArrayList<BoardElement> boardElements = new ArrayList<>();
boardElements.add(this);
elementPosition.put(position, boardElements);
}
super.initialize();
}
private boolean canInitialise(Position position) {
if(elementPosition.containsKey(position)){
for (BoardElement element : GameBoard.elementPosition.get(position)) {
if (element.accept(new FireFinder()) || element.accept(new CrossMountain())) {
return false;
}
}
}
return true;
public void moveAndExtinguish(HashMap<Position, ArrayList<BoardElement>> newElementPosition, Position newFirefighterPosition, ArrayList<Position> extinguishPosition, List<Position> firePositions, GameBoard gameBoard) {
addElementToElementPosition(newElementPosition, newFirefighterPosition);
extinguishPosition.add(newFirefighterPosition);
List<Position> neighborFirePositions = gameBoard.neighbors(newFirefighterPosition).stream()
.filter(firePositions()::contains).toList();
extinguishPosition.addAll(neighborFirePositions);
}
@Override
public void update(GameBoard gameBoard, Position position, HashMap<Position, ArrayList<BoardElement>> newElementPosition, ArrayList<Position> extinguishPosition) {
List<Position> firePositions = firePosition();
List<Position> firePositions = firePositions();
Position newFirefighterPosition = gameBoard.neighborClosestToFire(position);
extinguishPosition.add(position);
if(canMove(newFirefighterPosition)){
moveAndExtinguish(newElementPosition,newFirefighterPosition,extinguishPosition,firePositions,gameBoard);
}else {
List<Position> neighbors = gameBoard.neighbors(position);
for (Position positionNeighbour : neighbors) {
if(canMove(positionNeighbour)){
moveAndExtinguish(newElementPosition,positionNeighbour,extinguishPosition,firePositions,gameBoard);
for (Position neighbourPosition : neighbors) {
if(canMove(neighbourPosition)){
moveAndExtinguish(newElementPosition,neighbourPosition,extinguishPosition,firePositions,gameBoard);
return;
}
}
moveAndExtinguish(newElementPosition,position,extinguishPosition,firePositions,gameBoard);
}
}
private void moveAndExtinguish(HashMap<Position, ArrayList<BoardElement>> newElementPosition, Position newFirefighterPosition, ArrayList<Position> extinguishPosition, List<Position> firePositions, GameBoard gameBoard) {
addElementToElementPosition(newElementPosition,newFirefighterPosition);
extinguishPosition.add(newFirefighterPosition);
List<Position> neighborFirePositions = gameBoard.neighbors(newFirefighterPosition).stream()
.filter(firePositions::contains).toList();
extinguishPosition.addAll(neighborFirePositions);
}
private boolean canMove(Position newFirefighterPosition) {
if(elementPosition.containsKey(newFirefighterPosition)){
for (BoardElement boardElement : elementPosition.get(newFirefighterPosition)) {
if (boardElement.accept(new CrossMountain())) {
return false;
}
// moveAndExtinguish(newElementPosition,position,extinguishPosition,firePositions,gameBoard);
}
}
return true;
}
private List<Position> firePosition(){
List<Position> firePositions = new ArrayList<>();
for (Map.Entry<Position, ArrayList<BoardElement>> entry : elementPosition.entrySet()) {
for (BoardElement element : entry.getValue()) {
if (element.accept(new FireFinder())) {
firePositions.add(entry.getKey());
}
}
}
return firePositions;
}
}
package model.ExtinguishFire;
import javafx.scene.paint.Color;
import model.BoardElement;
import model.GameBoard;
import model.Visitor.CrossMountain;
import model.Visitor.FireFinder;
import model.Visitor.Visitor;
import util.Position;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static model.GameBoard.elementPosition;
public abstract class FireFighters implements BoardElement {
public abstract Color getColor();
@Override
public abstract Boolean accept(Visitor visitor);
@Override
public void initialize() {
Position position = GameBoard.randomPosition();
while (!canInitialise(position)) {
position = GameBoard.randomPosition();
}
addElementToElementPosition(elementPosition, position);
}
public void addElementToElementPosition(HashMap<Position, ArrayList<BoardElement>> elementPosition, Position position) {
if (elementPosition.containsKey(position)) {
elementPosition.get(position).add(this);
} else {
ArrayList<BoardElement> boardElements = new ArrayList<>();
boardElements.add(this);
elementPosition.put(position, boardElements);
}
}
public boolean canInitialise(Position position) {
if (elementPosition.containsKey(position)) {
for (BoardElement element : GameBoard.elementPosition.get(position)) {
if (element.accept(new FireFinder()) || element.accept(new CrossMountain())) {
return false;
}
}
}
return true;
}
public boolean canMove(Position newFirefighterPosition) {
if (elementPosition.containsKey(newFirefighterPosition)) {
for (BoardElement boardElement : elementPosition.get(newFirefighterPosition)) {
if (boardElement.accept(new CrossMountain())) {
return false;
}
}
}
return true;
}
public List<Position> firePositions() {
List<Position> firePositions = new ArrayList<>();
for (Map.Entry<Position, ArrayList<BoardElement>> entry : elementPosition.entrySet()) {
for (BoardElement element : entry.getValue()) {
if (element.accept(new FireFinder())) {
firePositions.add(entry.getKey());
}
}
}
return firePositions;
}
public abstract void update(GameBoard gameBoard, Position position, HashMap<Position, ArrayList<BoardElement>> newElementPosition, ArrayList<Position> extinguishPosition);
}
\ No newline at end of file
......@@ -3,19 +3,15 @@ package model.ExtinguishFire;
import javafx.scene.paint.Color;
import model.BoardElement;
import model.GameBoard;
import model.Visitor.CrossMountain;
import model.Visitor.FireFinder;
import model.Visitor.Visitor;
import util.Position;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static model.GameBoard.elementPosition;
public class MotorizedFireFighter implements ExtinguishFire {
public class MotorizedFireFighter extends FireFighters {
private final Color color;
......@@ -23,6 +19,7 @@ public class MotorizedFireFighter implements ExtinguishFire {
this.color = color;
initialize();
}
@Override
public Color getColor() {
return color;
......@@ -33,75 +30,45 @@ public class MotorizedFireFighter implements ExtinguishFire {
return visitor.visit(this);
}
@Override
public void initialize() {
CrossMountain crossMountain=new CrossMountain();
boolean canInitialise;
Position position = GameBoard.randomPosition();
if(elementPosition.containsKey(position)) {
for (;;) {
canInitialise = true;
for (BoardElement element : elementPosition.get(position)) {
if (element.accept(crossMountain)) {
canInitialise = false;
break;
}
}
if (canInitialise) {
break;
}
position = GameBoard.randomPosition();
if (!elementPosition.containsKey(position)) break;
}
if (elementPosition.containsKey(position))
elementPosition.get(position).add(this);
else {
ArrayList<BoardElement> boardElements = new ArrayList<>();
boardElements.add(this);
elementPosition.put(position, boardElements);
super.initialize();
}
public void moveAndExtinguish(HashMap<Position, ArrayList<BoardElement>> newElementPosition, ArrayList<Position> newMotorizedFireFighterPositions,
ArrayList<Position> extinguishPosition, List<Position> firePositions, GameBoard gameBoard) {
addElementToElementPosition(newElementPosition, newMotorizedFireFighterPositions.get(1));
for (Position newPosition : newMotorizedFireFighterPositions) {
extinguishPosition.add(newPosition);
}
List<Position> neighborFirePositions = new ArrayList<>();
neighborFirePositions.addAll(gameBoard.neighbors(newMotorizedFireFighterPositions.get(0)).stream()
.filter(firePositions::contains).toList());
neighborFirePositions.addAll(gameBoard.neighbors(newMotorizedFireFighterPositions.get(1)).stream()
.filter(firePositions::contains).toList());
for (Position firePosition : neighborFirePositions) {
extinguishPosition.add(firePosition);
}
ArrayList<BoardElement> boardElements = new ArrayList<>();
boardElements.add(this);
elementPosition.put(position,boardElements);
}
@Override
public void update(GameBoard gameBoard, Position position, HashMap<Position, ArrayList<BoardElement>> newElementPosition, ArrayList<Position> extinguishPosition) {
List<Position> firePositions = new ArrayList<>();
for (Map.Entry<Position, ArrayList<BoardElement>> entry : elementPosition.entrySet()) {
for (BoardElement element : entry.getValue()) {
if (element.accept(new FireFinder())) {
firePositions.add(entry.getKey());
}
}
}
List<Position> firePositions = firePositions();
ArrayList<Position> newMotorizedFireFighterPositions = new ArrayList<>();
Position newMotorizedFireFighterPosition1 = gameBoard.neighborClosestToFire(position);
newMotorizedFireFighterPositions.add(newMotorizedFireFighterPosition1);
Position newMotorizedFireFighterPosition2 = gameBoard.neighborClosestToFire(newMotorizedFireFighterPosition1);
newMotorizedFireFighterPositions.add(newMotorizedFireFighterPosition2);
if(newElementPosition.containsKey(newMotorizedFireFighterPosition2)){
newElementPosition.get(newMotorizedFireFighterPosition2).add(this);
if (canMove(newMotorizedFireFighterPosition2)) {
moveAndExtinguish(newElementPosition, newMotorizedFireFighterPositions, extinguishPosition,firePositions, gameBoard);
} else {
List<Position> neighbors = gameBoard.neighbors(position);
for (Position neighbourPosition : neighbors) {
if (canMove(neighbourPosition)) {
moveAndExtinguish(newElementPosition, newMotorizedFireFighterPositions, extinguishPosition, firePositions, gameBoard);
}
else{
ArrayList<BoardElement> boardElements = new ArrayList<>();
boardElements.add(this);
newElementPosition.put(newMotorizedFireFighterPosition2,boardElements);
}
for(Position newPosition : newMotorizedFireFighterPositions) {
extinguishPosition.add(newPosition);
}
List<Position> neighborFirePositions = new ArrayList<>();
neighborFirePositions.addAll(gameBoard.neighbors(newMotorizedFireFighterPosition1).stream()
.filter(firePositions::contains).toList());
neighborFirePositions.addAll(gameBoard.neighbors(newMotorizedFireFighterPosition2).stream()
.filter(firePositions::contains).toList());
for(Position firePosition : neighborFirePositions) {
extinguishPosition.add(firePosition);
}
}
}
......@@ -17,6 +17,7 @@ public class GameBoard implements Board{
private int initialCloudCount;
private int initialMotorizedFireFighterCount;
private int initialMountainCount;
private int initialRoadCount;
private int step = 0;
static Random randomGenerator = new Random();
......@@ -27,7 +28,8 @@ public class GameBoard implements Board{
}
public GameBoard(int columnCount,int rowCount,int initialFireCount, int initialFirefighterCount,int initialCloudCount,int initialMotorizedFireFighterCount,int initialMountainCount) {
public GameBoard(int columnCount,int rowCount,int initialFireCount, int initialFirefighterCount,int initialCloudCount,
int initialMotorizedFireFighterCount,int initialMountainCount,int initialRoadCount) {
this.columnCount = columnCount;
this.rowCount = rowCount;
this.initialFireCount = initialFireCount;
......@@ -35,11 +37,13 @@ public class GameBoard implements Board{
this.initialCloudCount = initialCloudCount;
this.initialMotorizedFireFighterCount=initialMotorizedFireFighterCount;
this.initialMountainCount = initialMountainCount;
this.initialRoadCount = initialRoadCount;
}
public void initializeElements(){
FireFirefightersBuilder fireFirefighterBuilder=new FireFirefightersBuilder();
fireFirefighterBuilder.Build(this.initialFireCount,this.initialFirefighterCount,this.initialCloudCount,this.initialMotorizedFireFighterCount,this.initialMountainCount);
fireFirefighterBuilder.Build(this.initialFireCount,this.initialFirefighterCount,
this.initialCloudCount,this.initialMotorizedFireFighterCount,this.initialMountainCount,this.initialRoadCount);
}
public static Position randomPosition() {
......
......@@ -3,17 +3,15 @@ package model.Obstacle;
import javafx.scene.paint.Color;
import model.BoardElement;
import model.GameBoard;
import model.Visitor.FireFinder;
import model.Visitor.Visitor;
import util.Position;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import static model.GameBoard.elementPosition;
public class Mountain implements Obstacles{
public class Mountain extends Obstacles {
private final Color color;
......@@ -33,24 +31,11 @@ public class Mountain implements Obstacles{
@Override
public void initialize() {
Position position = GameBoard.randomPosition();
if (elementPosition.containsKey(position))
elementPosition.get(position).add(this);
else {
ArrayList<BoardElement> boardElements = new ArrayList<>();
boardElements.add(this);
elementPosition.put(position, boardElements);
}
super.initialize();
}
@Override
public void update(GameBoard gameBoard, Position position, HashMap<Position, ArrayList<BoardElement>> newElementPosition, ArrayList<Position> extinguishPosition) {
if(newElementPosition.containsKey(position))
newElementPosition.get(position).add(this);
else{
ArrayList<BoardElement> boardElements = new ArrayList<>();
boardElements.add(this);
newElementPosition.put(position,boardElements);
}
super.update(gameBoard,position,newElementPosition,extinguishPosition);
}
}
package model.Obstacle;
import javafx.scene.paint.Color;
import model.BoardElement;
import model.GameBoard;
import model.Visitor.Visitor;
import util.Position;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
public interface Obstacles extends BoardElement {
import static model.GameBoard.elementPosition;
//void update(GameBoard gameBoard, Position position, HashMap<Position, ArrayList<BoardElement>> newElementPosition, ArrayList<Position> extinguishPosition);
public abstract class Obstacles implements BoardElement {
public abstract Color getColor();
public abstract Boolean accept(Visitor visitor);
public void initialize(){
Position position = GameBoard.randomPosition();
if (elementPosition.containsKey(position))
elementPosition.get(position).add(this);
else {
ArrayList<BoardElement> boardElements = new ArrayList<>();
boardElements.add(this);
elementPosition.put(position, boardElements);
}
}
public void update(GameBoard gameBoard , Position position, HashMap<Position, ArrayList<BoardElement>> newElementPosition,
ArrayList<Position> extinguishPosition){
if(newElementPosition.containsKey(position))
newElementPosition.get(position).add(this);
else{
ArrayList<BoardElement> boardElements = new ArrayList<>();
boardElements.add(this);
newElementPosition.put(position,boardElements);
}
}
}
package model.Obstacle;
public class Road {
import javafx.scene.paint.Color;
import model.BoardElement;
import model.GameBoard;
import model.Visitor.Visitor;
import util.Position;
import java.util.ArrayList;
import java.util.HashMap;
public class Road extends Obstacles {
private final Color color;
public Road(Color color){
this.color=color;
initialize();
}
@Override
public Color getColor() {
return color;
}
@Override
public Boolean accept(Visitor visitor) {
return visitor.visit(this);
}
@Override
public void initialize() {
super.initialize();
}
@Override
public void update(GameBoard gameBoard, Position position, HashMap<Position, ArrayList<BoardElement>> newElementPosition, ArrayList<Position> extinguishPosition) {
super.update(gameBoard,position,newElementPosition,extinguishPosition);
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment