A simple Game of Life implementation in Java
Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

Render.java 8.2 KiB

11 anos atrás
11 anos atrás
11 anos atrás
11 anos atrás
11 anos atrás
11 anos atrás
11 anos atrás
11 anos atrás
11 anos atrás
11 anos atrás
11 anos atrás
11 anos atrás
11 anos atrás
11 anos atrás
11 anos atrás
11 anos atrás
11 anos atrás
11 anos atrás
11 anos atrás
11 anos atrás
11 anos atrás
11 anos atrás
11 anos atrás
11 anos atrás
11 anos atrás
11 anos atrás
11 anos atrás
11 anos atrás
11 anos atrás
11 anos atrás
11 anos atrás
11 anos atrás
11 anos atrás
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279
  1. package edu.stuy.goldfish;
  2. import java.awt.*;
  3. import java.awt.event.*;
  4. import java.awt.image.*;
  5. import javax.swing.*;
  6. import javax.swing.event.*;
  7. import java.util.Random;
  8. public class Render extends Canvas implements Runnable, MouseListener,
  9. MouseMotionListener, ActionListener {
  10. private static final long serialVersionUID = 1L;
  11. public static String title = "Goldfish";
  12. public static int width;
  13. public static int height;
  14. public static int scale;
  15. public int fps_now;
  16. public boolean paused;
  17. public String rule;
  18. public boolean reset;
  19. private Grid _grid;
  20. private int[] _pixels;
  21. private BufferedImage _image;
  22. private long _lastTick;
  23. private String[] _rules;
  24. private JFrame _frame;
  25. private JButton pauseButton;
  26. private Random random = new Random();
  27. public Render(int width, int height, Grid g, String[] rules) {
  28. addMouseListener(this);
  29. addMouseMotionListener(this);
  30. Render.width = width;
  31. Render.height = height;
  32. setScale();
  33. paused = false;
  34. reset = false;
  35. rule = rules[0];
  36. _grid = g;
  37. _image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
  38. _pixels = ((DataBufferInt) _image.getRaster().getDataBuffer()).getData();
  39. _lastTick = 0;
  40. _rules = rules;
  41. fps_now = 15;
  42. Dimension size = new Dimension(width * scale, height * scale);
  43. setPreferredSize(size);
  44. setFrame();
  45. }
  46. public Render(int width, int height, Grid g) {
  47. this(width, height, g, new String[0]);
  48. }
  49. public Render(int width, int height) {
  50. this(width, height, new Grid(width, height));
  51. }
  52. public Render() {
  53. this(256, 256);
  54. }
  55. private void setScale() {
  56. if (height <= 128 || width <= 128) {
  57. Render.scale = 4;
  58. } else if (height <= 256 || width <= 256) {
  59. Render.scale = 2;
  60. } else {
  61. Render.scale = 1;
  62. }
  63. }
  64. private void setFrame() {
  65. JMenuBar menuBar = new JMenuBar();
  66. JMenu menuMain = new JMenu("Menu");
  67. JMenu menuAlgo = new JMenu("Algorithms");
  68. for (String rule : _rules) {
  69. JMenuItem menuAlgoItem = new JMenuItem(rule);
  70. menuAlgo.add(menuAlgoItem);
  71. menuAlgoItem.addActionListener(this);
  72. }
  73. menuMain.add(menuAlgo);
  74. menuBar.add(menuMain);
  75. pauseButton = new JButton("Pause");
  76. pauseButton.setActionCommand("pause");
  77. pauseButton.setPreferredSize(new Dimension(90,0));
  78. menuBar.add(pauseButton);
  79. pauseButton.addActionListener(this);
  80. JButton resetButton = new JButton("Reset");
  81. resetButton.setActionCommand("reset");
  82. menuBar.add(resetButton);
  83. resetButton.addActionListener(this);
  84. JButton randomButton = new JButton("Random");
  85. randomButton.setActionCommand("random");
  86. menuBar.add(randomButton);
  87. randomButton.addActionListener(this);
  88. JButton clearButton = new JButton("Clear");
  89. clearButton.setActionCommand("clear");
  90. menuBar.add(clearButton);
  91. clearButton.addActionListener(this);
  92. JSlider framesPerSecond = new JSlider(JSlider.HORIZONTAL, 0, 30, 15);
  93. ChangeListener fpschange = new ChangeListener() {
  94. @Override
  95. public void stateChanged(ChangeEvent event) {
  96. JSlider source = (JSlider) event.getSource();
  97. if (!source.getValueIsAdjusting()) {
  98. int fps = (int) source.getValue();
  99. if (fps == 0) {
  100. paused = true;
  101. pauseButton.setText("Unpause");
  102. } else {
  103. paused = false;
  104. fps_now = fps;
  105. pauseButton.setText("Pause");
  106. }
  107. }
  108. }
  109. };
  110. framesPerSecond.addChangeListener(fpschange);
  111. framesPerSecond.setMajorTickSpacing(10);
  112. framesPerSecond.setMinorTickSpacing(1);
  113. framesPerSecond.setPaintTicks(true);
  114. framesPerSecond.setPaintLabels(true);
  115. menuBar.add(framesPerSecond);
  116. _frame = new JFrame();
  117. _frame.setJMenuBar(menuBar);
  118. _frame.setResizable(false);
  119. _frame.setTitle(title);
  120. _frame.add(this);
  121. _frame.pack();
  122. _frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  123. _frame.setLocationRelativeTo(null);
  124. _frame.setVisible(true);
  125. }
  126. private void update() {
  127. int state;
  128. int states = Goldfish.getMaxStates(rule);
  129. for (int i = 0; i < width; i++) {
  130. for (int j = 0; j < height; j++) {
  131. state = _grid.getPatch(i, j).getState();
  132. if (_pixels[i + j * width] == state) {
  133. } else {
  134. draw(i, j, (int) ((state / ((double) states - 1)) * 0xffffff));
  135. }
  136. }
  137. }
  138. }
  139. public void run() {
  140. BufferStrategy bs;
  141. Graphics g;
  142. bs = getBufferStrategy();
  143. if (bs == null) {
  144. createBufferStrategy(1);
  145. return;
  146. }
  147. update();
  148. g = bs.getDrawGraphics();
  149. g.drawImage(_image, 0, 0, getWidth(), getHeight(), null);
  150. g.dispose();
  151. bs.show();
  152. }
  153. public void sleep() {
  154. long since = System.currentTimeMillis() - _lastTick;
  155. if (since < 1000 / fps_now) {
  156. try {
  157. Thread.sleep(1000 / fps_now - since);
  158. } catch (InterruptedException e) {
  159. return;
  160. }
  161. }
  162. _lastTick = System.currentTimeMillis();
  163. }
  164. public void setGrid(Grid g) {
  165. _grid = g;
  166. }
  167. public void draw(int x, int y, int color) {
  168. _pixels[x + y * width] = color;
  169. }
  170. public void clear() {
  171. for (int i = 0; i < _grid.getHeight(); i++) {
  172. for (int j = 0; j < _grid.getWidth(); j++) {
  173. _grid.getPatch(i, j).setState(0);
  174. }
  175. }
  176. }
  177. public void randomize() {
  178. for (int i = 0; i < _grid.getHeight(); i++) {
  179. for (int j = 0; j < _grid.getWidth(); j++) {
  180. _grid.getPatch(i, j).setState(random.nextInt(Goldfish.getMaxStates(rule)));
  181. }
  182. }
  183. }
  184. @Override
  185. public void mouseDragged(MouseEvent e) {
  186. int states = Goldfish.getMaxStates(rule) - 1;
  187. if (e.getX() < 0 || e.getY() < 0 || e.getX() / scale > width || e.getY() / scale > height)
  188. return;
  189. _grid.getPatch(e.getX() / scale, e.getY() / scale).setState(states);
  190. e.consume();
  191. }
  192. @Override
  193. public void mouseClicked(MouseEvent e) {
  194. int states = Goldfish.getMaxStates(rule) - 1;
  195. _grid.getPatch(e.getX() / scale, e.getY() / scale).setState(states);
  196. e.consume();
  197. }
  198. @Override
  199. public void mouseEntered(MouseEvent e) {
  200. }
  201. @Override
  202. public void mouseExited(MouseEvent e) {
  203. }
  204. @Override
  205. public void mousePressed(MouseEvent e) {
  206. int states = Goldfish.getMaxStates(rule) - 1;
  207. _grid.getPatch(e.getX() / scale, e.getY() / scale).setState(states);
  208. e.consume();
  209. }
  210. @Override
  211. public void mouseReleased(MouseEvent e) {
  212. }
  213. @Override
  214. public void mouseMoved(MouseEvent e) {
  215. }
  216. // Affects the algorithms menu
  217. @Override
  218. public void actionPerformed(ActionEvent event) {
  219. if ("pause".equals(event.getActionCommand())) {
  220. if (paused) {
  221. paused = false;
  222. pauseButton.setText("Pause");
  223. } else {
  224. paused = true;
  225. pauseButton.setText("Unpause");
  226. }
  227. } else if ("reset".equals(event.getActionCommand())) {
  228. clear();
  229. reset = true;
  230. } else if ("random".equals(event.getActionCommand())) {
  231. randomize();
  232. } else if ("clear".equals(event.getActionCommand())) {
  233. clear();
  234. } else {
  235. rule = event.getActionCommand();
  236. }
  237. }
  238. }