Hey Leute,
zu aller erst, ich hoffe ich bin in der richtigen Kathegorie, falls nicht, bitte verschieben !
Also zu meinem Problem :
ich versuche gerade Conways Spiel des Lebens in Java umzusetzt (einfach so zur Übung ).
ein einer Klasse erzeuge ich eine ArrayList<ArrayList<Boolean>>, um eine 2Dimensionale ArrayList zu haben.
So weit funktioniert es auch noch.
Später möchte ich dann auf diese ArrayList zugreifen, sie hat aber den Wert null (und das, obwohl ich sie im constructor erzeugt und ihr Werte zugewiesen habe)
Ich verstehe nicht warum. Könntet Ihr mir helfen, den Fehler zu suchen ?
Der erste Teil, zum Erstellen der Oberfläche :
[Java]
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
public class oberflaeche {
JFrame frm;
Zeichen rst ;
spieldeslebens sdl ;
public class Zeichen extends JPanel {
private ArrayList<ArrayList<Color>> farben;
private int anzahl_breite;
private int anzahl_hoehe;
private int abstand = 10;
public Zeichen(int breite, int hoehe, ArrayList<ArrayList<Color>> farben) {
anzahl_breite = breite;
anzahl_hoehe = hoehe;
this.farben = farben;
}
public void setFarben(ArrayList<ArrayList<Color>> farben) {
this.farben = farben;
}
public void replaceColor(int x, int y, Color newcolor) {
y--;
x--;
ArrayList<Color> zwiarr = farben.get(x);
zwiarr.set(y, newcolor);
farben.set(x, zwiarr);
}
public void paintComponent(Graphics g) {
int h = getSize().height;
int b = getSize().width;
int optimale_breite = Math.round((b - (anzahl_breite * abstand))
/ anzahl_breite);
int optimale_hoehe = Math.round((h - (anzahl_hoehe * abstand))
/ anzahl_hoehe);
// System.out.println("" + h + "|" + b + "|" + optimale_breite);
for (int i = 0; i < anzahl_breite; i++) {
int posX = (optimale_breite * i + abstand * i);
for (int j = 0; j < anzahl_hoehe; j++) {
int posY = (optimale_hoehe * j + abstand * j);
// System.out.println(""+posX);
g.setColor(farben.get(i).get(j));
g.fillRect(posX, posY, optimale_breite, optimale_hoehe);
}
}
}
}
public class naechsteRundeKlick implements ActionListener {
@Override
public void actionPerformed(ActionEvent arg0) {
rst.setFarben(sdl.eineRunde());
rst.repaint();
}
}
static public void main(String arg[]) {
oberflaeche of = new oberflaeche();
of.zeichnen();
}
public void zeichnen() {
int breite = 10 ;
int hoehe = 10 ;
frm = new JFrame();
frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frm.setSize(500, 500);
Button btn = new Button("eine Runde weiter");
btn.addActionListener(new naechsteRundeKlick());
sdl = new spieldeslebens(breite, hoehe);
/* sdl.replaceZelle(2, 2, true);
sdl.replaceZelle(2, 3, true);
sdl.replaceZelle(2, 4, true);
sdl.replaceZelle(1, 2, true);
sdl.replaceZelle(3, 2, true);
sdl.replaceZelle(4, 4, true);
sdl.replaceZelle(4, 5, true);*/
rst = new Zeichen(breite, hoehe, sdl.returnColorArray());
frm.add(BorderLayout.EAST,btn);
frm.add(BorderLayout.CENTER, rst);
frm.setVisible(true);
}
}
[/Java]
Der Zweite Teil mit dem Objekt, dass über das Leben und Sterben der Zelle wacht :
[Java]
import java.awt.*;
import java.util.*;
public class spieldeslebens {
private ArrayList<ArrayList<Boolean>> zellen;
private int breite;
private int hoehe;
public spieldeslebens(int breite, int hoehe) {
this.breite = breite;
this.hoehe = hoehe;
ArrayList<ArrayList<Boolean>> zellen = new ArrayList<ArrayList<Boolean>>();
for (int i = 0; i < hoehe; i++) {
ArrayList<Boolean> zwiar = new ArrayList<Boolean>();
for (int j = 0; j < breite; j++) {
zwiar.add(false);
}
zellen.add(zwiar);
}
System.out.println(zellen.toString()); // hier hat zelle noch Werte .. ( also ist : zelle != null)
System.out.println(""+zellen.size() + "|" + zellen.get(3).size());
}
public spieldeslebens(int breite, int hoehe,
ArrayList<ArrayList<Boolean>> zellen) {
this.breite = breite;
this.hoehe = hoehe;
this.zellen = zellen;
}
public void replaceZelle(int x, int y, boolean neuerwert) {
y--;
x--;
ArrayList<Boolean> zwiarr = zellen.get(x);
zwiarr.set(y, neuerwert);
zellen.set(x, zwiarr);
}
public ArrayList<ArrayList<Color>> returnColorArray(){
ArrayList<ArrayList<Color>> result = new ArrayList<ArrayList<Color>>();
for (ArrayList<Boolean> i : zellen) { // Hier ist Zelle = null => Fehlermeldung
ArrayList<Color> zwifararr = new ArrayList<Color>();
for (Boolean boo : i) {
if (boo) {
zwifararr.add(Color.blue);
} else {
zwifararr.add(Color.black);
}
}
result.add(zwifararr);
}
return result ;
}
public ArrayList<ArrayList<Color>> eineRunde() {
naechsteRunde();
return returnColorArray();
}
private int getLebendeNachbarn(int x, int y) {
int result = 0;
for (int xi = x - 1; xi < x + 1; xi++) {
if (!(xi < 0) && (xi != x)) {
for (int yi = y - 1; yi < y + 1; y++) {
if (!(yi < 0) && (yi != y)) {
if (zellen.get(xi).get(yi) == true) {
result++;
}
}
}
}
}
return result;
}
private void naechsteRunde() {
ArrayList<ArrayList<Boolean>> result = new ArrayList<ArrayList<Boolean>>();
for(int x = 0; x<zellen.size();x++){
ArrayList<Boolean> zwiarr = new ArrayList<Boolean>();
for(int y = 0; y < zellen.get(x).size();y++){
int lebendeNachbarn = getLebendeNachbarn(x,y);
boolean ergebnis = false ;
if(zellen.get(x).get(y)){
if((lebendeNachbarn<2) || (lebendeNachbarn > 3)) {
ergebnis = false ;
} else {
ergebnis = true ;
}
}else {
if(lebendeNachbarn == 3){
ergebnis = true ;
} else {
ergebnis = false ;
}
}
zwiarr.add(ergebnis);
}
result.add(zwiarr);
}
zellen = result ;
}
}
[/Java]
zu aller erst, ich hoffe ich bin in der richtigen Kathegorie, falls nicht, bitte verschieben !
Also zu meinem Problem :
ich versuche gerade Conways Spiel des Lebens in Java umzusetzt (einfach so zur Übung ).
ein einer Klasse erzeuge ich eine ArrayList<ArrayList<Boolean>>, um eine 2Dimensionale ArrayList zu haben.
So weit funktioniert es auch noch.
Später möchte ich dann auf diese ArrayList zugreifen, sie hat aber den Wert null (und das, obwohl ich sie im constructor erzeugt und ihr Werte zugewiesen habe)
Ich verstehe nicht warum. Könntet Ihr mir helfen, den Fehler zu suchen ?
Der erste Teil, zum Erstellen der Oberfläche :
[Java]
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
public class oberflaeche {
JFrame frm;
Zeichen rst ;
spieldeslebens sdl ;
public class Zeichen extends JPanel {
private ArrayList<ArrayList<Color>> farben;
private int anzahl_breite;
private int anzahl_hoehe;
private int abstand = 10;
public Zeichen(int breite, int hoehe, ArrayList<ArrayList<Color>> farben) {
anzahl_breite = breite;
anzahl_hoehe = hoehe;
this.farben = farben;
}
public void setFarben(ArrayList<ArrayList<Color>> farben) {
this.farben = farben;
}
public void replaceColor(int x, int y, Color newcolor) {
y--;
x--;
ArrayList<Color> zwiarr = farben.get(x);
zwiarr.set(y, newcolor);
farben.set(x, zwiarr);
}
public void paintComponent(Graphics g) {
int h = getSize().height;
int b = getSize().width;
int optimale_breite = Math.round((b - (anzahl_breite * abstand))
/ anzahl_breite);
int optimale_hoehe = Math.round((h - (anzahl_hoehe * abstand))
/ anzahl_hoehe);
// System.out.println("" + h + "|" + b + "|" + optimale_breite);
for (int i = 0; i < anzahl_breite; i++) {
int posX = (optimale_breite * i + abstand * i);
for (int j = 0; j < anzahl_hoehe; j++) {
int posY = (optimale_hoehe * j + abstand * j);
// System.out.println(""+posX);
g.setColor(farben.get(i).get(j));
g.fillRect(posX, posY, optimale_breite, optimale_hoehe);
}
}
}
}
public class naechsteRundeKlick implements ActionListener {
@Override
public void actionPerformed(ActionEvent arg0) {
rst.setFarben(sdl.eineRunde());
rst.repaint();
}
}
static public void main(String arg[]) {
oberflaeche of = new oberflaeche();
of.zeichnen();
}
public void zeichnen() {
int breite = 10 ;
int hoehe = 10 ;
frm = new JFrame();
frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frm.setSize(500, 500);
Button btn = new Button("eine Runde weiter");
btn.addActionListener(new naechsteRundeKlick());
sdl = new spieldeslebens(breite, hoehe);
/* sdl.replaceZelle(2, 2, true);
sdl.replaceZelle(2, 3, true);
sdl.replaceZelle(2, 4, true);
sdl.replaceZelle(1, 2, true);
sdl.replaceZelle(3, 2, true);
sdl.replaceZelle(4, 4, true);
sdl.replaceZelle(4, 5, true);*/
rst = new Zeichen(breite, hoehe, sdl.returnColorArray());
frm.add(BorderLayout.EAST,btn);
frm.add(BorderLayout.CENTER, rst);
frm.setVisible(true);
}
}
[/Java]
Der Zweite Teil mit dem Objekt, dass über das Leben und Sterben der Zelle wacht :
[Java]
import java.awt.*;
import java.util.*;
public class spieldeslebens {
private ArrayList<ArrayList<Boolean>> zellen;
private int breite;
private int hoehe;
public spieldeslebens(int breite, int hoehe) {
this.breite = breite;
this.hoehe = hoehe;
ArrayList<ArrayList<Boolean>> zellen = new ArrayList<ArrayList<Boolean>>();
for (int i = 0; i < hoehe; i++) {
ArrayList<Boolean> zwiar = new ArrayList<Boolean>();
for (int j = 0; j < breite; j++) {
zwiar.add(false);
}
zellen.add(zwiar);
}
System.out.println(zellen.toString()); // hier hat zelle noch Werte .. ( also ist : zelle != null)
System.out.println(""+zellen.size() + "|" + zellen.get(3).size());
}
public spieldeslebens(int breite, int hoehe,
ArrayList<ArrayList<Boolean>> zellen) {
this.breite = breite;
this.hoehe = hoehe;
this.zellen = zellen;
}
public void replaceZelle(int x, int y, boolean neuerwert) {
y--;
x--;
ArrayList<Boolean> zwiarr = zellen.get(x);
zwiarr.set(y, neuerwert);
zellen.set(x, zwiarr);
}
public ArrayList<ArrayList<Color>> returnColorArray(){
ArrayList<ArrayList<Color>> result = new ArrayList<ArrayList<Color>>();
for (ArrayList<Boolean> i : zellen) { // Hier ist Zelle = null => Fehlermeldung
ArrayList<Color> zwifararr = new ArrayList<Color>();
for (Boolean boo : i) {
if (boo) {
zwifararr.add(Color.blue);
} else {
zwifararr.add(Color.black);
}
}
result.add(zwifararr);
}
return result ;
}
public ArrayList<ArrayList<Color>> eineRunde() {
naechsteRunde();
return returnColorArray();
}
private int getLebendeNachbarn(int x, int y) {
int result = 0;
for (int xi = x - 1; xi < x + 1; xi++) {
if (!(xi < 0) && (xi != x)) {
for (int yi = y - 1; yi < y + 1; y++) {
if (!(yi < 0) && (yi != y)) {
if (zellen.get(xi).get(yi) == true) {
result++;
}
}
}
}
}
return result;
}
private void naechsteRunde() {
ArrayList<ArrayList<Boolean>> result = new ArrayList<ArrayList<Boolean>>();
for(int x = 0; x<zellen.size();x++){
ArrayList<Boolean> zwiarr = new ArrayList<Boolean>();
for(int y = 0; y < zellen.get(x).size();y++){
int lebendeNachbarn = getLebendeNachbarn(x,y);
boolean ergebnis = false ;
if(zellen.get(x).get(y)){
if((lebendeNachbarn<2) || (lebendeNachbarn > 3)) {
ergebnis = false ;
} else {
ergebnis = true ;
}
}else {
if(lebendeNachbarn == 3){
ergebnis = true ;
} else {
ergebnis = false ;
}
}
zwiarr.add(ergebnis);
}
result.add(zwiarr);
}
zellen = result ;
}
}
[/Java]