2011-01-10 5 views
3

Also mein Java Minesweeper Spiel wird als ein int [] [] dargestellt, wobei -1 eine Mine darstellt. Wenn ich mein Spiel initialisiere, muss ich eine zufällige Anzahl von Minen platzieren.Brauchen Sie Hilfe mit einer Methode, um Minen in einem Minesweeper Spiel zufällig zu legen

Was ist eine elegante Art, dies zu tun? Ich dachte daran, eine ArrayList mit den Koordinaten jeder Zelle zu verwenden, sie zufällig auszuwählen, den Zustand von int [] [] zu ändern und dann diesen Punkt zu entfernen. Dies würde sicherstellen, dass kein Punkt zweimal ausgewählt wird.

Gibt es eine elegantere Art, dies zu tun?

+11

sollte dies nicht auf stackoverflow sein? –

+0

Ich zweite diese Frage. –

Antwort

4

Ich würde es ähnlich machen, aber etwas anders. Verwenden Sie den Kartenverarbeitungsalgorithmus.

Erstellen Sie ein Array aller Koordinaten in Ihrem Raster in dieser Reihenfolge. ([0,0], [0,1] .. [0,max], [1,0] .. [max, max]). Dann "mische das Deck", indem du die Liste der Reihe nach wiederholst und jedes Element mit einem zufälligen Element vertauschst. Wählen Sie dann die ersten x Elemente in der Liste und platzieren Sie Minen an diesen Orten.

+3

http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle –

+0

@Job: Danke für den Link. Gute Aufklärung! –

+0

Gute Idee, genau wonach ich gesucht habe. – avatarX

0

Ich nehme an, die Minenbreite ist fest?

Wenn ja, dann könnte man es auf diese Weise tun:

sagen Sie ein 4x4 Mine Gitter haben.

Konvertieren einer Dezimalzahl in binäre, so dass für eine 4-Bit der Bereich sein würde:

2^4 = 16 => Bereich 0 ... 15 ist

Dann einfach diese Funktion aufrufen für jedes Raster " Reihe ":

1,16,0,3

würde zu transformieren:

0001 
1111 
0000 
0011 
+0

16 würde '10000' ergeben, ich glaube du meintest 15 :-) – rsp

+0

Sicherstellen, dass die richtige Anzahl von 1s immer noch die zufällige Platzierung mit diesem Ansatz sicherstellt, ist schwierig. – Yuliy

1

Ich würde zufällige Koordinaten erzeugen und das Brett auf eine bestehende Mine prüfen. Wenn es existiert, überspringe es und erzeuge neue Koordinaten, wenn es keine Mine gibt.

+0

Ja. Wenn die Dichte der Minen nicht hoch ist, ist es effizienter, ein paar Wiederholungen durchzuführen, als mit einer komplexeren Datenstruktur umzugehen. Es sollte auch fast trivial einfach zu programmieren sein. –

+0

So habe ich es anfangs gemacht, aber selbst eine mittlere Dichte auf einem größeren Raster führt zu einer ziemlich deutlichen Initialisierungszeit – avatarX

+0

Dies sollte weniger als eine Sekunde dauern. Es muss etwas anderes passieren. – jzd

0

Dies ist in Python. Aber es druckt (x, y) Koordinaten von Minen. Das Ergebnis ist sortiert, spielt aber keine Rolle.

from random import sample 
import sys 

def randomSquares(n, m, mines): 
    return sorted([ (mine % m, mine // n) for mine in sample(xrange(n * m), mines)]) 

if __name__ == '__main__': 

    print randomSquares(int(sys.argv[1]), int(sys.argv[2]), int(sys.argv[3])) 
Verwandte Themen