Java 康威生命游戏迭代不起作用

Java 康威生命游戏迭代不起作用,java,swing,multidimensional-array,jpanel,conways-game-of-life,Java,Swing,Multidimensional Array,Jpanel,Conways Game Of Life,我正试图与杰帕内尔一起制作康威的人生游戏的一个版本。 然而,当我尝试迭代/推进我的游戏时,它不起作用。首先我看到一个空白的白色屏幕5秒钟,然后我看到一个没有改变的黑色正方形。有人知道解决办法吗 这是我的密码: package newJAVart; import javax.swing.JFrame; import javax.swing.JPanel; import java.awt.*; import java.awt.Dimension; import java.awt.Graphics;

我正试图与杰帕内尔一起制作康威的人生游戏的一个版本。 然而,当我尝试迭代/推进我的游戏时,它不起作用。首先我看到一个空白的白色屏幕5秒钟,然后我看到一个没有改变的黑色正方形。有人知道解决办法吗

这是我的密码:

package newJAVart;

import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.*;
import java.awt.Dimension;
import java.awt.Graphics;
import java.lang.reflect.Array;
import java.util.Arrays;
import java.awt.*;
import java.applet.*;




import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class ConwayGame {

    static JPanel panel;
    static JFrame frame;

    static int[][] array = new int[40][40];
    public static void main(String[] args) throws InterruptedException {

          //Thread.sleep check if you can use it 
       array[5][5]  = 1;
       array[6][6]  = 1;
       //array[4][4] = 1;
       array[5][6] = 1;

        array[9][10] = 1;
       // System.out.println(Arrays.deepToString(array));
        //nextGeneration();
        //System.out.println(Arrays.deepToString(array));


        panel = new JPanel() {
            @Override
            public Dimension getPreferredSize() {
                return new Dimension(400, 400);
            }

            @Override
            protected void paintComponent(Graphics g) {
                super.paintComponent(g);
                int stop = 0;
                while(stop<10){

                //nextGeneration();
                //array[34][34]  = 1;

                try {
                    nextGeneration();
                    System.out.println(Arrays.deepToString(array));
                     drawArray(array, g);

                     stop++;

                     array[5][6] = 0;
                    Thread.sleep(200);


                    g.dispose();

                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                }


            }


        };


        frame = new JFrame();
        frame.add(panel);
        frame.pack();
        frame.setVisible(true);
    }

    /*
     * Creates the graphic for Conway's game of life.
     */







   //this finds the states of all the squares next to the given one and handle edge cases
    public static int nextTo(int a, int b){
        int sum = 0;
    //  for(int i)
        //if(a+1>array.length||)
        //this will handle edge cases
        int[] adjunc = new int[8];
        if(a==0||b==0||a==array.length-1||b==array.length-1){
            adjunc = new int[]{0,0,0,0,0,0,0,0};
        }else{
        /*
        if(a==array.length-1|| b == array.length-1){

            return nextTo(a-1,b-1);
        }else if(a==0){
  //adjunc = new int[]{array[a+1][b+1],array[a+1][b],array[a+1][b-1],array[a][b+1], 
        // array[array.length - 1 ][b-1],array[array.length -1 ][b],array[a-1][b+1],array[a][b-1]};
            //return nextTo(a-1,b-1);
            a = 
        }else if(b==0){
            adjunc = new int[]{array[a+1][b+1],array[a+1][b],array[a+1][b-1],array[a][b+1], 
                     array[a-1][b-1],array[a-1][b],array[a-1][b+1],array[a][b-1]};
        }else{
        */

            adjunc = new int[]{array[a+1][b+1],array[a+1][b],array[a+1][b-1],array[a][b+1], 
                     array[a-1][b-1],array[a-1][b],array[a-1][b+1],array[a][b-1]};  
        }

 //}
        for(int check: adjunc){
            if(check == 1){
            sum = sum +1;
            }
        }

        return sum ;
    }

    public static void nextGeneration(){
        int[][] grid = new int[40][40];
        for(int i=0;i<array.length-2;++i){
            for(int j=0;j<array[0].length-2;++j){
                //heres my error nexTo is being called on eveything including side elements
                int stuff = nextTo(i,j);
                if(array[i][j] ==1 && stuff < 2){
                    System.out.println("This is running");
   //Any live cell with fewer than two live neighbors dies,as if caused by under-population
                    if(i==34){
                        System.out.println("This is number 34");
                    }
                    grid[i][j] = 0;
                }else if(array[i][j]==1 && stuff>3){
                    System.out.println("This is running2");
                    grid[i][j] = 0;
                }
                else if(array[i][j] == 0 && stuff ==3){
                    System.out.println("This is running3");
                    grid[i][j] = 1;

                }
            }

        }
        array = grid;



    }










    /*
     * else if(array[i][j]==1 && (stuff<4 || stuff >2)){



                }
     * 
     */











 //draws Array    in JPanel
    public static void drawArray(int[][] array, Graphics g) {
        int BOX_DIM = 10;
        for (int i = 0; i < array.length; i++) {
            for (int j = 0; j < array[0].length; j++) {
                g.drawRect(i * BOX_DIM, j * BOX_DIM, 10, 10);
                if (array[i][j] == 0) {
                    g.setColor(Color.WHITE);
                    g.fillRect(i * BOX_DIM, j * BOX_DIM, 10, 10);
                }
                if (array[i][j] == 1) {
                    g.setColor(Color.BLACK);
                    g.fillRect(i * BOX_DIM, j * BOX_DIM, 10, 10);
                }
            }
        }

    }
}
package-newJAVart;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入java.awt.*;
导入java.awt.Dimension;
导入java.awt.Graphics;
导入java.lang.reflect.Array;
导入java.util.array;
导入java.awt.*;
导入java.applet.*;
导入java.awt.Color;
导入java.awt.Container;
导入java.awt.Dimension;
导入java.awt.Graphics;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
公共类康威游戏{
静态JPanel面板;
静态JFrame;
静态int[][]数组=新int[40][40];
公共静态void main(字符串[]args)引发InterruptedException{
//Thread.sleep检查您是否可以使用它
数组[5][5]=1;
数组[6][6]=1;
//数组[4][4]=1;
数组[5][6]=1;
数组[9][10]=1;
//System.out.println(array.deepToString(array));
//下一代();
//System.out.println(array.deepToString(array));
panel=newjpanel(){
@凌驾
公共维度getPreferredSize(){
返回新维度(400400);
}
@凌驾
受保护组件(图形g){
超级组件(g);
int stop=0;

虽然(停止所有的迭代和绘制,等待发生在paintComponent中-因此,阻止UI实际显示它。你应该想办法一次进行一次迭代,让paintComponent绘制当前迭代,而外部线程执行等待和游戏处理。


基本上,除去drawArray()之外的所有从paintComponent开始,在其他地方执行其余操作-一旦一次迭代完成,就会在EDT中触发重新绘制。

所有的迭代和绘制以及等待都发生在paintComponent中-因此,会阻止用户界面实际显示它。你应该想办法一次执行一次迭代,可能只是当外部线程执行等待和游戏处理时,绘制当前迭代


基本上,从paintComponent中删除除drawArray()以外的所有内容,并在其他地方执行其余操作-一旦完成一次迭代,就会触发EDT中的重新绘制。

这是我之前提出的关于使用JPanel Graphics的问题这是我之前提出的关于使用JPanel Graphics的问题