A simple Game of Life implementation in Java
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

224 lines
5.8 KiB

  1. package edu.stuy.goldfish;
  2. import java.awt.Canvas;
  3. import java.awt.Dimension;
  4. import java.awt.Graphics;
  5. import java.awt.event.ActionEvent;
  6. import java.awt.event.ActionListener;
  7. import java.awt.event.ItemEvent;
  8. import java.awt.event.ItemListener;
  9. import java.awt.event.KeyEvent;
  10. import java.awt.event.MouseEvent;
  11. import java.awt.event.MouseListener;
  12. import java.awt.event.MouseMotionListener;
  13. import java.awt.image.BufferStrategy;
  14. import java.awt.image.BufferedImage;
  15. import java.awt.image.DataBufferInt;
  16. import javax.swing.AbstractButton;
  17. import javax.swing.JButton;
  18. import javax.swing.JCheckBoxMenuItem;
  19. import javax.swing.JFrame;
  20. import javax.swing.JMenu;
  21. import javax.swing.JMenuBar;
  22. import javax.swing.JMenuItem;
  23. import javax.swing.JRadioButtonMenuItem;
  24. import javax.swing.KeyStroke;
  25. public class Render extends Canvas implements Runnable, MouseListener,
  26. MouseMotionListener, ActionListener, ItemListener {
  27. private static final long serialVersionUID = 1L;
  28. public static String title = "Goldfish";
  29. public static int width;
  30. public static int height;
  31. public static int scale;
  32. public static int max_fps = 15;
  33. public boolean paused;
  34. private JFrame _frame;
  35. private BufferedImage _image;
  36. private Grid _grid;
  37. private int[] _pixels;
  38. private long _last_tick;
  39. JMenuBar menu_bar;
  40. JMenu menu_main, menu_algo;
  41. JMenuItem menu_algo_conway;
  42. JCheckBoxMenuItem pause_button;
  43. public Render(int width, int height, Grid g) {
  44. addMouseListener(this);
  45. addMouseMotionListener(this);
  46. Render.width = width;
  47. Render.height = height;
  48. setScale();
  49. _grid = g;
  50. _image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
  51. _pixels = ((DataBufferInt) _image.getRaster().getDataBuffer())
  52. .getData();
  53. _last_tick = 0;
  54. Dimension size = new Dimension(width * scale, height * scale);
  55. setPreferredSize(size);
  56. setFrame();
  57. menu_algo_conway.addActionListener(this);
  58. pause_button.addActionListener(this);
  59. }
  60. public Render(int width, int height) {
  61. this(width, height, new Grid(width, height));
  62. }
  63. public Render() {
  64. this(256, 256);
  65. }
  66. private void setScale() {
  67. if (height <= 128 || width <= 128) {
  68. Render.scale = 4;
  69. } else if (height <= 256 || width <= 256) {
  70. Render.scale = 2;
  71. } else {
  72. Render.scale = 1;
  73. }
  74. }
  75. private void setFrame() {
  76. menu_bar = new JMenuBar();
  77. menu_main = new JMenu("Menu");
  78. menu_algo = new JMenu("Algorithms");
  79. menu_algo_conway = new JMenuItem("Conway");
  80. menu_algo.add(menu_algo_conway);
  81. menu_main.add(menu_algo);
  82. menu_bar.add(menu_main);
  83. pause_button = new JCheckBoxMenuItem("Pause");
  84. menu_bar.add(pause_button);
  85. ItemListener pauseListener = new ItemListener() {
  86. public void itemStateChanged(ItemEvent event) {
  87. AbstractButton pause_button = (AbstractButton) event
  88. .getSource();
  89. if (event.getStateChange() == ItemEvent.SELECTED) {
  90. paused = true;
  91. } else {
  92. paused = false;
  93. }
  94. return;
  95. }
  96. };
  97. pause_button.addItemListener(pauseListener);
  98. _frame = new JFrame();
  99. _frame.setJMenuBar(menu_bar);
  100. _frame.setResizable(false);
  101. _frame.setTitle(title);
  102. _frame.add(this);
  103. _frame.pack();
  104. _frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  105. _frame.setLocationRelativeTo(null);
  106. _frame.setVisible(true);
  107. }
  108. private void clear() {
  109. for (int x = 0; x < _pixels.length; x++) {
  110. _pixels[x] = 0;
  111. }
  112. }
  113. private void update() {
  114. for (int i = 0; i < width; i++) {
  115. for (int j = 0; j < height; j++) {
  116. draw(i, j, _grid.getPatch(i, j).getState() * 0xffffff);
  117. }
  118. }
  119. }
  120. public void run() {
  121. BufferStrategy bs;
  122. Graphics g;
  123. bs = getBufferStrategy();
  124. if (bs == null) {
  125. createBufferStrategy(1);
  126. return;
  127. }
  128. clear();
  129. update();
  130. g = bs.getDrawGraphics();
  131. g.drawImage(_image, 0, 0, getWidth(), getHeight(), null);
  132. g.dispose();
  133. bs.show();
  134. }
  135. public void sleep() {
  136. long since = System.currentTimeMillis() - _last_tick;
  137. if (since < 1000 / max_fps) {
  138. try {
  139. Thread.sleep(1000 / max_fps - since);
  140. } catch (InterruptedException e) {
  141. return;
  142. }
  143. }
  144. _last_tick = System.currentTimeMillis();
  145. }
  146. public void setGrid(Grid g) {
  147. _grid = g;
  148. }
  149. public void draw(int x, int y, int color) {
  150. _pixels[x + y * width] = color;
  151. }
  152. @Override
  153. public void mouseDragged(MouseEvent e) {
  154. if (e.getX() < 0 || e.getY() < 0 || e.getX() / scale > width || e.getY() / scale > height)
  155. return;
  156. _grid.getPatch(e.getX() / scale, e.getY() / scale).setState(1);
  157. e.consume();
  158. }
  159. @Override
  160. public void mouseClicked(MouseEvent e) {
  161. _grid.getPatch(e.getX() / scale, e.getY() / scale).setState(1);
  162. e.consume();
  163. }
  164. @Override
  165. public void mouseEntered(MouseEvent e) {
  166. }
  167. @Override
  168. public void mouseExited(MouseEvent e) {
  169. }
  170. @Override
  171. public void mousePressed(MouseEvent e) {
  172. _grid.getPatch(e.getX() / scale, e.getY() / scale).setState(1);
  173. e.consume();
  174. }
  175. @Override
  176. public void mouseReleased(MouseEvent e) {
  177. }
  178. @Override
  179. public void mouseMoved(MouseEvent e) {
  180. }
  181. @Override
  182. public void itemStateChanged(ItemEvent arg0) {
  183. }
  184. @Override
  185. public void actionPerformed(ActionEvent arg0) {
  186. }
  187. }