# BlueJ - Hilfe bei for-Struktur



## Riala (20. Mai 2012)

Hallo!

Ich würde mich sehr freuen, wenn mir jemand helfen kann. Morgen schreiben wir Informatikarbeit, im Moment bearbeiten wir im Unterricht :   Krümel und Monster

Ich hab gerade versucht, ein Schachbrett zu erstellen, dazu ein zweidimensionales 8*8 Feld erstellt und mit Hilfe einer anderen Klasse, die wir fertig bekommen haben, das ganze als kariertes Feld darzustellen.



```
public class SCHACHBRETT
{
int breite;
int hoehe;
ZELLE [][] schachbrett;


public SCHACHBRETT()
{
breite = 8;
hoehe = 8;
schachbrett = new ZELLE [8][8];

for (int y = 0; y <8; y= y+2)
{
int posY = 0;
int posX = 1;

for (int x= 1; x< 8; x=x+2)
{
schachbrett[posX][posY].IstMauerSetzen(false);
posX = posX + 2;

}
posX = 0;
posY = posY + 1;
for (int x= 0; x<8; x=x+2)
{
schachbrett [posX][posY].IstMauerSetzen(false);
posX= posX+2;
}
}
}
}
```



Wenn ich auf "Compile" klick, kommt die Meldung, "compiled, no syntax errors".
Wenn ich dann aber versuche ein Objekt zu erstellen, dann kommt die Fehlermeldung "java.lang.NullPointerExecption: null" bezogen auf die Zeile "schachbrett[posX][posY].IstMauerSetzen(false);"



Vielen Dank für jede Hilfe, ich komm da im Moment leider selbst echt nicht weiter.


Lg Riala


----------



## jgh (20. Mai 2012)

da meinerEiner dein Code leider nicht kompilieren kann, weise ich dich nur auf einen Fehler hin:

Du erstelllst ein Array von [c]Zellen[/c] aber füllst dieses nicht. Daraus resultiert deine NPE!

und was diese Methode bei einem Schachbrett macht, ist imho nicht ersichtlich?


```
schachbrett[posX][posY].IstMauerSetzen(false);
```

[edit]so was in der Art fehlt dir noch in deinem Code...

```
for (int i=0;i<8;i++){
			for (int j = 0; j < 8; j++) {
				schachbrett[i][j]= new ZELLE();
			}
		}
```
[/edit]


----------



## Riala (20. Mai 2012)

Die Methode stammt aus der Klasse Zelle und bewirkt, dass das entsprechende Kastl mit einer Farbe gefüllt wird, so wie auch das Labyrinth in Pacman.

Aber wie meinst du das mit die Zellen füllen? Kannst du mir das bitte erklären?

Das heißt also, ich könnte die Zähler x und y, bzw. i und j auch als Bezeichner der Felder hernehmen?


Lg Riala


----------



## jgh (20. Mai 2012)

siehe mein edit in der ersten Antwort,  sowas in der Art halt...


----------



## Riala (20. Mai 2012)

jgh hat gesagt.:


> siehe mein edit in der ersten Antwort,  sowas in der Art halt...



Jetzt funktioniert auch das Compilen nicht mehr ;C

Stattdessen kommt die Meldung

"constructor ZELLE in class ZELLE cannot be applied to given types;
requirde: int,int
found: no arguments
reason: actual and formal argument lists differ in length

The operator that you use here cannot be used for the type of value that you are using it for. You are either using the wrong type here, or the wrong operator."

bezogen auf 
	
	
	
	





```
schachbrett[x][y] = new ZELLE();
```

Aber ich hab doch eigentlich schon oben die Felder erzeugt mit


```
schachbrett = new ZELLE [8][8];
```
oder irre ich mich da?


Lg Riala


----------



## jgh (20. Mai 2012)

dann versuche es mal in der Zeile mit: 

```
schachbrett[i][j]= new ZELLE(i,j);
```



Riala hat gesagt.:


> ...
> bezogen auf
> 
> 
> ...



ja da irrst du dich! Mit dem geposteten Code erzeugst du ein Array, dass 8x8 Zellen aufnehmen kann, aber noch keine einzige Zelle hat. In Analogie zu einer Schublade sagst du dem Computer, gebe mir eine Schublade, die 8x8 Zellen aufnehmen kann...wenn du in die Schublade reingreifst,  hast du 8x8 Fächer die aber alle leer sind...du musst sie halt noch mit Zellen füllen


----------



## Riala (20. Mai 2012)

Ok, ich hab jetzt nochmal das ganze mit dem Farbe (=  Mauer) setzen raus.


```
public class SCHACHBRETT
{
    int breite;
    int hoehe;
    ZELLE [][] schachbrett;
    
    
    public SCHACHBRETT()
    {
        breite = 8;
        hoehe = 8;
        schachbrett = new ZELLE [8][8];
        
        
        for (int y = 0; y< 8 ; y++)
        {
            for (int x = 0; x < 8 ; x++)
            {
                schachbrett[x][y] = new ZELLE(x,y);
        
            }
        }
    }
    
    
}
```

vielen Dank, jetzt hab ich auf jeden Fall schon mal ein angezeigtes 8*8 Feld 


