-
Notifications
You must be signed in to change notification settings - Fork 0
/
updateCell.java
127 lines (109 loc) · 2.32 KB
/
updateCell.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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
import java.util.*;
public class updateCell extends Thread {
Cell cell;
Cell[] neighbours;
int iterations;
int aliveNeighbours = 0;
boolean myState = false;
public updateCell(Cell cell, Cell[] neighbours, int iterations) {
this.cell = cell;
this.neighbours = neighbours;
this.iterations = iterations;
}
public void run() {
try {
int itrs = 0;
while(itrs < this.iterations) {
runIteration();
itrs++;
}
} catch (Exception e) {
e.printStackTrace();
}
}
public void runIteration() throws Exception {
int op = 0;
while(op < 3) {
if ( op == 0) {
if(checkNeighbours()){
op++;
}
}
if ( op == 1) {
if(updateSelf()){
op++;
}
}
if ( op == 2) {
if (reset()) {
op++;
}
}
}
}
public boolean checkNeighbours() throws Exception {
int curLevel = cell.getLevel();
int count = 0;
for (Cell n : neighbours) {
if (n.getLevel() == curLevel) {
count++;
}
}
if (count == neighbours.length) {
this.calculateSelf();
cell.setCalculated(true);
return true;
}
return false;
}
public void calculateSelf() throws Exception {
cell.setUpdated(false);
this.myState = cell.getStatus();
this.aliveNeighbours = 0;
for (Cell n : neighbours) {
if (n.getStatus()) {
this.aliveNeighbours++;
}
}
int neighbours = this.aliveNeighbours;
if (neighbours < 2) {
cell.setCalculatedValue(false);
} else if (neighbours > 3) {
cell.setCalculatedValue(false);
} else if (neighbours == 3) {
cell.setCalculatedValue(true);
} else if (neighbours >=2 && neighbours <= 3 && myState) {
cell.setCalculatedValue(true);
} else {
cell.setCalculatedValue(false);
}
}
public boolean updateSelf() {
int count = 0;
for (Cell n : neighbours) {
if (n.getCalculated()) {
count++;
}
}
if (count == neighbours.length) {
cell.setStatus(cell.getCalculatedValue());
cell.setUpdated(true);
return true;
}
return false;
}
public boolean reset() {
int count = 0;
for (Cell n : neighbours) {
if(n.getUpdated()) {
count++;
}
}
if (count == neighbours.length) {
cell.setCalculated(false);
cell.setLevel();
return true;
}
return false;
}
}