Skip to content
Snippets Groups Projects
Commit 66bbe873 authored by Anthony Viola's avatar Anthony Viola
Browse files

Firefighter rebuild

parent 968ab2b0
Branches
No related tags found
No related merge requests found
Pipeline #24489 failed
...@@ -53,7 +53,5 @@ public class SimulatorApplication extends javafx.application.Application { ...@@ -53,7 +53,5 @@ public class SimulatorApplication extends javafx.application.Application {
primaryStage.show(); primaryStage.show();
} }
public static void main(String[] args) { public static void main(String[] args) { launch(args); }
launch(args);
}
} }
...@@ -13,6 +13,7 @@ import javafx.scene.control.ToggleGroup; ...@@ -13,6 +13,7 @@ import javafx.scene.control.ToggleGroup;
import javafx.util.Duration; import javafx.util.Duration;
import javafx.util.Pair; import javafx.util.Pair;
import model.Board; import model.Board;
import model.Item;
import model.ModelElement; import model.ModelElement;
import model.FirefighterBoard; import model.FirefighterBoard;
import util.Position; import util.Position;
...@@ -70,6 +71,17 @@ public class Controller { ...@@ -70,6 +71,17 @@ public class Controller {
updateGenerationLabel(board.stepNumber()); updateGenerationLabel(board.stepNumber());
} }
private void updateBoard2(){
List<Position> updatedPositions = board.updateToNextGeneration2();
List<Item> updatedSquares = new ArrayList<>();
for(Position updatedPosition : updatedPositions){
Item squareState = board.getItemByPosition(updatedPosition);
updatedSquares.add(squareState);
}
grid.repaint(updatedSquares);
updateGenerationLabel(board.stepNumber());
}
private void repaintGrid(){ private void repaintGrid(){
int columnCount = board.columnCount(); int columnCount = board.columnCount();
int rowCount = board.rowCount(); int rowCount = board.rowCount();
...@@ -77,6 +89,7 @@ public class Controller { ...@@ -77,6 +89,7 @@ public class Controller {
for(int column = 0; column < columnCount; column++) for(int column = 0; column < columnCount; column++)
for(int row = 0; row < rowCount; row++) for(int row = 0; row < rowCount; row++)
viewElements[row][column] = getViewElement(board.getState(new Position(row, column))); viewElements[row][column] = getViewElement(board.getState(new Position(row, column)));
grid.repaint(viewElements);
updateGenerationLabel(board.stepNumber()); updateGenerationLabel(board.stepNumber());
} }
......
...@@ -50,6 +50,15 @@ public interface Board<S> { ...@@ -50,6 +50,15 @@ public interface Board<S> {
*/ */
List<Position> updateToNextGeneration(); List<Position> updateToNextGeneration();
/**
* Update the board to its next generation or state. This method may modify the
* internal state of the board and return a list of positions that have changed
* during the update.
*
* @return A list of positions that have changed during the update.
*/
List<Position> updateToNextGeneration2();
/** /**
* Reset the board to its initial state. * Reset the board to its initial state.
*/ */
...@@ -61,5 +70,7 @@ public interface Board<S> { ...@@ -61,5 +70,7 @@ public interface Board<S> {
* @return The current step number or generation. * @return The current step number or generation.
*/ */
int stepNumber(); int stepNumber();
Item getItemByPosition(Position position);
} }
...@@ -2,6 +2,7 @@ package model; ...@@ -2,6 +2,7 @@ package model;
import util.Position; import util.Position;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Random; import java.util.Random;
...@@ -11,9 +12,21 @@ public class Cloud extends Extinguisher implements Item { ...@@ -11,9 +12,21 @@ public class Cloud extends Extinguisher implements Item {
} }
void move(FirefighterBoard board) { List<Position> move(FirefighterBoard board) {
List<Position> neighborslist = board.neighbors(position); List<Position> result = new ArrayList<>();
List<Position> neighborsList = board.neighbors(position);
for (Position neighborPosition: neighborsList) {
if (board.getItemByPosition(neighborPosition) != null){
neighborsList.remove(neighborPosition);
}
}
if (neighborsList.isEmpty()){
return null;
}
Random ran = new Random(); Random ran = new Random();
position = neighborslist.get(ran.nextInt(neighborslist.size())); result.add(position);
position = neighborsList.get(ran.nextInt(neighborsList.size()));
result.add(position);
return result;
} }
} }
...@@ -17,19 +17,28 @@ public abstract class Extinguisher { ...@@ -17,19 +17,28 @@ public abstract class Extinguisher {
} }
public void update(FirefighterBoard board){ public List<Position> update(FirefighterBoard board){
move(board); ArrayList<Position> result = new ArrayList<Position>();
extinguish(board); result.addAll(move(board));
result.addAll(extinguish(board));
return result;
} }
private void extinguish(FirefighterBoard board) { private List<Position> extinguish(FirefighterBoard board) {
List<Position> result = new ArrayList<>();
List<Item> itemList = board.itemList(); List<Item> itemList = board.itemList();
List<Position> neighborslist = board.neighbors(position); List<Position> neighborsList = board.neighbors(position);
for (Position neighborsposition: neighborslist) { Item neighborItem;
itemList.removeIf(item -> neighborsposition == item.position() && item instanceof Fire); for (Position neighborPosition: neighborsList) {
neighborItem = board.getItemByPosition(neighborPosition);
if (neighborItem instanceof Fire){
itemList.remove(neighborItem);
result.add(neighborPosition);
}
} }
return result;
} }
abstract void move(FirefighterBoard board); abstract List<Position> move(FirefighterBoard board);
} }
...@@ -13,12 +13,17 @@ public class Fire implements Item{ ...@@ -13,12 +13,17 @@ public class Fire implements Item{
this.position = position; this.position = position;
} }
public void update(FirefighterBoard board) { public List<Position> update(FirefighterBoard board) {
ArrayList<Position> result = new ArrayList<Position>();
List<Position> neighborslist = board.neighbors(position); List<Position> neighborslist = board.neighbors(position);
for (Position neighborposition : neighborslist) { for (Position neighborposition : neighborslist) {
if (board.getItemByPosition(neighborposition) == null) {
board.itemList().add(new Fire(neighborposition)); board.itemList().add(new Fire(neighborposition));
result.add(neighborposition);
} }
} }
return neighborslist;
}
public Position position() { public Position position() {
return position; return position;
} }
......
...@@ -9,18 +9,25 @@ public class Firefighter extends Extinguisher implements Item{ ...@@ -9,18 +9,25 @@ public class Firefighter extends Extinguisher implements Item{
super(position); super(position);
} }
void move(FirefighterBoard board) { public List<Position> move(FirefighterBoard board) {
List<Position> result = new ArrayList<>();
Set<Position> seen = new HashSet<>(); Set<Position> seen = new HashSet<>();
HashMap<Position, Position> firstMove = new HashMap<>(); HashMap<Position, Position> firstMove = new HashMap<>();
Queue<Position> toVisit = new LinkedList<>(board.neighbors(position)); Queue<Position> toVisit = new LinkedList<>();
for (Position initialMove : toVisit) { for (Position initialMove : board.neighbors(position)) {
if (board.getItemByPosition(initialMove) == null) {
firstMove.put(initialMove, initialMove); firstMove.put(initialMove, initialMove);
toVisit.add(initialMove);
}
if (board.getItemByPosition(initialMove) instanceof Fire) return null;
} }
while (!toVisit.isEmpty()) { while (!toVisit.isEmpty()) {
Position current = toVisit.poll(); Position current = toVisit.poll();
if (board.getItemByPosition(current) instanceof Fire) { if (board.getItemByPosition(current) instanceof Fire) {
result.add(position);
position = firstMove.get(current); position = firstMove.get(current);
return; result.add(position);
return result;
} }
for (Position adjacent : board.neighbors(current)) { for (Position adjacent : board.neighbors(current)) {
if (seen.contains(adjacent)) continue; if (seen.contains(adjacent)) continue;
...@@ -29,5 +36,6 @@ public class Firefighter extends Extinguisher implements Item{ ...@@ -29,5 +36,6 @@ public class Firefighter extends Extinguisher implements Item{
firstMove.put(adjacent, firstMove.get(current)); firstMove.put(adjacent, firstMove.get(current));
} }
} }
return null;
} }
} }
...@@ -67,6 +67,21 @@ public class FirefighterBoard implements Board<List<ModelElement>> { ...@@ -67,6 +67,21 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
return result; return result;
} }
public List<Position> updateToNextGeneration2() {
List<Position> result = new ArrayList<Position>();
for (Item item: itemList) {
if (!(item instanceof Fire)) result.addAll(item.update(this));
}
if (step%2 == 0){
for (Item item: itemList) {
if (item instanceof Fire) result.addAll(item.update(this));
}
}
step++;
return result;
}
private List<Position> updateFires() { private List<Position> updateFires() {
List<Position> result = new ArrayList<>(); List<Position> result = new ArrayList<>();
if (step % 2 == 0) { if (step % 2 == 0) {
......
...@@ -6,7 +6,7 @@ import java.util.List; ...@@ -6,7 +6,7 @@ import java.util.List;
public interface Item { public interface Item {
void update(FirefighterBoard board); List<Position> update(FirefighterBoard board);
Position position(); Position position();
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment