A simple Game of Life implementation in Java
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

224 lignes
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. }