4

Conway's Game of Life の実装を終えたところです。世代の進歩を視覚化する良い方法は何でしょうか。これまでのところ、単純な print ステートメントがあります。

        System.out.println();
        for (int j= 0; j < n; j++){
            for (int k= 0; k < n; k++){
                System.out.print(board[j][k] + "\t");
            }
            System.out.print("\n");
        }

これはテストには問題ありませんが、いくつかの複雑な構造を見たいと思っています。私の質問は次のとおりです。ビジュアライゼーションをどのように進める必要がありますか? ある種の GUI を構築できるかもしれません (ただし、これは行っていません)。

アルゴリズムを構築する方法の一般的な考え方は次のとおりです。

    int i= 0;
    while (i < 3){
        int[][] temp= board;
        for (int j= 0; j < n; j++){
            for (int k= 0; k < n; k++){
                //Update temp array according to Conway's rules. 
            }
        }
        board= temp;
        i++;
        //Print statements
    }

だから、私の正確な質問は次のとおりです。これから GUI を構築するにはどうすればよいですか?

4

2 に答える 2

5

私は何年も前からこれに触れていませんでした。ここに私のJavaでの実装があります。これは楽しかったです。

基本的に、生きた細胞を 4x4 の赤い四角で描くだけです。update メソッドには、最適化できる if テストがいくつかありますが、パフォーマンスの向上はごくわずかだと思います。以下のコードでは、値が 1 のタイルは生きており、0 は死んでいます。

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.Transient;
import java.util.Random;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;


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

    private int[][] grid;
    private static final Random rnd = new Random();
    private int generationCounter;

    public ConwaysGameOfLife(int width, int height) {
        this.grid = new int[width / 4][height / 4];
        setupGrid();
    }

    private void setupGrid() {
        for (int[] row : grid) {
            for (int j = 0; j < row.length; j++) {
                if (rnd.nextDouble() < 0.92)
                    continue;
                row[j] = rnd.nextInt(2);
            }
        }
    }

    public void updateGrid() {
        for (int i = 0; i < grid.length; i++) {
            for (int j = 0; j < grid[i].length; j++) {
                applyRule(i, j);
            }
        }
    }


    private void applyRule(int i, int j) {
        int left = 0, right = 0, up = 0, down = 0;
        int dUpperLeft = 0, dUpperRight = 0, dLowerLeft = 0, dLowerRight = 0;

        if (j < grid.length - 1) {
            right = grid[i][j + 1];
            if(i>0)
                dUpperRight = grid[i - 1][j + 1];
            if (i < grid.length - 1)
                dLowerRight = grid[i + 1][j + 1];
        }

        if (j > 0) {
            left = grid[i][j - 1];
            if (i > 0)
                dUpperLeft = grid[i - 1][j - 1];
            if (i< grid.length-1)
                dLowerLeft = grid[i + 1][j - 1];
        }

        if (i > 0)
            up = grid[i - 1][j];
        if (i < grid.length - 1)
            down = grid[i + 1][j];

        int sum = left + right + up + down + dUpperLeft + dUpperRight
                + dLowerLeft
                + dLowerRight;

        if (grid[i][j] == 1) {
            if (sum < 2)
                grid[i][j] = 0;
            if (sum > 3)
                grid[i][j] = 0;
        }

        else {
            if (sum == 3)
                grid[i][j] = 1;
        }

    }

    @Override
    @Transient
    public Dimension getPreferredSize() {
        return new Dimension(grid.length * 4, grid[0].length * 4);
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Color gColor = g.getColor();

        g.drawString("Generation: " + generationCounter++, 0, 10);
        for (int i = 0; i < grid.length; i++) {
            for (int j = 0; j < grid[i].length; j++) {
                if (grid[i][j] == 1) {
                    g.setColor(Color.red);
                    g.fillRect(j * 4, i * 4, 4, 4);
                }
            }
        }

        g.setColor(gColor);
    }

    public static void main(String[] args) {
        final ConwaysGameOfLife c = new ConwaysGameOfLife(800, 800);
        JFrame frame = new JFrame();
        frame.getContentPane().add(c);
        frame.pack();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
        new Timer(100, new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                c.updateGrid();
                c.repaint();
            }
        }).start();
    }
}

このような素敵なパターンを一度に取得することができました ここに画像の説明を入力

于 2013-11-14T08:12:32.983 に答える
1

GUI について: 私が学校にいたとき、私たちは人生のゲームも実装し、簡単な GUI を作成しましたが、それは面白くて良い練習になりました。ある種の「カードレイアウト」を作成し、さまざまな色のシンプルで小さな画像を使用して生命オブジェクトを配置しました。(色 = オブジェクトの状態)。それを視覚化する簡単な方法です。さらに、オブジェクトが隣接するオブジェクトに応じてどのように変化するかを明確に確認できます。

誰かがGUIを実装した素敵なスレッドを見つけました(スクリーンショット付き)。これは完全なコードではありませんが、その方法の手がかりが得られるかもしれません。

于 2013-11-14T08:09:28.273 に答える