Skip to content
Snippets Groups Projects
Commit bb66cae6 authored by plojolo's avatar plojolo
Browse files

Rework the all fires class

parent 190dafdb
No related branches found
No related tags found
No related merge requests found
Pipeline #23549 passed
......@@ -4,20 +4,18 @@ import util.Position;
import java.util.*;
public class Fire {
public static Set<Position> firePositions;
public static List<Position> firePositions;
public static void nextMove(){
// propagate the fire to the adjacent cells
Set<Position> newFirePositions = new HashSet<>();
List<Position> newFirePositions = new ArrayList<>();
for (Position firePosition : firePositions) {
if(firePosition.row() > 0) // if the fire is not on the top edge
newFirePositions.add(new Position(firePosition.row() - 1, firePosition.column()));
if(firePosition.row() < FirefighterBoard.rowCount - 1) // if the fire is not on the bottom edge
newFirePositions.add(new Position(firePosition.row() + 1, firePosition.column()));
if(firePosition.column() > 0) // if the fire is not on the left edge
newFirePositions.add(new Position(firePosition.row(), firePosition.column() - 1));
if(firePosition.column() < FirefighterBoard.columnCount - 1) // if the fire is not on the right edge
newFirePositions.add(new Position(firePosition.row(), firePosition.column() + 1));
List<Position> neighborPositions = Utils.neighbors(firePosition);
newFirePositions.addAll(neighborPositions);
}
// check if the new fire positions are not already on fire
for (Position newFirePosition : newFirePositions)
if (!firePositions.contains(newFirePosition))
firePositions.add(newFirePosition);
}
}
......@@ -8,31 +8,27 @@ public class FireFighters {
public static void nextMove(){
Set<Position> firePositions = Fire.firePositions;
// find the closest fire to each firefighter
List<Position> firefighterNewPositions = new ArrayList<>();
for (Position firefighterPosition : firefighterPositions) {
Position closestFire = null;
int closestDistance = Integer.MAX_VALUE;
for(Position firePosition : firePositions){
int distance = Math.abs(firefighterPosition.row() - firePosition.row()) + Math.abs(firefighterPosition.column() - firePosition.column());
if(distance < closestDistance){
closestDistance = distance;
closestFire = firePosition;
Position newFirefighterPosition = Utils.neighborClosestToFire(firefighterPosition);
firefighterNewPositions.add(newFirefighterPosition);
extinguish(newFirefighterPosition);
}
firefighterPositions = firefighterNewPositions;
}
List<Position> newFirefighterPositions = new ArrayList<>();
// move the firefighter towards the closest fire
if(closestFire.row() > firefighterPosition.row())
newFirefighterPositions.add(new Position(firefighterPosition.row() + 1, firefighterPosition.column()));
else if(closestFire.row() < firefighterPosition.row())
newFirefighterPositions.add(new Position(firefighterPosition.row() - 1, firefighterPosition.column()));
else if(closestFire.column() > firefighterPosition.column())
newFirefighterPositions.add(new Position(firefighterPosition.row(), firefighterPosition.column() + 1));
else if(closestFire.column() < firefighterPosition.column())
newFirefighterPositions.add(new Position(firefighterPosition.row(), firefighterPosition.column() - 1));
firefighterPositions = newFirefighterPositions;
public static void extinguishs(){
for (Position firefighterPosition : firefighterPositions) {
List<Position> neighborFirePositions = Utils.neighbors(firefighterPosition).stream()
.filter(Fire.firePositions::contains).toList();
for(Position firePosition : neighborFirePositions)
extinguish(firePosition);
}
}
public static void extinguish(Position position){
Fire.firePositions.remove(position);
}
}
......@@ -22,6 +22,8 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
}
public void initializeElements() {
Fire.firePositions = new ArrayList<>();
FireFighters.firefighterPositions = new ArrayList<>();
for (int index = 0; index < initialFireCount; index++)
Fire.firePositions.add(randomPosition());
for (int index = 0; index < initialFirefighterCount; index++)
......@@ -54,24 +56,19 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
}
public List<Position> updateToNextGeneration() {
FireFighters.nextMove();
List<Position> result = FireFighters.firefighterPositions;
FireFighters.extinguishs();
if (step % 2 == 0)
Fire.nextMove();
result.addAll(Fire.firePositions);
step++;
return result;
}
private List<Position> updateFires() {
step++;
List<Position> result = new ArrayList<>();
if (step % 2 == 0) {
List<Position> newFirePositions = new ArrayList<>();
for (Position fire : Fire.firePositions) {
newFirePositions.addAll(neighbors(fire));
}
Fire.firePositions.addAll(newFirePositions);
result.addAll(newFirePositions);
}
result.addAll(Fire.firePositions);
result.addAll(FireFighters.firefighterPositions);
return result;
}
......@@ -81,24 +78,6 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
return step;
}
private List<Position> updateFirefighters() {
List<Position> result = new ArrayList<>();
List<Position> firefighterNewPositions = new ArrayList<>();
for (Position firefighterPosition : FireFighters.firefighterPositions) {
Position newFirefighterPosition = neighborClosestToFire(firefighterPosition);
firefighterNewPositions.add(newFirefighterPosition);
extinguish(newFirefighterPosition);
result.add(firefighterPosition);
result.add(newFirefighterPosition);
List<Position> neighborFirePositions = neighbors(newFirefighterPosition).stream()
.filter(Fire.firePositions::contains).toList();
for(Position firePosition : neighborFirePositions)
extinguish(firePosition);
result.addAll(neighborFirePositions);
}
FireFighters.firefighterPositions = firefighterNewPositions;
return result;
}
@Override
public void reset() {
......@@ -106,38 +85,6 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
initializeElements();
}
private void extinguish(Position position) {
Fire.firePositions.remove(position);
}
private List<Position> neighbors(Position position) {
List<Position> list = new ArrayList<>();
if (position.row() > 0) list.add(new Position(position.row() - 1, position.column()));
if (position.column() > 0) list.add(new Position(position.row(), position.column() - 1));
if (position.row() < rowCount - 1) list.add(new Position(position.row() + 1, position.column()));
if (position.column() < columnCount - 1) list.add(new Position(position.row(), position.column() + 1));
return list;
}
private Position neighborClosestToFire(Position position) {
Set<Position> seen = new HashSet<>();
HashMap<Position, Position> firstMove = new HashMap<>();
Queue<Position> toVisit = new LinkedList<>(neighbors(position));
for (Position initialMove : toVisit)
firstMove.put(initialMove, initialMove);
while (!toVisit.isEmpty()) {
Position current = toVisit.poll();
if (Fire.firePositions.contains(current))
return firstMove.get(current);
for (Position adjacent : neighbors(current)) {
if (seen.contains(adjacent)) continue;
toVisit.add(adjacent);
seen.add(adjacent);
firstMove.put(adjacent, firstMove.get(current));
}
}
return position;
}
@Override
public void setState(List<ModelElement> state, Position position) {
......
......@@ -19,17 +19,18 @@ public class FirefighterGrid extends Canvas implements Grid<ViewElement>{
@Override
public void repaint(List<Pair<Position, ViewElement>> positionedElements) {
clear(positionedElements);
clear();
paint(positionedElements);
paintLines();
}
/*
private void clear(List<Pair<Position, ViewElement>> positionedElements) {
for (Pair<Position, ViewElement> positionElement : positionedElements) {
Position position = positionElement.getKey();
clearSquare(position.row(), position.column());
}
}
*/
private void paint(List<Pair<Position, ViewElement>> positionedElements) {
for(Pair<Position, ViewElement> pair : positionedElements){
......@@ -90,8 +91,9 @@ public class FirefighterGrid extends Canvas implements Grid<ViewElement>{
getGraphicsContext2D().setFill(color);
getGraphicsContext2D().fillRect(row*squareHeight,column*squareWidth,squareHeight,squareWidth);
}
/*
private void clearSquare(int row, int column){
getGraphicsContext2D().clearRect(row*squareHeight,column*squareWidth,squareHeight,squareWidth);
}
*/
}
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment