@@ -9,20 +9,31 @@ public class Goldfish { | |||||
private Render _render; | private Render _render; | ||||
public Goldfish() { | public Goldfish() { | ||||
int width = 128; | |||||
int height = 128; | |||||
int width = 512; | |||||
int height = 512; | |||||
_grid = new Grid(width, height); | _grid = new Grid(width, height); | ||||
_render = new Render(width, height, _grid, RULES); | _render = new Render(width, height, _grid, RULES); | ||||
} | } | ||||
public void run() { | public void run() { | ||||
setup(_render.rule); | setup(_render.rule); | ||||
int runs = 0; | |||||
double average = 0; | |||||
while (true) { | while (true) { | ||||
if (_render.reset) { | if (_render.reset) { | ||||
setup(_render.rule); | setup(_render.rule); | ||||
_render.reset = false; | _render.reset = false; | ||||
} | } | ||||
if (!_render.paused) { | if (!_render.paused) { | ||||
long start = System.currentTimeMillis(); | |||||
String rule = _render.rule; | String rule = _render.rule; | ||||
if (rule.equals("Conway")) | if (rule.equals("Conway")) | ||||
_grid = Conway.run(_grid); | _grid = Conway.run(_grid); | ||||
@@ -32,6 +43,17 @@ public class Goldfish { | |||||
_grid = LifeWithoutDeath.run(_grid); | _grid = LifeWithoutDeath.run(_grid); | ||||
else if (rule.equals("Brian's Brain")) | else if (rule.equals("Brian's Brain")) | ||||
_grid = BriansBrain.run(_grid); | _grid = BriansBrain.run(_grid); | ||||
long diff = System.currentTimeMillis() - start; | |||||
average = (diff + (average * runs)) / (runs + 1); | |||||
runs++; | |||||
if (runs % 30 == 0) | |||||
System.out.println(runs + ": " + average); | |||||
} | } | ||||
_render.setGrid(_grid); | _render.setGrid(_grid); | ||||
_render.run(); | _render.run(); | ||||
@@ -70,29 +92,29 @@ public class Goldfish { | |||||
} | } | ||||
} | } | ||||
} else if (rule.equals("Life Without Death")) { | } else if (rule.equals("Life Without Death")) { | ||||
int[][] pattern = { | |||||
{1,1,1,1,0,1}, | |||||
{1,0,1,1,1,1} | |||||
}; | |||||
for (int i = 0; i < 6; i++) { | |||||
for (int j = 0; j < 2; j++) { | |||||
_grid.getPatch(i + ((_grid.getHeight() - 6) / 2), | |||||
int[][] pattern = { | |||||
{1,1,1,1,0,1}, | |||||
{1,0,1,1,1,1} | |||||
}; | |||||
for (int i = 0; i < 6; i++) { | |||||
for (int j = 0; j < 2; j++) { | |||||
_grid.getPatch(i + ((_grid.getHeight() - 6) / 2), | |||||
j + ((_grid.getWidth() - 2) / 2)).setState(pattern[j][i]); | j + ((_grid.getWidth() - 2) / 2)).setState(pattern[j][i]); | ||||
} | |||||
} | |||||
} else if (rule.equals("Brian's Brain")) { | |||||
int[][] pattern = { | |||||
{2,0,2,0,2}, | |||||
{2,0,2,0,2}, | |||||
{0,1,0,1,0} | |||||
}; | |||||
for (int i = 0; i < 5; i++) { | |||||
for (int j = 0; j < 3; j++) { | |||||
_grid.getPatch(i + ((_grid.getHeight() - 5) / 2), | |||||
} | |||||
} | |||||
} else if (rule.equals("Brian's Brain")) { | |||||
int[][] pattern = { | |||||
{2,0,2,0,2}, | |||||
{2,0,2,0,2}, | |||||
{0,1,0,1,0} | |||||
}; | |||||
for (int i = 0; i < 5; i++) { | |||||
for (int j = 0; j < 3; j++) { | |||||
_grid.getPatch(i + ((_grid.getHeight() - 5) / 2), | |||||
j + ((_grid.getWidth() - 3) / 2)).setState(pattern[j][i]); | j + ((_grid.getWidth() - 3) / 2)).setState(pattern[j][i]); | ||||
} | |||||
} | |||||
} | |||||
} | |||||
} | |||||
} | |||||
} | } | ||||
public static void main(String[] args) { | public static void main(String[] args) { | ||||
@@ -39,28 +39,66 @@ public class Patch { | |||||
return "" + ((_state == 0) ? "." : _state); | return "" + ((_state == 0) ? "." : _state); | ||||
} | } | ||||
public Patch[] get4Neighbors() { | |||||
Patch[] neighbors = new Patch[4]; | |||||
neighbors[0] = _grid.getPatch(_xcor + 1, _ycor); | |||||
neighbors[1] = _grid.getPatch(_xcor - 1, _ycor); | |||||
neighbors[2] = _grid.getPatch(_xcor, _ycor + 1); | |||||
neighbors[3] = _grid.getPatch(_xcor, _ycor - 1); | |||||
public int get4Neighbors(int state, int max) { | |||||
int neighbors = 0; | |||||
for (int i = 0; i < 4; i++) { | |||||
Patch p; | |||||
switch(i) { | |||||
case 0: | |||||
p = _grid.getPatch(_xcor + 1, _ycor); break; | |||||
case 1: | |||||
p = _grid.getPatch(_xcor - 1, _ycor); break; | |||||
case 2: | |||||
p = _grid.getPatch(_xcor, _ycor + 1); break; | |||||
default: | |||||
p = _grid.getPatch(_xcor, _ycor - 1); break; | |||||
} | |||||
if (p.getState() == state) | |||||
neighbors++; | |||||
if (neighbors == max) | |||||
break; | |||||
} | |||||
return neighbors; | return neighbors; | ||||
} | } | ||||
public Patch[] get8Neighbors() { | |||||
Patch[] neighbors = new Patch[8]; | |||||
neighbors[0] = _grid.getPatch(_xcor + 1, _ycor); | |||||
neighbors[1] = _grid.getPatch(_xcor - 1, _ycor); | |||||
neighbors[2] = _grid.getPatch(_xcor, _ycor + 1); | |||||
neighbors[3] = _grid.getPatch(_xcor, _ycor - 1); | |||||
neighbors[4] = _grid.getPatch(_xcor + 1, _ycor + 1); | |||||
neighbors[5] = _grid.getPatch(_xcor + 1, _ycor - 1); | |||||
neighbors[6] = _grid.getPatch(_xcor - 1, _ycor + 1); | |||||
neighbors[7] = _grid.getPatch(_xcor - 1, _ycor - 1); | |||||
public int get8Neighbors(int state, int max) { | |||||
int neighbors = 0; | |||||
for (int i = 0; i < 8; i++) { | |||||
Patch p; | |||||
switch(i) { | |||||
case 0: | |||||
p = _grid.getPatch(_xcor + 1, _ycor); break; | |||||
case 1: | |||||
p = _grid.getPatch(_xcor - 1, _ycor); break; | |||||
case 2: | |||||
p = _grid.getPatch(_xcor, _ycor + 1); break; | |||||
case 3: | |||||
p = _grid.getPatch(_xcor, _ycor - 1); break; | |||||
case 4: | |||||
p = _grid.getPatch(_xcor + 1, _ycor + 1); break; | |||||
case 5: | |||||
p = _grid.getPatch(_xcor + 1, _ycor - 1); break; | |||||
case 6: | |||||
p = _grid.getPatch(_xcor - 1, _ycor + 1); break; | |||||
default: | |||||
p = _grid.getPatch(_xcor - 1, _ycor - 1); break; | |||||
} | |||||
if (p.getState() == state) | |||||
neighbors++; | |||||
if (neighbors == max) | |||||
break; | |||||
} | |||||
return neighbors; | return neighbors; | ||||
} | } | ||||
public int get4Neighbors(int state) { | |||||
return get4Neighbors(state, 4); | |||||
} | |||||
public int get8Neighbors(int state) { | |||||
return get8Neighbors(state, 8); | |||||
} | |||||
public Patch clone(Grid grid) { | public Patch clone(Grid grid) { | ||||
return new Patch(grid, _xcor, _ycor, _state); | return new Patch(grid, _xcor, _ycor, _state); | ||||
} | } | ||||
@@ -15,9 +15,7 @@ public class BriansBrain extends RuleSet { | |||||
if (orig.getState() == 1) p.setState(0); // Dying cells die. | if (orig.getState() == 1) p.setState(0); // Dying cells die. | ||||
else if (orig.getState() == 2) p.setState(1); // Make living cells dying. | else if (orig.getState() == 2) p.setState(1); // Make living cells dying. | ||||
else { | else { | ||||
int numAlive = 0; | |||||
for (Patch neighbor : orig.get8Neighbors()) | |||||
if (neighbor.getState() == 2) numAlive++; | |||||
int numAlive = orig.get8Neighbors(2, 3); | |||||
if (orig.getState() == 0 && numAlive == 2) p.setState(2); | if (orig.getState() == 0 && numAlive == 2) p.setState(2); | ||||
} | } | ||||
newGrid.setPatch(i,j,p); | newGrid.setPatch(i,j,p); | ||||
@@ -10,18 +10,14 @@ public class Conway extends RuleSet { | |||||
Grid newGrid = new Grid(g.getWidth(), g.getHeight(), false); | Grid newGrid = new Grid(g.getWidth(), g.getHeight(), false); | ||||
for (int i = 0; i < g.getWidth(); i++) { | for (int i = 0; i < g.getWidth(); i++) { | ||||
for (int j = 0; j < g.getHeight(); j++) { | for (int j = 0; j < g.getHeight(); j++) { | ||||
Patch[] neighbors = g.getPatch(i, j).get8Neighbors(); | |||||
int numAlive = 0; | |||||
for (Patch neighbor : neighbors) | |||||
if (neighbor.getState() == 1) numAlive++; | |||||
Patch p = g.getPatch(i, j).clone(newGrid); | |||||
if (numAlive < 2) { | |||||
Patch orig = g.getPatch(i, j); | |||||
int numAlive = orig.get8Neighbors(1, 4); | |||||
Patch p = orig.clone(newGrid); | |||||
if (numAlive < 2) | |||||
p.setState(0); // Dies by underpopulation | p.setState(0); // Dies by underpopulation | ||||
} | |||||
if (numAlive > 3) { | |||||
else if (numAlive > 3) | |||||
p.setState(0); // Dies by overpopulation | p.setState(0); // Dies by overpopulation | ||||
} | |||||
if (numAlive == 3) | |||||
else if (numAlive == 3) | |||||
p.setState(1); // Born with 3 neighbors | p.setState(1); // Born with 3 neighbors | ||||
newGrid.setPatch(i, j, p); | newGrid.setPatch(i, j, p); | ||||
} | } | ||||
@@ -11,23 +11,18 @@ public class Conway4 extends RuleSet { | |||||
Grid newGrid = new Grid(g.getWidth(), g.getHeight(), false); | Grid newGrid = new Grid(g.getWidth(), g.getHeight(), false); | ||||
for (int i = 0; i < g.getWidth(); i++) { | for (int i = 0; i < g.getWidth(); i++) { | ||||
for (int j = 0; j < g.getHeight(); j++) { | for (int j = 0; j < g.getHeight(); j++) { | ||||
Patch[] neighbors = g.getPatch(i, j).get4Neighbors(); | |||||
int numAlive = 0; | |||||
for (Patch p : neighbors) | |||||
if (p.getState() == 1) numAlive++; | |||||
Patch p = g.getPatch(i, j).clone(newGrid); | |||||
if (numAlive < 2) { | |||||
Patch orig = g.getPatch(i, j); | |||||
int numAlive = orig.get4Neighbors(1); | |||||
Patch p = orig.clone(newGrid); | |||||
if (numAlive < 2) | |||||
p.setState(0); // Dies by underpopulation | p.setState(0); // Dies by underpopulation | ||||
} | |||||
if (numAlive > 3) { | |||||
else if (numAlive > 3) | |||||
p.setState(0); // Dies by overpopulation | p.setState(0); // Dies by overpopulation | ||||
} | |||||
if (numAlive == 3) | |||||
p.setState(1); // Born with 3 neighbors. | |||||
else if (numAlive == 3) | |||||
p.setState(1); // Born with 3 neighbors | |||||
newGrid.setPatch(i, j, p); | newGrid.setPatch(i, j, p); | ||||
} | } | ||||
} | } | ||||
return newGrid; | return newGrid; | ||||
} | } | ||||
} | } |
@@ -11,13 +11,11 @@ public class LifeWithoutDeath extends RuleSet { | |||||
Grid newGrid = new Grid(g.getWidth(), g.getHeight(), false); | Grid newGrid = new Grid(g.getWidth(), g.getHeight(), false); | ||||
for (int i = 0; i < g.getWidth(); i++) { | for (int i = 0; i < g.getWidth(); i++) { | ||||
for (int j = 0; j < g.getHeight(); j++) { | for (int j = 0; j < g.getHeight(); j++) { | ||||
Patch[] neighbors = g.getPatch(i, j).get8Neighbors(); | |||||
int numAlive = 0; | |||||
for (Patch neighbor : neighbors) | |||||
if (neighbor.getState() == 1) numAlive++; | |||||
Patch p = g.getPatch(i, j).clone(newGrid); | |||||
Patch orig = g.getPatch(i, j); | |||||
int numAlive = orig.get8Neighbors(1, 4); | |||||
Patch p = orig.clone(newGrid); | |||||
if (numAlive == 3) | if (numAlive == 3) | ||||
p.setState(1); //Born with 3 neighbors. | |||||
p.setState(1); // Born with 3 neighbors | |||||
newGrid.setPatch(i, j, p); | newGrid.setPatch(i, j, p); | ||||
} | } | ||||
} | } | ||||