Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
可视化康威';Java中的生活游戏(可能使用GUI)?_Java_User Interface - Fatal编程技术网

可视化康威';Java中的生活游戏(可能使用GUI)?

可视化康威';Java中的生活游戏(可能使用GUI)?,java,user-interface,Java,User Interface,我刚刚完成了。我想知道什么是一个很好的方式来可视化的一代人的进步。到目前为止,我有一个简单的打印声明: 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

我刚刚完成了。我想知道什么是一个很好的方式来可视化的一代人的进步。到目前为止,我有一个简单的打印声明:

        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");
        }
System.out.println();
对于(int j=0;j
这对于测试来说是可以的,但是我真的希望看到一些复杂的结构。我的问题是:我应该如何推进可视化?也许我可以构建某种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
    }
inti=0;
而(i<3){
int[][]温度=电路板;
对于(int j=0;j

所以,我的确切问题是:如何用它构建GUI

gui:我在学校的时候,我们还实现了生活游戏,我们制作了一个简单的gui,但它很有趣,也是一个很好的实践。我们创造了一种“卡片布局”,用不同颜色的简单、小图像将生活对象放入其中。(颜色=对象的状态)。这是一个简单的可视化方法。此外,您可以清楚地看到对象是如何根据其邻居而变化的


刚刚发现了一个不错的,有人还实现了一个gui(带有屏幕截图)。这不是完整的代码,但您可能会知道如何做。

很久以前我就没有接触过这一点,这是我用java实现的,很有趣

基本上我只是把活细胞画成4x4个红色方块。更新方法有一些可以优化的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();
    }
}
导入java.awt.Color;
导入java.awt.Dimension;
导入java.awt.Graphics;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.beans.Transient;
导入java.util.Random;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入javax.swing.Timer;
@抑制警告(“串行”)
公共类ConwaysGameOfLife扩展JPanel{
私有int[][]网格;
私有静态最终随机rnd=新随机();
专用整数生成计数器;
公共通道生活模式(内部宽度、内部高度){
this.grid=新整数[width/4][height/4];
setupGrid();
}
私有void setupGrid(){
对于(int[]行:网格){
对于(int j=0;j0)
dUpperRight=网格[i-1][j+1];
如果(i<网格长度-1)
dLowerRight=栅格[i+1][j+1];
}
如果(j>0){
左=网格[i][j-1];
如果(i>0)
dUpperLeft=网格[i-1][j-1];
如果(i<网格长度-1)
dLowerLeft=网格[i+1][j-1];
}
如果(i>0)
向上=网格[i-1][j];
如果(i<网格长度-1)
向下=网格[i+1][j];
整数和=左+右+上+下+左+右
+德洛维夫特
+德洛维莱特;
如果(网格[i][j]==1){
如果(总和<2)
网格[i][j]=0;
如果(总和>3)
网格[i][j]=0;
}
否则{
如果(总和=3)
网格[i][j]=1;
}
}
@凌驾
@短暂的
公共维度getPreferredSize(){
返回新维度(grid.length*4,grid[0].length*4);
}
@凌驾
受保护组件(图形g){
超级组件(g);
Color gColor=g.getColor();
g、 抽绳(“生成:+generationCounter++,0,10);
对于(int i=0;i
一次成功地得到了这样一个漂亮的图案

哦,谢谢你。我会查出来的@ButtingerXaver将其作为一个答案发布。这里是。是的,尽管爆炸性增长有点令人担忧,希望有一些好的孤独生命形式,但我认为这需要一个调整,如果一个细胞被更新,它的邻居直到下一代才看到它的新状态。我认为你的GoL实现是错误的。它不会产生人们期望在GoL中看到的模式类型-例如,没有“步行者”。检查我对你说的话