Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
package model;
import util.Position;
import util.TargetStrategy;
import java.util.*;
public class FireFighterBehavior extends FFBehavior implements TangibleBehavior<ModelElement> {
private List<ModelElement> obstacles=List.of(ModelElement.MOUNTAIN);
private TargetStrategy ts=new TargetStrategy();
List<Position> initializeTargets(BoardData boardData){
List<Position> targets=new ArrayList<>();
for (ModelElement me:ModelElement.values()) {
if (me.isFire()){
System.out.println("0");
for (Element e:boardData.getElements().get(me.ordinal())) {
targets.add(e.getPosition());
}}
}
return targets;
}
@Override
public List<Position> update(BoardData boardData,Element element) {
Position position=element.getPosition();
List<Position> targets=initializeTargets(boardData);
for (int i=0;i<((FireFighter)element).speed;i++) {
position=ts.neighborClosestToFire(position,targets,allLegalNeighbors(boardData));
extinguish(boardData,position);
targets.remove(position);
targets.removeAll(boardData.getNeighbor(position));
}
return List.of(position);
}
@Override
public List<ModelElement> getObstacles() {
return obstacles;
}
public void extinguish(BoardData boardData, Position position){
List<Position> l=new ArrayList<>(legalNeighbors(boardData,position));
l.add(position);
for (Position p:l) {
List<Element> c=new ArrayList<>(boardData.getCell(p).Content);
for (Element e:c) {
if (e instanceof Fire){
boardData.removeElement(e);}
}
}
}
@Override
public List<Position> legalNeighbors(BoardData boardData,Position position) {
List<Position> neighbors=new ArrayList<>(boardData.getNeighbor(position));
for (Position p:boardData.getNeighbor(position)) {
for (Element e:boardData.getCell(p).Content) {
for(ModelElement o:getObstacles())
if (e.getType()==o) neighbors.remove(p);
}
}
return neighbors;
}
@Override
public Map<Position, List<Position>> allLegalNeighbors(BoardData boardData) {
Map<Position, List<Position>> neighbors= new HashMap<>(Map.copyOf(boardData.getNeighbors()));
for (Position pkey: boardData.getNeighbors().keySet()) {
neighbors.replace(pkey,legalNeighbors(boardData,pkey));
}
return neighbors;
}
}