Jetzt muss ich bloß noch irgendwie diese IstMauerSetzen auf die Hälfte der Felder anwende, sodass das ganze dann kariert ist.



Lg Riala


----------



## Riala (20. Mai 2012)

Ok, ich hab das ganze jetzt wieder eingefügt, er meckert nicht mehr.

meine Klasse SCHACHBRETT schaut jetzt so aus. Er erzeugt zwar brav ein sichtbares 8*8-Feld, aber das mit den Karos funktioniert leider noch nicht.

```
public class SCHACHBRETT
{
    int breite;
    int hoehe;
    ZELLE [][] schachbrett;
    
    
    public SCHACHBRETT()
    {
        breite = 8;
        hoehe = 8;
        schachbrett = new ZELLE [8][8];
        
        
        for (int y = 0; y< 8 ; y++)
        {
            for (int x = 0; x < 8 ; x++)
            {
                schachbrett[x][y] = new ZELLE(x,y);
        
            }
        }
        
        
        for (int y = 0; y <8; y= y+2)
           {
               int posY = 0;
               int posX = 1;
 
               for (int x= 1; x< 8; x=x+2)
               {
                   schachbrett[posX][posY].IstMauerSetzen(false);
                   posX = posX + 2;
 
                }
                posX = 0;
                posY = posY + 1;
                for (int x= 0; x<8; x=x+2)
                {
                    schachbrett [posX][posY].IstMauerSetzen(false);
                    posX= posX+2;
                }
            }
        }    
}
```


Zum Vergleich die Klasse LABYRINTH (die haben wir in der Schule erstellt) . Hier funktioniert es, wenn ich bei der Methode GaengeErstellen die x und die y- Position angebe. Aber das müsste man doch eigentlich auch mit einer for-Schleife verallgemeinern können?

```
public class LABYRINTH
{
    int breite;
    int hoehe;
    ZELLE[][] spielFlaeche;
    
    public LABYRINTH(int breiteNeu, int hoeheNeu)
    {   
        breite = breiteNeu;
        hoehe = hoeheNeu;
        spielFlaeche = new ZELLE[breite][hoehe];
        
        for (int zaehlerY = 0; zaehlerY < hoehe ; zaehlerY++)
        {
            for (int zaehlerX = 0; zaehlerX < breite ; zaehlerX++)
            {
                spielFlaeche[zaehlerX][zaehlerY] = new ZELLE(zaehlerX, zaehlerY);
        
            }
        }
    
    }
    
    public void GaengeErstellen(int xpos, int ypos)
    {
        spielFlaeche[xpos][ypos].IstMauerSetzen(false);
    }
    
}
```



Lg Riala


----------



## jgh (20. Mai 2012)

versuche es mal so...

```
for (int i = 0; i < 8; i = i + 2) {
				schachbrett[0][i].IstMauerSetzen(true);
			}
```

das sollte zumindest für eine Zeile funktionieren, ggf. true auf false setzen...aber eigentlich sollte das nach meinen Verständis mit true funktionieren...und dann musst du dir halt nochmal überlegen, wie man das geschickterweise auf alle Zeilen anwendet


----------



## Riala (20. Mai 2012)

Oh mann, das war jetzt eine schwere Geburt.
Es funktioniert endlich! Mein Fehler war, dass ich das mit dem Füllen der Felder nicht gemacht hatte und false statt true verwendet hab, ansonsten ist jetzt alles so, wie es war, bevor ich hier gepostet hab 


Vielen Dank für deine große Hilfe!



```
public class SCHACHBRETT
{
    int breite;
    int hoehe;
    ZELLE [][] schachbrett;
    
    
    public SCHACHBRETT()
    {
        breite = 8;
        hoehe = 8;
        schachbrett = new ZELLE [8][8];
        
        
        for (int y = 0; y< 8 ; y++)
        {
            for (int x = 0; x < 8 ; x++)
            {
                schachbrett[x][y] = new ZELLE(x,y);
        
            }
        }
        
       for (int y = 0; y <8; y ++)
           {
            
 
               for (int x= 1; x< 8; x=x+2)
               {
                   schachbrett[x][y].IstMauerSetzen(true);
                 
 
                }
                y = y+1;
                for (int x= 0; x<8; x=x+2)
                {
                    schachbrett [x][y].IstMauerSetzen(true);
                 
                }
            }
        }
          
}
```



GLg Riala


----------



## AquaBall (20. Mai 2012)

Nur der Vollständigkeit halber:
Gewöhn dir von Anfang an die korrekte Schreibweisen an:

MEINE_KONSTANTEN / MeineClassen / meineMethoden

LABYRINTH, ZELLE ist "falsch"  => Labyrinth
IstMauerSetzen ist "falsch"  => istMauerSetzen
(OK, Der Compiler bemängelts nicht; Eclipse würde dich schon daruaf hinweisen.)

Du tust dich dann viel leichter auch andere Programm zu verstehen, und machst Anderen die Lesbarkeit deiner Programme leichter.

PS: Nein, jgh, nicht du bist gemeint, sondern TO!


----------



## thed4rkmark (9. Nov 2012)

Könntest du vielleicht die klasse Zelle noch mal hier hinzufügen, muss das jetzt auch in der schuzle machen 
danke


----------

