Minesweeper: rekursive Funktion

p-flash

Erfahrenes Mitglied
Hi,

ich habe ein Minesweeper-Spiel erstellt. Jetzt habe ich es so eingestellt, dass der Spiel selber einstellen kann, wie groß das Feld und wieviele Bomben da sein sollen. Wird auf ein Feld gedrückt, welches keine Bombe im Umfeld hat, werden alle Felder im Umfeld aufgedeckt, es wird überprüft ob noch nullen drunter sind, wenn ja wird das gleiche nochmal gemacht und so weiter, bis alle nullen im Umfeld aufgedeckt sind.

Nimmt er zB ein Feld mit 9x9 Feldern und 10 Bomben, dann ist das auch kein Problem. Wählt man jedoch 20x30 Felder und 10 Bomben, dann sind 520 Felder nullen, also ohne Bomben im Umfeld. Das heißt die Funktion wird so oft rekursiv ausgeführt, dass Flash abbricht.

Meine Frage ist jetzt, ob jemand vllt eine Idee hat wie man solche rekursionen aufrufen kann (nicht nur in meinem fall sondern allgemein), dass es nicht zu zuviele rekursionen bzw zu überlastung kommt.

Danke im Voraus.

/edit
Das könnt ihr hier test

Mit der <Strg>-Taste und dann Mausklick auf ein Feld, können Fahnen gesetzt werden.

p-flash
 
Hi,

versuch mal, die Rekursionen in einer onEnterFrame-Methode oder in einem Interval aufzurufen - dadurch dauert die Überprüfung u.U. etwas länger, aber der Film sollte sich nicht mehr aufhängen.

... allerdings sollten 500 Aufrufe, Flash noch nicht zum Hängen bringen - gibt es vielleicht noch eine andere Fehlerquelle?

Gruß

EDIT: ich habe mal etwas ganz simples zusammengebaut, und das läuft ohne Probleme (siehe Anhang).
.
 

Anhänge

  • minesweeper.zip
    6,2 KB · Aufrufe: 66
Zuletzt bearbeitet:
Ich glaube nicht. Die Meldung dass mehr als 256 rekursionen aufgerufen wurden kommt jedenfalls. Alles andere müsste ok sein.

Danke, das mit onEnterFrame werde ich mal versuchen.

p-flash
 
Schau mal in meinen Anhang. Auch wenn Du die Zufallsverteilung so setzt, dass nur ganz wenige Bomben da sind, killt die Rekursion das Feld in wenigen Sekundenbruchteilen.

... oder habe ich an der Frage etwas falsch verstanden?

Gruß

EDIT: Ahhh - vergiss, was ich gesagt habe: ich bekomme die Meldung auch. ^^ Ich schau mal, was sich mit einem Intervall machen lässt und melde mich dann wieder.

EDIT #2: Jupp, mit onEnterFrame läuft es prima. Langsam, aber prima. ;)
.
 

Anhänge

  • minesweeper.zip
    6,2 KB · Aufrufe: 39
Zuletzt bearbeitet:
Noch ein Tipp am Rande, um das ganze zu beschleunigen: Lass einen globalen Zähler mitlaufen und führ die onEnterFrame nur alle 200 Durchläufe aus. ;)

Gruß
.
 
Was meinst du genau? Sowas wie

PHP:
this.onEnterFrame = function()
{
  i++;
 if(i == 200)
  // mach was
}

Würden nicht dadurch, dass ganze zeit der wert hochgerechnet wird, länger dauern? Oder habe ich dich falsch verstanden?

p-flash
 
nö, eher so:
PHP:
var running = 0;

function rekursiveSuche() {
    if (running < 200) {
        machwas();
    } else {
        running = 0;
        this.onEnterFrame = function() {
            machwas();
            delete this.onEnterFrame;
        }
    }
}

Beispiel im Anhang.

Gruß
.
 

Anhänge

  • minesweeper2.zip
    5,9 KB · Aufrufe: 34
Zuletzt bearbeitet:
Konnte es leider noch nicht testen. Ist das Resourcen schonender? Oder lässt du die onEnterFrames so ablaufen, das praktisch alle Felder fast gleichzeitig aufgedeckt werden?

p-flash
 
Nee, ich lass ne stinknormale Rekursion laufen, und alle 200 Durchläufe oder so schiebe ich einen onEnterFrame zwischen, damit sich das Ding nicht aufhängt. ;-)

Gruß
.
 
Zurück