-
Notifications
You must be signed in to change notification settings - Fork 0
/
DiseasedCells.java
87 lines (81 loc) · 2.7 KB
/
DiseasedCells.java
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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
import javafx.scene.paint.Color;
import java.util.List;
import java.util.Random;
/**
* Challenge Task (Disease)
* DiseasedCells represents a life form that can catch a disease and spread it to its neighbors.
* Once infected its behaviours change and it has a new color.
*
* @author Ahmet Taramis (K22038914)
*/
public class DiseasedCells extends Cell {
// Healthy color of cell
private static final Color HEALTHY_COLOR = Color.GREEN;
// Infected color of cell
private static final Color INFECTED_COLOR = Color.RED;
private boolean infected = false;
/**
* Create a new DiseasedCell.
*
* @param field The field currently occupied.
* @param location The location within the field.
*/
public DiseasedCells(Field field, Location location) {
super(field, location, HEALTHY_COLOR);
}
/**
* This method determines behaviours of the cell.
*/
public void act() {
List<Cell> neighbours = getField().getLivingNeighbours(getLocation());
List<Location> adjacentLocations = getField().adjacentLocations(getLocation());
Random rand = Randomizer.getRandom();
if (getColor() == INFECTED_COLOR) {
infected = true;
}
if (!infected) {
if (isAlive()) {
if (neighbours.size() < 2 || neighbours.size() > 4) {
setNextState(false);
}
else {
setNextState(true);
}
}
else {
if (neighbours.size() == 3) {
setNextState(true);
}
}
// Chance of randomly being infected
if (rand.nextDouble() <= 0.01) {
setNextState(true);
infected = true;
setColor(INFECTED_COLOR);
}
}
else {
// Chance of dying if infected
if (rand.nextDouble() < 0.2) {
setNextState(false);
infected = false;
setColor(HEALTHY_COLOR);
}
// Chance of curing disease
else if (rand.nextDouble() < 0.05) {
setNextState(true);
infected = false;
setColor(HEALTHY_COLOR);
}
// Chance of spreading disease to each neigbouring cells (element one for the disease)
for (Location loc : adjacentLocations) {
if (rand.nextDouble() < 0.3) {
Cell cell = getField().getObjectAt(loc);
if (cell.isAlive()) {
cell.setColor(INFECTED_COLOR);
}
}
}
}
}
}