Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found
Select Git revision
  • main
  • variant
2 results

Target

Select target project
No results found
Select Git revision
  • main
  • variant
2 results
Show changes

Commits on Source 3

4 files
+ 64
39
Compare changes
  • Side-by-side
  • Inline

Files

Original line number Original line Diff line number Diff line
distributionBase=GRADLE_USER_HOME
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
zipStorePath=wrapper/dists
Original line number Original line Diff line number Diff line
@@ -26,7 +26,7 @@ public class SimulatorApplication extends javafx.application.Application {
    this.primaryStage = primaryStage;
    this.primaryStage = primaryStage;
    this.primaryStage.setTitle(APP_NAME);
    this.primaryStage.setTitle(APP_NAME);
    this.primaryStage.setOnCloseRequest(event -> Platform.exit());
    this.primaryStage.setOnCloseRequest(event -> Platform.exit());
    this.primaryStage.setResizable(false);
    this.primaryStage.setResizable(true);
    this.primaryStage.sizeToScene();
    this.primaryStage.sizeToScene();
  }
  }


Original line number Original line Diff line number Diff line
@@ -10,14 +10,30 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
  private final int rowCount;
  private final int rowCount;
  private final int initialFireCount;
  private final int initialFireCount;
  private final int initialFirefighterCount;
  private final int initialFirefighterCount;
  private final TargetStrategy targetStrategy = new TargetStrategy();
  private List<Position> firefighterPositions;
  private List<Position> firefighterPositions;
  private Set<Position> firePositions;
  private Set<Position> firePositions;
  private Map<Position, List<Position>> neighbors = new HashMap();
  private final Position[][] positions;
  private int step = 0;
  private int step = 0;
  private final Random randomGenerator = new Random();
  private final Random randomGenerator = new Random();


  public FirefighterBoard(int columnCount, int rowCount, int initialFireCount, int initialFirefighterCount) {
  public FirefighterBoard(int columnCount, int rowCount, int initialFireCount, int initialFirefighterCount) {
    this.columnCount = columnCount;
    this.columnCount = columnCount;
    this.rowCount = rowCount;
    this.rowCount = rowCount;
    this.positions = new Position[rowCount][columnCount];
    for (int column = 0; column < columnCount; column++)
      for (int row = 0; row < rowCount; row++)
        positions[row][column] = new Position(row, column);
    for (int column = 0; column < columnCount; column++)
      for (int row = 0; row < rowCount; row++) {
        List<Position> list = new ArrayList<>();
        if (row > 0) list.add(positions[row - 1][column]);
        if (column > 0) list.add(positions[row][column - 1]);
        if (row < rowCount - 1) list.add(positions[row + 1][column]);
        if (column < columnCount - 1) list.add(positions[row][column + 1]);
        neighbors.put(positions[row][column], list);
      }
    this.initialFireCount = initialFireCount;
    this.initialFireCount = initialFireCount;
    this.initialFirefighterCount = initialFirefighterCount;
    this.initialFirefighterCount = initialFirefighterCount;
    initializeElements();
    initializeElements();
@@ -69,7 +85,7 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
    if (step % 2 == 0) {
    if (step % 2 == 0) {
      List<Position> newFirePositions = new ArrayList<>();
      List<Position> newFirePositions = new ArrayList<>();
      for (Position fire : firePositions) {
      for (Position fire : firePositions) {
        newFirePositions.addAll(neighbors(fire));
        newFirePositions.addAll(neighbors.get(fire));
      }
      }
      firePositions.addAll(newFirePositions);
      firePositions.addAll(newFirePositions);
      modifiedPositions.addAll(newFirePositions);
      modifiedPositions.addAll(newFirePositions);
@@ -87,12 +103,14 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
    List<Position> modifiedPosition = new ArrayList<>();
    List<Position> modifiedPosition = new ArrayList<>();
    List<Position> firefighterNewPositions = new ArrayList<>();
    List<Position> firefighterNewPositions = new ArrayList<>();
    for (Position firefighterPosition : firefighterPositions) {
    for (Position firefighterPosition : firefighterPositions) {
      Position newFirefighterPosition = neighborClosestToFire(firefighterPosition);
      Position newFirefighterPosition =
              targetStrategy.neighborClosestToFire(firefighterPosition,
                      firePositions, neighbors);
      firefighterNewPositions.add(newFirefighterPosition);
      firefighterNewPositions.add(newFirefighterPosition);
      extinguish(newFirefighterPosition);
      extinguish(newFirefighterPosition);
      modifiedPosition.add(firefighterPosition);
      modifiedPosition.add(firefighterPosition);
      modifiedPosition.add(newFirefighterPosition);
      modifiedPosition.add(newFirefighterPosition);
      List<Position> neighborFirePositions = neighbors(newFirefighterPosition).stream()
      List<Position> neighborFirePositions = neighbors.get(newFirefighterPosition).stream()
              .filter(firePositions::contains).toList();
              .filter(firePositions::contains).toList();
      for (Position firePosition : neighborFirePositions)
      for (Position firePosition : neighborFirePositions)
        extinguish(firePosition);
        extinguish(firePosition);
@@ -112,34 +130,6 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
    firePositions.remove(position);
    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 (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
  @Override
  public void setState(List<ModelElement> state, Position position) {
  public void setState(List<ModelElement> state, Position position) {
+35 −0
Original line number Original line Diff line number Diff line
package model;

import util.Position;

import java.util.*;

public class TargetStrategy {


    /**
     * @param position current position.
     * @param targets positions that are targeted.
     * @return the position next to the current position that is on the path to the closest target.
     */
    Position neighborClosestToFire(Position position, Collection<Position> targets,
                                   Map<Position,List<Position>>neighbors) {
        Set<Position> seen = new HashSet<Position>();
        HashMap<Position, Position> firstMove = new HashMap<Position, Position>();
        Queue<Position> toVisit = new LinkedList<Position>(neighbors.get(position));
        for (Position initialMove : toVisit)
            firstMove.put(initialMove, initialMove);
        while (!toVisit.isEmpty()) {
            Position current = toVisit.poll();
            if (targets.contains(current))
                return firstMove.get(current);
            for (Position adjacent : neighbors.get(current)) {
                if (seen.contains(adjacent)) continue;
                toVisit.add(adjacent);
                seen.add(adjacent);
                firstMove.put(adjacent, firstMove.get(current));
            }
        }
        return position;
    }
}
 No newline at end of file