Как я могу нарисовать клеточный автомат - PullRequest
0 голосов
/ 08 октября 2019

Я выполняю упражнение по клеточному автомату в Java, и я столкнулся с проблемой.

Логическая часть CA работает нормально, если бы я хотел, чтобы она была размещена на консоли, она была бы готова,но я хочу, чтобы это было нарисовано на панели, когда 1 рисует черный квадрат, когда 0 рисует белый квадрат

Давайте перейдем к проблеме

Что происходит, так это то, чтовся логика работает нормально, но когда рисование java рисует только СА последнего поколения, я прочитал, что java paintComponent работает только тогда, когда решает java, а не когда он вызывается.

Мой вопрос: каклучший способ решить эту проблему и как это сделать.

Я думал о некоторых вещах, но так как я не очень хорошо знаю Java, я решил спросить вас

Iдумал о том, возможно, сохранить все массивы в один и затем рисовать из него (но я не знаю, как я мог это сделать), я подумал, может быть, есть метод рисования в каждом цикле, но я не нашел его (я использовал перекрасить() но это былобесполезно)

В любом случае, я был бы признателен, если бы кто-нибудь дал мне решение, у меня есть эта проблема в течение нескольких дней, и я не нашел решение, ниже весь код

import java.awt.BorderLayout;

import javax.swing.JFrame;    
import javax.swing.SwingUtilities;

@SuppressWarnings("serial")
public class CA extends JFrame {

    Rules rules = new Rules();

    public CA() {
        super("Cellular Automaton");
        setLayout(new BorderLayout());
        add(new GUI_CA(), BorderLayout.CENTER);
        pack();
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
        setVisible(true);

    }

    public static void main(String[] args) {

        SwingUtilities.invokeLater(new Runnable() {

            public void run() {
                new CA();
            }   
        }); 
      }
    }
}
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.util.Arrays;

import javax.swing.BorderFactory;
import javax.swing.JPanel;    

@SuppressWarnings("serial")
public class GUI_CA extends JPanel {

    int cellSize = 10;

    Rules rules = new Rules();

    private BufferedImage img;
    private Graphics2D g2d;

    public GUI_CA() {

        img =  new BufferedImage(cellSize, cellSize, BufferedImage.TYPE_INT_RGB);
        g2d = (Graphics2D) img.createGraphics();

        evolution();    
    }

    public void evolution() {
        rules.cells = new int[987/cellSize];
        rules.cells[rules.cells.length/2] = 1;
        System.out.println(Arrays.toString(rules.cells));
        for (int generationCount = 0; generationCount < 10; generationCount++) {
            rules.generate();
            System.out.println(Arrays.toString(rules.cells));
            repaint();
        }           
    }

    public void drawCA(Graphics g) {

        Graphics2D g2d = (Graphics2D) g;

        for (int i = 1; i < rules.cells.length -1; i++) {

            if (rules.cells[i] == 1) {
                g2d.setColor(Color.BLACK);
                g2d.fillRect(i * cellSize, rules.generation * 5, cellSize, cellSize);
                System.out.println(Arrays.toString(rules.cells));
            }else {
                g2d.setColor(Color.WHITE);
                g2d.fillRect(i * cellSize, rules.generation * 5, cellSize, cellSize);
            }
        }


    }

    public void drawBackground(Graphics g) {

        Graphics2D g2d = (Graphics2D) g;

        int width = 987;
        int height = 545;

        g2d.setPaint(Color.WHITE);
        g2d.fillRect(0, 0, width, height);
    }

    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        drawBackground(g);
        drawCA(g);
        g.drawImage(img, 0, 0, null);

    }

    public Dimension getPreferredSize() {
        return new Dimension(987, 545);
    }

}
public class Rules {

    int[] cells;
    int[] ruleSet = new int[] {0, 1, 1, 1, 1, 0, 0, 0};
    //int cellSize = 10;
    int generation = 0;


    void generate() {

        int[] nextGeneration = new int[cells.length];

        for (int i = 1; i < cells.length - 1; i++) {

            int left = cells[i - 1];
            int me = cells[i];
            int right = cells [i + 1];

            nextGeneration[i] = rules(left, me, right);
        }
        cells = nextGeneration;
        generation++;

    }

    int rules(int left, int me, int right) {
        String s = "" + left + me + right;
        int index = Integer.parseInt(s, 2);
        //System.out.println(index);
        return ruleSet[index];      
    }
}

1 Ответ

0 голосов
/ 08 октября 2019

Программирование GUI отличается от программирования консоли, потому что вы должны использовать систему событий вместо просто цикла while, чтобы повторить задачу, которая генерирует вывод. Я предлагаю вам начать с добавления кнопки, которую пользователь нажимает, чтобы перейти к следующему поколению автомата. Когда вы начнете работать, вы можете сделать еще один шаг, чтобы добавить таймер, который автоматически перейдет к следующему поколению через определенное время.

...