Java 康威生命游戏迭代不起作用
我正试图与杰帕内尔一起制作康威的人生游戏的一个版本。 然而,当我尝试迭代/推进我的游戏时,它不起作用。首先我看到一个空白的白色屏幕5秒钟,然后我看到一个没有改变的黑色正方形。有人知道解决办法吗 这是我的密码: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;
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的问题