diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..13566b8 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..c3dfb30 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..71d4264 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/runConfigurations.xml b/.idea/runConfigurations.xml new file mode 100644 index 0000000..797acea --- /dev/null +++ b/.idea/runConfigurations.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml new file mode 100644 index 0000000..e96534f --- /dev/null +++ b/.idea/uiDesigner.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Conways-Game-of-Life.iml b/Conways-Game-of-Life.iml new file mode 100644 index 0000000..c90834f --- /dev/null +++ b/Conways-Game-of-Life.iml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/src/v3/Control.java b/src/v3/Control.java new file mode 100644 index 0000000..8d48256 --- /dev/null +++ b/src/v3/Control.java @@ -0,0 +1,113 @@ +package v3; + +public class Control { + + private boolean[][] generation = new boolean[6][6]; + private GUI g = new GUI(this); + + public Control() { + for (int x = 0; x < 6; x++) { + for (int y = 0; y < 6; y++) { + generation[x][y] = false; + } + } + + generation[1][2] = true; + generation[2][2] = true; + generation[2][4] = true; + generation[3][1] = true; + generation[3][3] = true; + generation[4][3] = true; + + + } + + + public void start() { + g.showGeneration(bool2int(generation)); + } + + public void update(){ + generation = calcNextGeneration(); + g.showGeneration(bool2int(generation)); + } + + private int[][] bool2int(boolean[][] booleans) { + + int[][] ret = new int[6][6]; + + for (int x = 0; x < 6; x++) { + for (int y = 0; y < 6; y++) { + if (booleans[x][y]){ + ret[x][y] = 1; + } else { + ret[x][y] = 0; + } + } + } + return ret; + } + + private int countNeighboursAlive(int x, int y) { + int count = 0; + //Anfang mitte rechts, Uhrzeigersinn + int[] xoff = {1, 1, 0, -1, -1, -1, 0, 1}; + int[] yoff = {0, 1, 1, 1, 0, -1, -1, -1}; + + for (int i = 0; i < 8; i++) { + try { + if (generation[x + xoff[i]][y + yoff[i]]) count++; + } catch (Exception e) { + + } + } + + + System.out.println(count); + return count; + } + + public boolean[][] calcNextGeneration() { + + boolean[][] gen = new boolean[6][6]; + + + for (int x = 0; x < 6; x++) { + for (int y = 0; y < 6; y++) { + int n = countNeighboursAlive(x, y); + //Regel 1: Wiederbeleben + if (n == 3 && !gen[x][y]) { + gen[x][y] = true; + } + + //Regel 2: Unterbevölkerung + if (n < 2) { + gen[x][y] = false; + } + + //Regel 3: Am Leben bleiben + if (n == 2 || n == 3) { + //Zelle bleibt unverändert + } + + //Regel 4: Überbevölkerung + if (n > 3) { + gen[x][y] = false; + } + + } + } + + return gen; + } + + + public void newData(boolean[][] data) { + + generation = data; + + + } +} + + diff --git a/src/v3/GUI.java b/src/v3/GUI.java new file mode 100644 index 0000000..9b0193f --- /dev/null +++ b/src/v3/GUI.java @@ -0,0 +1,109 @@ +package v3; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.Objects; +import v3.Control; + +public class GUI extends JFrame { + + private JButton[][] buttons = new JButton[6][6]; + private JButton nextGen = new JButton(); + public Control c; + + public GUI(Control c){ + + this.c = c; + + setTitle("Test"); + setUndecorated(false); + + setDefaultCloseOperation(EXIT_ON_CLOSE); + setAutoRequestFocus(false); + setLayout(null); + setSize(500, 500); + setResizable(true); + + + initComponents(); + addComponents(); + + + setLocationRelativeTo(null); + setVisible(true); + + } + + private void initComponents() { + + nextGen.setBounds(0, 0, 100, 50); + nextGen.setText("Next"); + nextGen.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + c.update(); + } + }); + + for (int i = 0; i < 6; i++) { + for (int y = 0; y < 6; y++) { + buttons[i][y] = new JButton(); + buttons[i][y].setBounds(i * 50 + 50, y * 50 + 50, 50, 50); + int finalI = i; + int finalY = y; + buttons[i][y].addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + if (Objects.equals(buttons[finalI][finalY].getText(), "0")){ + buttons[finalI][finalY].setText("1"); + buttons[finalI][finalY].setBackground(Color.green); + } else { + buttons[finalI][finalY].setText("0"); + buttons[finalI][finalY].setBackground(Color.yellow); + } + + boolean[][] data = new boolean[6][6]; + + for (int i = 0; i < 6; i++) { + for (int y = 0; y < 6; y++) { + if (Objects.equals(buttons[i][y].getText(), "1")){ + data[i][y] = true; + } else { + data[i][y] = false; + } + } + } + + c.newData(data); + } + }); + } + } + } + private void addComponents() { + add(nextGen); + for (int i = 0; i < 6; i++) { + for (int y = 0; y < 6; y++) { + add(buttons[i][y]); + } + } + + } + + public void showGeneration(int[][] pGeneration) { + for (int i = 0; i < 6; i++) { + for (int y = 0; y < 6; y++) { + buttons[i][y].setText(String.valueOf(pGeneration[y][i])); + if (Objects.equals(buttons[i][y].getText(), "0")){ + buttons[i][y].setBackground(Color.green); + } else { + buttons[i][y].setBackground(Color.yellow); + } + } + } + } +} + + diff --git a/src/v3/Main.java b/src/v3/Main.java new file mode 100644 index 0000000..6b5427d --- /dev/null +++ b/src/v3/Main.java @@ -0,0 +1,10 @@ +package v3; + +public class Main { + + public static void main(String[] args) { + Control c = new Control(); + c.start(); + } + +} \ No newline at end of file diff --git a/src/v4/draw/Draw.java b/src/v4/draw/Draw.java new file mode 100644 index 0000000..077c297 --- /dev/null +++ b/src/v4/draw/Draw.java @@ -0,0 +1,38 @@ +package v4.draw; + +import v4.game.Control; +import v4.gui.GUI; + +import javax.swing.*; +import java.awt.*; + +public class Draw extends JLabel { + + protected void paintComponent(Graphics g){ + super.paintComponent(g); + Graphics2D g2d = (Graphics2D) g; + + g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF); + + g.setColor(Color.RED); + g.drawRect(9 ,9, GUI.WIDTH + 2, GUI.HEIGHT + 2); + + repaint(); + + for (int x = 0; x < Control.CELLCOUNT; x++){ + for (int y = 0; y < Control.CELLCOUNT; y++){ + if (Control.cells[x][y]){ + g.setColor(Color.BLACK); + g.drawRect(x +GUI.XOFF, y + GUI.YOFF, 1, 1); + } else { + g.setColor(Color.WHITE); + g.drawRect(x +GUI.XOFF, y + GUI.YOFF, 1, 1); + } + } + } + + } + + + +} diff --git a/src/v4/game/Clock.java b/src/v4/game/Clock.java new file mode 100644 index 0000000..670dbcb --- /dev/null +++ b/src/v4/game/Clock.java @@ -0,0 +1,21 @@ +package v4.game; + +public class Clock extends Thread { + + public static boolean running = true; + + public void run(){ + + while (running){ + try { + sleep(50); + v4.game.Control.nextGen(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + + } + + } + +} diff --git a/src/v4/game/Control.java b/src/v4/game/Control.java new file mode 100644 index 0000000..3449f10 --- /dev/null +++ b/src/v4/game/Control.java @@ -0,0 +1,73 @@ +package v4.game; + +import java.util.concurrent.ThreadLocalRandom; + +public class Control { + + public static final int CELLCOUNT = 512; + public static boolean[][] cells = new boolean[CELLCOUNT][CELLCOUNT]; + + int startCells = 10000; + static int gen = 0; + + public void create(){ + for(int i = 0; i < startCells; i++){ + int x = rand(0, CELLCOUNT); + int y = rand(0, CELLCOUNT); + + cells[x][y] = true; + } + } + + public static void nextGen(){ + gen ++; + System.out.println("Generation:" + gen); + + for (int x = 0; x < CELLCOUNT; x++){ + for (int y = 0; y < CELLCOUNT; y++) { + int n = aliveNeigbours(x, y); + + if (n == 3 && !cells[x][y]){ + cells[x][y] = true; + } + + if (n < 2){ + cells[x][y] = false; + } + + if (n == 2 || n == 3){ + + } + + if (n > 3){ + cells[x][y] = false; + } + + } + } + } + + public static int aliveNeigbours(int x, int y){ + int count = 0; + + int[] xoff = {1, 1, 0, -1, -1, -1, 0, 1}; + int[] yoff = {0, 1, 1, 1, 0, -1, -1, -1}; + + for (int i = 0; i < 8; i++){ + try { + if (cells[x + xoff[i]][y + yoff[i]]){ + count ++; + } + } catch (Exception e) { + + } + } + + return count; + } + + public static int rand(int min, int max){ + return ThreadLocalRandom.current().nextInt(min, max); + } + +} diff --git a/src/v4/gui/GUI.java b/src/v4/gui/GUI.java new file mode 100644 index 0000000..5b4a78a --- /dev/null +++ b/src/v4/gui/GUI.java @@ -0,0 +1,31 @@ +package v4.gui; + +import v4.draw.Draw; + +import javax.swing.*; + +public class GUI { + + JFrame jf; + + public static Draw d; + + public static final int WIDTH = 512, HEIGHT = 512, XOFF = 10, YOFF = 10; + + public void create(){ + jf = new JFrame("Game of Live"); + jf.setSize(550, 570); + jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + jf.setLocationRelativeTo(null); + jf.setResizable(false); + + d = new Draw(); + d.setBounds(0, 0, 550, 570); + d.setVisible(true); + + jf.add(d); + + jf.setVisible(true); + } + +} diff --git a/src/v4/main/Main.java b/src/v4/main/Main.java new file mode 100644 index 0000000..c1364b6 --- /dev/null +++ b/src/v4/main/Main.java @@ -0,0 +1,20 @@ +package v4.main; + +import v4.game.Clock; +import v4.game.Control; +import v4.gui.GUI; + +public class Main { + + public static void main(String[] args) { + + GUI g = new GUI(); + Control c = new Control(); + Clock clk = new Clock(); + + c.create(); + g.create(); + clk.start(); + } + +} diff --git a/src/v5/draw/Draw.java b/src/v5/draw/Draw.java new file mode 100644 index 0000000..73f3c62 --- /dev/null +++ b/src/v5/draw/Draw.java @@ -0,0 +1,45 @@ +package v5.draw; + +import v4.gui.GUI; +import v5.game.Control; + +import javax.swing.*; +import java.awt.*; + +public class Draw extends JLabel { + + protected void paintComponent(Graphics g) { + super.paintComponent(g); + Graphics2D g2d = (Graphics2D) g; + + g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF); + + g.setColor(Color.RED); + g.drawRect(9 ,9, Control.CELLCOUNT_X + 1, Control.CELLCOUNT_Y + 1); + + + repaint(); + +// for (int x = 0; x < Control.CELLCOUNT_X; x++) { +// for (int y = 0; y < Control.CELLCOUNT_Y; y++) { +// if (Control.cells[x][y]) { +// g.setColor(Color.BLACK); +// g.fillRect(x + GUI.XOFF, y + GUI.YOFF, 1, 1); +// } +// } +// } + + + for (int x = 0; x < Control.CELLCOUNT_X; x++) { + for (int y = 0; y < Control.CELLCOUNT_X; y++) { + if (Control.cells[x][y]) { + g.setColor(Color.BLACK); + g.fillRect(x * 85 + GUI.XOFF, y * 85 + GUI.YOFF, 85, 85); + } else { + g.setColor(Color.WHITE); + g.fillRect(x * 85 + GUI.XOFF, y * 85 + GUI.YOFF, 85, 85); + } + } + } + } +} \ No newline at end of file diff --git a/src/v5/game/Clock.java b/src/v5/game/Clock.java new file mode 100644 index 0000000..becdb23 --- /dev/null +++ b/src/v5/game/Clock.java @@ -0,0 +1,27 @@ +package v5.game; + +import java.util.Timer; +import java.util.TimerTask; + +public class Clock extends Thread{ + + public static boolean running = true; + + public void start(){ + + Timer t = new Timer(); + TimerTask tt = new TimerTask() { + @Override + public void run() { + if (running){ + Control.nextGen(); + } + } + }; + + t.scheduleAtFixedRate(tt, 1, 1); + + } + +} + diff --git a/src/v5/game/Control.java b/src/v5/game/Control.java new file mode 100644 index 0000000..e3b5c0a --- /dev/null +++ b/src/v5/game/Control.java @@ -0,0 +1,109 @@ +package v5.game; + +import java.util.concurrent.ThreadLocalRandom; + +public class Control { + + public static final int CELLCOUNT_X = 6; + public static final int CELLCOUNT_Y = 6; + public static boolean[][] cells = new boolean[CELLCOUNT_X][CELLCOUNT_Y]; + public static boolean[][] newcells = new boolean[CELLCOUNT_X][CELLCOUNT_Y]; + + int startCells = 6; + static int gen = 0; + + + public void create(){ +// for(int i = 0; i < startCells; i++){ +// int x = rand(0, CELLCOUNT_X); +// int y = rand(0, CELLCOUNT_Y); +// +// cells[x][y] = true; +// } + + + for (int x = 0; x < 6; x++) { + for (int y = 0; y < 6; y++) { + cells[x][y] = false; + } + } + + cells[1][2] = true; + cells[2][2] = true; + cells[2][4] = true; + cells[3][1] = true; + cells[3][3] = true; + cells[4][3] = true; + + + for (int x = 0; x < CELLCOUNT_X; x++) { + for (int y = 0; y < CELLCOUNT_Y; y++) { + newcells[x][y] = cells[x][y]; + } + } + + } + + public static void nextGen(){ + gen ++; + System.out.println("Generation:" + gen); + + for (int x = 0; x < CELLCOUNT_X; x++){ + for (int y = 0; y < CELLCOUNT_Y; y++) { + int n = aliveNeigbours(x, y); + + if (n == 3 && !cells[x][y]){ + newcells[x][y] = true; + } + + if (n < 2){ + newcells[x][y] = false; + } + + if (n == 2 || n == 3){ + + } + + if (n > 3){ + newcells[x][y] = false; + } + + } + } + + for (int x = 0; x < CELLCOUNT_X; x++) { + for (int y = 0; y < CELLCOUNT_Y; y++) { + cells[x][y] = newcells[x][y]; + } + } + + } + + public static int aliveNeigbours(int x, int y){ + int count = 0; + + int[] xoff = {1, 1, 0, -1, -1, -1, 0, 1}; + int[] yoff = {0, 1, 1, 1, 0, -1, -1, -1}; + + for (int i = 0; i < 8; i++){ + try { + if (cells[x + xoff[i]][y + yoff[i]]){ + count ++; + } + } catch (Exception e) { + + } + } + + return count; + } + + public static int rand(int min, int max){ + return ThreadLocalRandom.current().nextInt(min, max); + } + + private void calcDimension(int cellsX, int cellsY){ + + } + +} diff --git a/src/v5/gui/ControlGUI.java b/src/v5/gui/ControlGUI.java new file mode 100644 index 0000000..ba7da78 --- /dev/null +++ b/src/v5/gui/ControlGUI.java @@ -0,0 +1,67 @@ +package v5.gui; + + +import javax.swing.*; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +public class ControlGUI { + + public static final int WIDTH = 512, HEIGHT = 512, XOFF = 10, YOFF = 10; + private JFrame jf; + + private JSlider gridSize; + private JLabel gridSizeLabel; + private JSlider startCells; + + private JButton start; + + public void create() { + jf = new JFrame("Game of Live"); + jf.setSize(305, 500); + jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + jf.setLayout(null); + jf.setLocationRelativeTo(null); + jf.setResizable(false); + + gridSize = new JSlider(6, 512); + gridSize.setBounds(50, 50, 150, 30); + gridSize.setValue(6); + gridSize.addChangeListener(new ChangeListener() { + @Override + public void stateChanged(ChangeEvent e) { + int value = gridSize.getValue(); + update(value); + } + }); + + gridSizeLabel = new JLabel("6"); + gridSizeLabel.setBounds(50, 30, 30, 30); + + startCells = new JSlider(); + startCells.setBounds(50, 100, 150, 30); + + start = new JButton("start"); + start.setBounds(0, 0, 50, 10); + start.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + + } + }); + + jf.add(start); + jf.add(gridSize); + jf.add(startCells); + jf.add(gridSizeLabel); + jf.setVisible(true); + } + + + private void update(int val){ + gridSizeLabel.setText(String.valueOf(val)); + } + +} diff --git a/src/v5/gui/GUI.java b/src/v5/gui/GUI.java new file mode 100644 index 0000000..ee3c7ab --- /dev/null +++ b/src/v5/gui/GUI.java @@ -0,0 +1,37 @@ +package v5.gui; + +import v5.draw.Draw; +import v5.game.Control; + +import javax.swing.*; +import java.awt.*; + +public class GUI { + + JFrame jf; + + public static Draw d; + + public static final int WIDTH = 512, HEIGHT = 512, XOFF = 10, YOFF = 10; + + + + public void create(){ + jf = new JFrame("Game of Live"); + + jf.getContentPane().setPreferredSize(new Dimension(Control.CELLCOUNT_X + 19, Control.CELLCOUNT_Y + 19)); + jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + + jf.setResizable(true); + + d = new Draw(); + d.setVisible(true); + + jf.add(d); + + jf.pack(); + jf.setLocationRelativeTo(null); + jf.setVisible(true); + } + +} diff --git a/src/v5/main/Main.java b/src/v5/main/Main.java new file mode 100644 index 0000000..41e1e75 --- /dev/null +++ b/src/v5/main/Main.java @@ -0,0 +1,26 @@ +package v5.main; + +import v5.game.Clock; +import v5.game.Control; +import v5.gui.ControlGUI; +import v5.gui.GUI; +import v5.draw.Draw; + +public class Main { + + public static void main(String[] args) { + +// ControlGUI controlGUI = new ControlGUI(); +// controlGUI.create(); + + Control control = new Control(); + GUI gui = new GUI(); + Clock clock = new Clock(); + + control.create(); + gui.create(); + clock.start(); + + } + +}