• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Feld rekursiv auswählen

hans_maies

Neues Mitglied
Hallo

ich bin gerade dabei dieses Spiel in Java zu programmieren:

spiel.png


Dabei komme ich an einer Stelle nicht weiter. Es geht darum, die benachbarten Farben des angeklickten Feldes zu markieren. Ich habe es rekursiv versucht, aber es klappt nicht so wie ich es mir vorstelle. Rekursiv einen Weg durch ein Labyrinth zu suchen ist die eine Sache, ein gleichfarbiges Feld zu markieren anscheinend etwas ganz anderes.

- mein Spielfeld ist gespeichert in einem zweidimensionalen Array spielfeld[][]
- jedes Feld im Array hat eine fest definierte Farbe (getColor) und ist entweder ausgewählt oder nicht (isSelected + setSelected)

Idee:
Ich suche vom aktuellen Feld in 4 Richtungen (oben, unten, rechts, links) nach einem (unmarkierten) gleichfarbigen Feld. Wird eines gefunden, markiere ich es und suche von diesem Feld aus weiter.
Wird keines gefunden gehe zurück zum letzen Feld und suche dort weiter.

Hier die Methode, die ich zum auswählen aufrufe, übergeben werden die Koordinaten des angeklickten Feldes in spielfeld[][]
Code:
public void select(int x, int y){
        if(this.spielfeld[x-1][y].getColor()==this.spielfeld[x][y].getColor() && 
                this.spielfeld[x-1][y].isSelected()==false){
            this.spielfeld[x-1][y].setSelected(true);
            select(x-1,y);            
        }
        else {
            if(this.spielfeld[x][y+1].getColor()==this.spielfeld[x][y].getColor() && 
                    this.spielfeld[x][y+1].isSelected()==false){
                //this.spielfeld[x][y+1].setSelected(true);
                select(x,y+1);            
            }
            else {
                if(this.spielfeld[x+1][y].getColor()==this.spielfeld[x][y].getColor() && 
                        this.spielfeld[x+1][y].isSelected()==false){
                    this.spielfeld[x+1][y].setSelected(true);
                    select(x+1,y);            
                }
                else {
                    if(this.spielfeld[x][y-1].getColor()==this.spielfeld[x][y].getColor() && 
                            this.spielfeld[x][y-1].isSelected()==false){
                        this.spielfeld[x][y-1].setSelected(true);
                        select(x,y-1);            
                    }
                    else {return;}
    }}}}
Mir ist klar, dass diese Methode momentan auf jeden Fall eine Out-of-Bounds exception produziert wenn das zu markierende Feld bis an die äußere Reihe des Spielfelds reicht. Aber auch wenn ich ein Spielfeld mit einem andersfarbigen Rahmen erzeuge werden nicht alle Felder markiert.

Also wo liegt mein (gedanklicher) Fehler?

Gruß
Hans
 
Wird keines gefunden gehe zurück zum letzen Feld und suche dort weiter.
Genau das passiert nicht! Sobald ein benachbartes Feld gefunden wird, das die gleiche Farbe hat und nicht ausgewählt ist, werden die anderen benachbarten Felder nicht mehr überprüft(wegen der if-else Konstruktion). So müsste es funktionieren:
Code:
public void select(int x, int y){
    if(this.spielfeld[x-1][y].getColor()==this.spielfeld[x][y].getColor() && this.spielfeld[x-1][y].isSelected()==false){
        this.spielfeld[x-1][y].setSelected(true);
        select(x-1,y);            
    }

    if(this.spielfeld[x][y+1].getColor()==this.spielfeld[x][y].getColor() && this.spielfeld[x][y+1].isSelected()==false){
        this.spielfeld[x][y+1].setSelected(true);
        select(x,y+1);            
    }

    if(this.spielfeld[x+1][y].getColor()==this.spielfeld[x][y].getColor() && this.spielfeld[x+1][y].isSelected()==false){
        this.spielfeld[x+1][y].setSelected(true);
        select(x+1,y);            
    }

    if(this.spielfeld[x][y-1].getColor()==this.spielfeld[x][y].getColor() && this.spielfeld[x][y-1].isSelected()==false){
        this.spielfeld[x][y-1].setSelected(true);
        select(x,y-1);            
    }
}
mfg Bleistift
 
Zurück
Oben