Hi, ich habe irgendwie ein selstsames Problem.
Ich werte Boolen-Array-Array Daten aus, wegen Conways Game of Life, wenn ihrs kennt.
Doch irgendwie kommen ganz seltsame ergebnisse raus, und nichts funktioniert, warum?
Hier mal mein Code:
Wenn ich aber jetzt um die Stelle 4 einstelle, dass alle nachbarn(also alle 8) true sind, und die stelle 4|4 auch true ist, dann wird leider nur folgendes ausgegeben
false false false
false true true
false true true
Warum?
Das widerspricht doch jeglicher Logik, bitte kann mir einer helfen?
Danke,
m.f.G. Developer_X
Ich werte Boolen-Array-Array Daten aus, wegen Conways Game of Life, wenn ihrs kennt.
Doch irgendwie kommen ganz seltsame ergebnisse raus, und nichts funktioniert, warum?
Hier mal mein Code:
Java:
package main;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
@SuppressWarnings("serial")
public class GameOfLife extends JInternalFrame
{
// Attributes
Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
boolean[][] originalUniverseArea, actualUniverseArea;
// Constructor
public GameOfLife()
{
setTitle("Conways Game of Life ");
setSize(d.width/2,d.width/2);
setClosable(true);
setResizable(true);
addComponents();
setVisible(true);
askInformation();
}
// Methods
public void addComponents()
{
setLayout(new BorderLayout());
JPanel mainPanel = new JPanel();
add(mainPanel);
mainPanel.setLayout(new BoxLayout(mainPanel,BoxLayout.Y_AXIS));
JPanel panel = new JPanel()
{
public void paintComponent(Graphics gr)
{
Graphics2D g = (Graphics2D)gr;
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
int width = getSize().width;
int height = getSize().height;
if(actualUniverseArea!=null)
{
for(int y = 0;y<actualUniverseArea.length;y++)
{
for(int x = 0;x<actualUniverseArea.length;x++)
{
if(actualUniverseArea[x][y])
{
g.setPaint(new GradientPaint(0,0,new Color(0,255,0),0,height,new Color(0,100,0)));
}
else
{
g.setColor(Color.black);
}
g.fillRect(width/actualUniverseArea.length*x, height/actualUniverseArea.length*y, width/actualUniverseArea.length, height/actualUniverseArea.length);
}
}
g.setColor(Color.darkGray);
for(int x = 0;x<width;x+=width/actualUniverseArea.length)
g.drawLine(x,0,x,height);
for(int y = 0;y<height;y+=height/actualUniverseArea.length)
g.drawLine(0,y,width,y);
}
}
};
mainPanel.add(panel,"Center");
JMenuBar bar = new JMenuBar();
mainPanel.add(bar,"South");
JButton reset = new JButton("Reset");
bar.add(reset);
reset.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent arg0)
{
reset();
repaint();
}
});
JButton next = new JButton("Nächster Schritt");
bar.add(next);
next.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent arg0)
{
next();
repaint();
}
});
}
public void askInformation()
{
//Custom button text
Object[] options = {"10x10",
"50x50",
"100x100"};
int n = JOptionPane.showOptionDialog(this,"Welche Feldgröße möchten Sie gerne haben?","Feldgrößen Abfrage",JOptionPane.YES_NO_CANCEL_OPTION,JOptionPane.QUESTION_MESSAGE,null, options, options[2]);
if(n == 0)
{
originalUniverseArea = new boolean[10][10];
actualUniverseArea = new boolean[10][10];
}
else if(n==1)
{
originalUniverseArea = new boolean[50][50];
actualUniverseArea = new boolean[50][50];
}
else if(n==2)
{
originalUniverseArea = new boolean[100][100];
actualUniverseArea = new boolean[100][100];
}
else
{
setVisible(false);
}
final JDialog dialogFrame = new JDialog();
dialogFrame.setTitle("Bitte Selektierte Kästchen angeben");
JPanel dialog = new JPanel();
dialog.setLayout(new BoxLayout(dialog,BoxLayout.Y_AXIS));
dialogFrame.add(dialog);
JPanel cbPanel = new JPanel();
cbPanel.setLayout(new GridLayout(originalUniverseArea.length,originalUniverseArea.length));
final JCheckBox[][] boxes = new JCheckBox[originalUniverseArea.length][originalUniverseArea.length];
for(int x = 0;x<boxes.length;x++)
{
for(int y = 0;y<boxes.length;y++)
{
boxes[y][x] = new JCheckBox("",false);
cbPanel.add(boxes[y][x]);
}
}
dialog.add(new JScrollPane(cbPanel));
JButton accept = new JButton("Bestätigen");
dialog.add(accept);
accept.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent arg0)
{
dialogFrame.setVisible(false);
for(int x = 0;x<originalUniverseArea.length;x++)
{
for(int y = 0;y<originalUniverseArea.length;y++)
{
originalUniverseArea[x][y] = boxes[x][y].isSelected();
actualUniverseArea[x][y] = boxes[x][y].isSelected();
}
}
repaint();
}
});
dialogFrame.setSize(400, 420);
dialogFrame.setVisible(true);
}
public void reset()
{
actualUniverseArea = originalUniverseArea;
}
public void next()
{
boolean[][] oldUniverseArea = actualUniverseArea;
boolean[][] newUniverseArea = actualUniverseArea;
for(int y = 1;y<actualUniverseArea.length-1;y++)
{
for(int x = 1;x<actualUniverseArea.length-1;x++)
{
int neighbours = 0;
if(x==4&&y==4)
{
System.out.println(actualUniverseArea[x-1][y-1]+" "+actualUniverseArea[x][y-1]+" "+actualUniverseArea[x+1][y-1]);
System.out.println(actualUniverseArea[x-1][y]+" "+actualUniverseArea[x][y]+" "+actualUniverseArea[x+1][y]);
System.out.println(actualUniverseArea[x-1][y+1]+" "+actualUniverseArea[x][y+1]+" "+actualUniverseArea[x+1][y+1]);
}
if(neighbours==2)
{
if(oldUniverseArea[x][y])
newUniverseArea[x][y] = true;
}
if(neighbours==3)
{
newUniverseArea[x][y] = true;
}
else
{
newUniverseArea[x][y] = false;
}
}
}
actualUniverseArea = newUniverseArea;
}
}
Wenn ich aber jetzt um die Stelle 4 einstelle, dass alle nachbarn(also alle 8) true sind, und die stelle 4|4 auch true ist, dann wird leider nur folgendes ausgegeben
false false false
false true true
false true true
Warum?
Das widerspricht doch jeglicher Logik, bitte kann mir einer helfen?
Danke,
m.f.G. Developer_X