2017-11-14 4 views
-1

Ich programmiere in c das Minesweeper-Spiel. ich bin ziemlich am Ende. Ich habe nur ein Problem mit dem letzten Teil.Minesweeper-Algorithmus zum Finden von Nachbarn?

im Spiel (siehe Bild) wenn ich auf das obere linke Feld klicke, werden die Felder, wo keine Mine ist, umgedreht und an der Grenze sind Zahlen.

Wie ist der Algorithmus um dieses Feld zu finden und zu drehen oder um es zu zeigen .... Ich meine Algorithmus für das Feld im grünen Kreis?

MineSweeper

+5

Ich denke, es ist etwas Ähnliches wie der [Flood fill] (https://en.wikipedia.org/wiki/Flood_fill) Algorithmus. –

+0

Danke für Ihre Hilfe, wissen Sie, ob es einen einfacheren Algorithmus gibt? – naikjones

+0

Sie werden es schwer haben, einen einfacheren Algorithmus als [this] (https://en.wikipedia.org/wiki/Flood_fill#Stack-based_recursive_implementation_.28four-way.29) zu finden, um dieses Problem zu lösen – SirGuy

Antwort

1

ich ein Design von Grund auf neu mache, ich hoffe, es hilft Ihnen.

Wenn mein Spiel Arena ist nxn Matrix von ganzen Zahlen,

0 0 0 0 0 
0 0 0 0 0 
0 0 0 0 0 
0 0 0 0 0 

Ich kann durch Anwendung eines solchen 3x3-Matrix eine Bombe in dieser Matrix platzieren Modell:

1 1 1 
1 9 1 
1 1 1 

Hier 9 eine Bombe bezeichnet, Sie müssen wahrscheinlich eine größere Ganzzahl verwenden. Und wenn ich apply sage, wähle ich den Ort und inkrementiere ihn um die Zahlen in dieser 3x3-Matrix. Also lasst uns 1 Bombe platzieren:

0 1 1 1 0 
0 1 9 1 0 
0 1 1 1 0 
0 0 0 0 0 
0 0 0 0 0 

Legen wir eine weitere Bombe, direkt neben der ersten. Und lassen Sie uns ein bisschen klug sein und die Lage ist nicht erhöht werden, wenn der Anfangswert in einer Zelle 9.

0 1 2 2 1 
0 1 9 9 1 
0 1 2 2 1 
0 0 0 0 0 
0 0 0 0 0 

Lassen Sie uns ein anderes diesmal irgendwo unten platzieren.

0 1 2 2 1 
0 1 9 9 1 
0 1 3 3 2 
0 0 1 9 1 
0 0 1 1 1 

Also wenn ich versuche, Zahlen von unten rechts zu enthüllen. Was sollte mein Algorithmus sein? Hier ist meine nehmen:

function revealCell(location) 
{ 
    if(cellValueIsRevealed(location)) { 
     return; 
    } 
    var value = revealValueOfCell(location); 
    if(value > 0) 
    { 
     return; 
    } 

    foreach(neighbor in neighbors) 
    { 
     revealCell(neighbor); 
    } 
} 

Zur Umsetzung cellValueIsRevealed Methode, eine Möglichkeit wäre, eine Matrix von booleans zu implementieren.

+0

Sie müssen füge Schutz gegen unendliche Rekursion hinzu, wenn zwei oder mehr benachbarte Nullen vorhanden sind. – interjay

+0

@interjay Ich habe das Verknüpfungsverhalten hinzugefügt, um eine unendliche Rekursion zu vermeiden. –

Verwandte Themen