# rekursiver aufruf zum aufdecken von feldern bei minesweeper



## wahmia10 (30. Nov 2012)

Ich habe ein kleines Problem bei dem aufdecken der Spielfelder. Das aufdecken funktioniert nur richtig wenn man das rechte untere Spielfeld anklickt. Bei allen anderen wird meistens nur ein teil aufgedeckt.
Im Anhang ist die GUI mit den beschriebenen Fehlern zum besseren Verständnis. Ich weiß selber dass noch kleinere Fehler generell versteckt sind, aber der Grund warum manche Felder nicht aufgedeckt werden ist mir nicht klar.

Der Code zu meiner Methode wäre:

```
private void floodFill(int zeile, int spalte)
    {
        if (buttArray[zeile][spalte].getMineDensity() == 0)
        {
            for (int i = zeile - 1; i < zeile + 1; i++)
            {
                for (int j = spalte - 1; j < spalte + 1; j++)
                {
                    try
                    {
                        if (buttArray[i][j].getMineDensity() >= 0 && buttArray[i][j].isSelected() == false)
                        {
                            buttArray[i][j].setSelected(true);
                            buttArray[zeile][spalte].setText(Integer.toString(buttArray[zeile][spalte].getMineDensity()));
                            System.out.println(i + "#" + j);
                            floodFill(i, j);
                        }
                    } catch (Exception e)
                    {
                    }
                }
            }
        }
    }
```

Hier noch die Informationen die in jedem Button gespeichert sind:
|[ 0][ 0] false  0||[ 0][ 1] false  1||[ 0][ 2] false  1||[ 0][ 3] false  2||[ 0][ 4] false  1||[ 0][ 5] false  1||[ 0][ 6] false  0||[ 0][ 7] false  0||[ 0][ 8] false  0|
|[ 1][ 0] false  0||[ 1][ 1] false  1||[ 1][ 2]  true  0||[ 1][ 3] false  3||[ 1][ 4]  true  0||[ 1][ 5] false  3||[ 1][ 6] false  1||[ 1][ 7] false  1||[ 1][ 8] false  0|
|[ 2][ 0] false  1||[ 2][ 1] false  2||[ 2][ 2] false  1||[ 2][ 3] false  4||[ 2][ 4]  true  0||[ 2][ 5] false  4||[ 2][ 6]  true  0||[ 2][ 7] false  1||[ 2][ 8] false  0|
|[ 3][ 0]  true  0||[ 3][ 1] false  1||[ 3][ 2] false  0||[ 3][ 3] false  2||[ 3][ 4]  true  0||[ 3][ 5] false  3||[ 3][ 6] false  1||[ 3][ 7] false  2||[ 3][ 8] false  1|
|[ 4][ 0] false  1||[ 4][ 1] false  1||[ 4][ 2] false  0||[ 4][ 3] false  2||[ 4][ 4] false  2||[ 4][ 5] false  2||[ 4][ 6] false  0||[ 4][ 7] false  1||[ 4][ 8]  true  0|
|[ 5][ 0] false  0||[ 5][ 1] false  1||[ 5][ 2] false  1||[ 5][ 3] false  2||[ 5][ 4]  true  0||[ 5][ 5] false  1||[ 5][ 6] false  0||[ 5][ 7] false  1||[ 5][ 8] false  1|
|[ 6][ 0] false  0||[ 6][ 1] false  1||[ 6][ 2]  true  0||[ 6][ 3] false  2||[ 6][ 4] false  1||[ 6][ 5] false  1||[ 6][ 6] false  0||[ 6][ 7] false  0||[ 6][ 8] false  0|
|[ 7][ 0] false  0||[ 7][ 1] false  2||[ 7][ 2] false  2||[ 7][ 3] false  2||[ 7][ 4] false  0||[ 7][ 5] false  0||[ 7][ 6] false  0||[ 7][ 7] false  0||[ 7][ 8] false  0|
|[ 8][ 0] false  0||[ 8][ 1] false  1||[ 8][ 2]  true  0||[ 8][ 3] false  1||[ 8][ 4] false  0||[ 8][ 5] false  0||[ 8][ 6] false  0||[ 8][ 7] false  0||[ 8][ 8] false  0|


----------



## SlaterB (30. Nov 2012)

> if (buttArray_[j].getMineDensity() >= 0

gibt es auch eine negative density? 

> for (int i = zeile - 1; i < zeile + 1
> for (int j = spalte - 1; j < spalte + 1
schau dir doch an, welche Werte da in Frage kommen, es kann nur nach links und nach oben gehen, größere Werte sind nicht drin,

> Bei allen anderen wird meistens nur ein teil aufgedeckt.
klingt da bisschen billig, es müsste doch genau zu erkennen sein dass rechts + unten alles frei bleibt, ruhig dann auch erwähnen


---------

> } catch (Exception e)    {   }
möglichst bald weg, 
wenn du über die Arraygrenzen hinauskommst prüfe das mit ifs, weitere wichtige Informationen bekommst du vielleicht nicht mit

> if (buttArray[zeile][spalte].getMineDensity() == 0)
eine ganze Methode in ein if zu stecken ist etwas unschön, schreibe lieber ein return; am Anfang wenn != 0,
dann muss der Rest nicht ganz so stark eingerückt sein


> buttArray[zeile][spalte].setText(Integer.toString(buttArray[zeile][spalte].getMineDensity()));
ist bisschen komisch, wenn bestimmte Nachbarn selektiert werden bekommen nicht die unter i,j, einen Text sondern zeile,spalte?
na wenn es klappt

-------

generell gilt: mehr loggen, mit System.out.println(),
fange vielleicht mit etwas kleineren Beispiel an 
(4x4 mit nur einer Mine ist auch schon für vieles genug, jedenfalls würde dein jetziger Fehler dort auch auftreten),
und dann schaue einfach Schritt für Schritt was passiert,
beginnend von 2,2, welche Nachbarn werden durchlaufen, was passiert dort jeweils, wie sehen die Bedingungen aus, wer wird auf selected gesetzt usw.,
dass deine Schleifen nicht nach rechts schauen merkt man dann sofort_


----------



## wahmia10 (30. Nov 2012)

Danke für die vielen Tipps und für Lösung des Problems.
Wie konnte ich nur so einen Fehler übersehen ???:L


----------

