[Java] Grid füllt sich nur zur Hälfte?!

02/12/2012 15:24 Belur#1
Hey E*pvpers.

Hab im Moment die Aufgabe im Info Lk, das "Game of Life" in Greenfoot zu schreiben. Ist halt ein zellulärer Automat.

Jedenfalls wollte ich das Grid erstmal mit zufälligen Zellen füllen. Also eine Zelle kann entweder den Zustand "Tot" haben(In dem 2d Array also false) oder "Lebendig",(demtentsprechend im Array true).

Dazu hab ich folgenden Programmcode:


PHP Code:
public void zufaelligeFuellung(){
        for(
int x xgetHeight(); x++){
            for(
int y 0getWidth(); y++){ 

                
int a Greenfoot.getRandomNumber(2);

               if(
== 1){
                    
                 
cells[x][y] = true;
                    
bg.drawImage(ALIVEx*10y*10);
                    
                    
                    
                }else{
                    
                    
cells[x][y] = false;
                    
bg.drawImage(DEADx*10y*10);
                }

            }
        }
    } 

GreenfootImage ALIVE, DEAD und bg wurden schon erstellt. Hab ich jetzt nicht expliziert nochmal aufgeführt.

Das Ergebnis sieht dann folgendermaßen aus:

[Only registered and activated users can see links. Click Here To Register...]



Das Feld füllt sich also nicht ganz mit den Zellen. Mir ist nicht ganz klar warum, weil ich in den for-Schleifen ja die Feldbegrenzungen als Abbruchwerte angegeben hab.

Vllt kann mir da jmd helfen.


~Greets

Belur
02/12/2012 15:33 jacky919#2
Bei "bg.drawImage(ALIVE, x*10, y*10);" x und y vielleicht vertauscht, sodass er in den nicht sichtbaren Bereich zeichnet?
Sonst lass dir mal irgendetwas ausgeben, wenn x und y die Koordinate von bisher nicht gezeichneten Kästen sind (bsp: x = 30 und y = 0), um fest zu stellen ob es an der Schleife oder am Zeichnen liegt.
02/12/2012 15:49 Belur#3
Hmm.

Hab jetzt mal manuell geguckt:

bg.drawImage(ALIVE, 400, 45);


Da macht er eine Zelle wo er vorher nichts gemacht hat bei der Methode.
Leider weiß ich nicht warum. Weil bis zum x-Wert 40 würde ja auch so kommen denn das Spielfeld ist ja so definiert:

public CellWorld() {
super(48, 32, 10);

}

Bis zum x-Wert 40 müsste er theoretisch kommen, da das Feld ja 48 lang ist.

Und die 400 halt, weil eine Zelle 10 Pixel groß ist. In der Schleife gehts nicht und manuell schon -.-"
02/12/2012 16:06 Dr. Coxxy#4
du vertauschst x und y.

Code:
for(int x = 0 ; x < getHeight(); x++){
    for(int y = 0; y < getWidth(); y++){
x ist die weite -> nach rechts gehend,
y ist die höhe -> nach unten gehend.

richtig wäre also:

Code:
for(int x = 0 ; x < getWidth(); x++)
{
  for(int y = 0; y < getHeight(); y++)
  {
02/12/2012 16:19 Belur#5
Danke ;)


Habs grad mal geändert, das Ergebnis bleibt jedoch leider das selbe.
02/12/2012 16:30 Dr. Coxxy#6
zeig mal deinen neuen code...
möchte wetten, du hast es jetzt 2x geändert :P
02/12/2012 16:32 Belur#7
PHP Code:
public void zufaelligeFuellung(){
        for(
int x xgetWidth(); x++){
            for(
int y 0getHeight(); y++){ 

                
int a Greenfoot.getRandomNumber(2);

                if(
== 1){

                    
cells[x][y] = true;
                    
bg.drawImage(ALIVEx*10y*10);

                }else{
                    
cells[x][y] = false;
                    
bg.drawImage(DEADx*10y*10);
                }

            }
        }
    } 
02/12/2012 16:37 Dr. Coxxy#8
sicher, dass du richtig neu kompiliert und ausgeführt hast?
bei dem alten bild wars nämlich 100% der fehler, wird genau bis zur höhe von links nach rechts befüllt.

EDIT:
überprüf mal ob getWidth und getHeight nicht fehlerhaft copypasted sind und beide die höhe zurückgeben oder ähnliches.
02/12/2012 16:48 Belur#9
Habs nochmal überprüft.

getWidth und getHeight geben die richtigen größen aus.

Manchmal krieg ich bei dem Methodenaufruf auch den OutOfBounds Fehler, obwohl das eigentlich garnicht sein kann, da das Array ja genauso groß ist wie das Feld, also die Arraygrenzen getWidth und getHeight sind.

Richtig kompiliert ist auch alles.
02/12/2012 16:55 Dr. Coxxy#10
cells ist also
Code:
boolean[][] cells = new boolean[getWidth()][getHight()];
(aufpassen mit getwidth und gethight in der richtigen reihenfolge...)

achja noch genereller stilhinweis, du solltest ne extra funktion draw() machen, die den inhalt von cells zeichnet, die zeichenroutinen haben in zufaelligeFuellung() nichts zu suchen.

EDIT:
getwidth liefert 48 zurück, gethight 32?
02/12/2012 17:32 MoepMeep#11
Wie wärs wenn du erstmal die Java Code Conventions liest?
02/12/2012 17:32 Belur#12
Ahhh. Danke. Da lag der Fehler. Als ich das Array erstellt hab, hab ich x und y Werte vertauscht.

Ja das mit dem Draw werd ich warscheinlich noch machen. Wollt nur erstmal so ne Idee von dem Programm bekommen wie das läuft mit den Zellen etc.

Vor allem das ändern muss ich mir nochmal angucken und überlegen ob ich dafür nicht ein 2tes Array brauche (nur für den Fall, dass du weißt wie dieses "Game of Life" funktioniert) :D

Aber danke nochmal. Jetzt klappts einwandfrei.
02/12/2012 17:38 MoepMeep#13
Zu langsam entfernt, habs trotzdem gesehen :>

Wenn du die Java Code Conventions angeblich gelesen hast, wieso hälst du dich nicht dran? Wäre ich dein Lehrer, hätte ich dir die halbe Methode rot angestrichen.
02/12/2012 17:45 Belur#14
:D

Ich bin Genuss meine Programme noch allein zu schreiben und warscheinlich wird sie auch nie jmd anderes öffnen.

Wenn ich etwas publizieren wollen würde, würd ich mich an die außeren Förmlichkeiten halten ^^
Zudem gibts ja nichtmal eine feste Code-Konvention die für alle gilt. Ist ja oft von Firma zu Firma bzw von Projekt zu Projekt unterschiedlich, wie man das handhaben will. Ob die geschweifte Klammer in die selbe oder in die nächste Zeile kommt etc ^^

Und da dieses kleine Experiment ja eig eh nur für mich ist und das alles für mich logisch ist, hab ichs mir mal rausgenommen nicht alles zu kommentieren.
Aber ist ja auch ziemlich egal ^^

Habs eig wieder entfernt um diese Diskussion zu vermeiden :D
02/12/2012 20:35 MoepMeep#15
Wenn nicht anders abgesprochen gelten diese [Only registered and activated users can see links. Click Here To Register...] für java.