Also set some default patterns for some of the algorithms.master
@@ -1,5 +1,7 @@ | |||
package edu.stuy.goldfish; | |||
import java.util.Random; | |||
import edu.stuy.goldfish.rules.*; | |||
public class Goldfish { | |||
@@ -7,6 +9,8 @@ public class Goldfish { | |||
private Grid _grid; | |||
private Render _render; | |||
private Random random = new Random(); | |||
public Goldfish() { | |||
int width = 128; | |||
@@ -16,8 +20,12 @@ public class Goldfish { | |||
} | |||
public void run() { | |||
setup(); | |||
setup(_render.rule); | |||
while (true) { | |||
if (_render.reset) { | |||
setup(_render.rule); | |||
_render.reset = false; | |||
} | |||
if (!_render.paused) { | |||
String rule = _render.rule; | |||
if (rule.equals("Conway")) | |||
@@ -34,7 +42,6 @@ public class Goldfish { | |||
_render.sleep(); | |||
} | |||
} | |||
public static int getMaxStates(String rule) { | |||
if (rule.equals("Conway")) | |||
@@ -46,17 +53,43 @@ public class Goldfish { | |||
else if (rule.equals("Brian's Brain")) | |||
return BriansBrain.states; | |||
return 2; | |||
} | |||
private void setup() { | |||
for (int i = 0; i < _grid.getWidth(); i += 16) { | |||
for (int j = 0; j < _grid.getHeight(); j += 16) { | |||
_grid.getPatch(i + 1, j + 0).setState(1); | |||
_grid.getPatch(i + 2, j + 1).setState(1); | |||
_grid.getPatch(i + 2, j + 2).setState(1); | |||
_grid.getPatch(i + 1, j + 2).setState(1); | |||
_grid.getPatch(i + 0, j + 2).setState(1); | |||
} | |||
} | |||
} | |||
private void setup(String rule) { | |||
if(rule.equals("Conway")) { | |||
int[][] glidergun = { | |||
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0}, | |||
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0}, | |||
{0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1}, | |||
{0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1}, | |||
{1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, | |||
{1,1,0,0,0,0,0,0,0,0,1,0,0,0,1,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0}, | |||
{0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0}, | |||
{0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, | |||
{0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0} | |||
}; | |||
for(int i = 0; i < 36; i++) { | |||
for(int j = 0; j < 9; j++) { | |||
_grid.getPatch(i+2,j+2).setState(glidergun[j][i]); | |||
} | |||
} | |||
} 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),j+((_grid.getWidth()-2)/2)).setState(pattern[j][i]); | |||
} | |||
} | |||
} else if (rule.equals("Brian's Brain")) { | |||
for(int i = 0; i < _grid.getHeight(); i++) { | |||
for (int j = 0; j < _grid.getWidth(); j++) { | |||
_grid.getPatch(i,j).setState(random.nextInt(3)); | |||
} | |||
} | |||
} | |||
} | |||
public static void main(String[] args) { | |||
@@ -18,14 +18,19 @@ public class Render extends Canvas implements Runnable, MouseListener, | |||
public boolean paused; | |||
public String rule; | |||
public boolean reset; | |||
private Grid _grid; | |||
private BufferedImage _image; | |||
private int[] _pixels; | |||
private BufferedImage _image; | |||
private long _lastTick; | |||
private String[] _rules; | |||
private JFrame _frame; | |||
private JButton pauseButton; | |||
public Render(int width, int height, Grid g, String[] rules) { | |||
addMouseListener(this); | |||
addMouseMotionListener(this); | |||
@@ -33,6 +38,7 @@ public class Render extends Canvas implements Runnable, MouseListener, | |||
Render.height = height; | |||
setScale(); | |||
paused = false; | |||
reset = false; | |||
rule = rules[0]; | |||
_grid = g; | |||
_image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); | |||
@@ -78,9 +84,20 @@ public class Render extends Canvas implements Runnable, MouseListener, | |||
menuMain.add(menuAlgo); | |||
menuBar.add(menuMain); | |||
JCheckBoxMenuItem pauseButton = new JCheckBoxMenuItem("Pause"); | |||
pauseButton = new JButton("Pause"); | |||
pauseButton.setActionCommand("pause"); | |||
menuBar.add(pauseButton); | |||
pauseButton.addItemListener(this); | |||
pauseButton.addActionListener(this); | |||
JButton resetButton = new JButton("Reset"); | |||
resetButton.setActionCommand("reset"); | |||
menuBar.add(resetButton); | |||
resetButton.addActionListener(this); | |||
JButton clearButton = new JButton("Clear"); | |||
clearButton.setActionCommand("clear"); | |||
menuBar.add(clearButton); | |||
clearButton.addActionListener(this); | |||
_frame = new JFrame(); | |||
_frame.setJMenuBar(menuBar); | |||
@@ -99,9 +116,9 @@ public class Render extends Canvas implements Runnable, MouseListener, | |||
for (int i = 0; i < width; i++) { | |||
for (int j = 0; j < height; j++) { | |||
state = _grid.getPatch(i, j).getState(); | |||
if(_pixels[i + j * width] == state) { | |||
if (_pixels[i + j * width] == state) { | |||
} else { | |||
draw(i, j, (int) ((state/((double) states - 1)) * 0xffffff)); | |||
draw(i, j, (int) ((state / ((double) states - 1)) * 0xffffff)); | |||
} | |||
} | |||
} | |||
@@ -144,6 +161,14 @@ public class Render extends Canvas implements Runnable, MouseListener, | |||
public void draw(int x, int y, int color) { | |||
_pixels[x + y * width] = color; | |||
} | |||
public void clear() { | |||
for (int i = 0; i < _grid.getHeight(); i++) { | |||
for (int j = 0; j < _grid.getWidth(); j++) { | |||
_grid.getPatch(i, j).setState(0); | |||
} | |||
} | |||
} | |||
@Override | |||
public void mouseDragged(MouseEvent e) { | |||
@@ -187,16 +212,25 @@ public class Render extends Canvas implements Runnable, MouseListener, | |||
// Affects the algorithms menu | |||
@Override | |||
public void actionPerformed(ActionEvent event) { | |||
rule = event.getActionCommand(); | |||
if ("pause".equals(event.getActionCommand())) { | |||
if (paused) { | |||
paused = false; | |||
pauseButton.setText("Pause"); | |||
} else { | |||
paused = true; | |||
pauseButton.setText("Unpause"); | |||
} | |||
} else if ("reset".equals(event.getActionCommand())) { | |||
clear(); | |||
reset = true; | |||
} else if ("clear".equals(event.getActionCommand())) { | |||
clear(); | |||
} else { | |||
rule = event.getActionCommand(); | |||
} | |||
} | |||
// Affects the pause button | |||
@Override | |||
public void itemStateChanged(ItemEvent event) { | |||
if (event.getStateChange() == ItemEvent.SELECTED) | |||
paused = true; | |||
else | |||
paused = false; | |||
return; | |||
} | |||
} |