Von einem Übersetzer: Dieser Beitrag ist eine Übersetzung des
Originalartikels von Maki Chiz, einem erfahrenen Programmierer, der nicht nur großartige Programme schreibt, sondern auch seinen Kollegen, sowohl Anfängern als auch Profis, die Fähigkeiten verschiedener Sprachen demonstriert.
Minesweeper ist ein lustiges Spiel, viele von uns spielen es. Vielleicht möchten Sie Minesweeper selbst machen?
Skillbox empfiehlt: Der Online- Beruf „Web Developer Profession“ .
Wir erinnern Sie daran: Für alle Leser von „Habr“ - ein Rabatt von 10.000 Rubel bei der Anmeldung für einen Skillbox-Kurs mit dem Aktionscode „Habr“.
Die Einzigartigkeit des Spiels ist, dass es sehr einfach und gleichzeitig sehr aufregend ist. In Minesweeper gibt es keine listige Spielmechanik. Klicken Sie einfach auf die Felder und hoffen Sie, dass sich keine Minen darunter befinden.
Ich schlage vor, "Minesweeper" über die Verarbeitung zu schreiben. Dies ist ein großartiges Tool, mit dem Sie grafische Anwendungen in Java erstellen können. Link dazu
hier .
Bevor ich anfange, möchte ich sagen, dass dieses Tutorial für diejenigen gedacht ist, die Java bereits kennen. Erfahrung mit der Verarbeitung ist optional.
Also los geht's. Der erste Schritt besteht darin, den Status des Spiels zu bestimmen. Ich habe beschlossen, es so umzusetzen.
int gridW;
Bis auf diesen Abschnitt scheint hier alles Sinn zu machen:
int [] [] mines . Warum ist das Minengitter eine ganze Zahl und kein Boolescher Wert? Tatsache ist, dass es einfach ist zu berechnen, wie viele Minen sich in der Nähe einer bestimmten Position befinden.
int calcNear(int x, int y) { int i=0; for (int offsetX=-1; offsetX<=1; offsetX++) { for (int offsetY=-1; offsetY<=1; offsetY++) { i+=mines[offsetX+x][offsetY+y]; } } return i; }
Dieser Code bestimmt, wie viele Minen sich in der Nähe eines bestimmten Standorts befinden. Nachdem wir die Ausnahmen entfernt haben, erhalten wir etwas Ähnliches:
boolean outBounds(int x,int y){ return x<0||y<0||x>=gridW||y>=gridH; } int calcNear(int x, int y) { if(outBounds(x,y))return 0; int i=0; for (int offsetX=-1; offsetX<=1; offsetX++) { for (int offsetY=-1; offsetY<=1; offsetY++) { if (outBounds(offsetX+x, offsetY+y))continue; i+=mines[offsetX+x][offsetY+y]; } } return i; }
Die Hauptaufgabe des Spiels selbst besteht darin, die Quadrate ab Punkt x, y freizulegen.
void reveal(int x, int y){ if(outBounds(x,y))return; if(revealed[x][y])return; revealed[x][y]=true; if(calcNear(x,y)!=0)return; reveal(x-1,y-1); reveal(x-1,y+1); reveal(x+1,y-1); reveal(x+1,y+1); reveal(x-1,y); reveal(x+1,y); reveal(x,y-1); reveal(x,y+1); }
Als Ergebnis haben wir den folgenden Algorithmus:
- Wenn sich die Position außerhalb des Feldes befindet, beenden Sie;
- Wenn die Position bekannt gegeben wird, beenden Sie;
- Wir eröffnen die aktuelle Position;
- Wenn wir eine Bombe in der Nähe der aktuellen Position haben, beenden Sie;
- Wenn wir diesen Punkt während der Ausführung der Funktion erreicht haben, wurde die aktuelle Position innerhalb des Spielfelds gefunden und es befinden sich keine Bomben daneben. Öffnen Sie benachbarte Felder.
Grundsätzlich ist der Rest des Spiels der gleiche. Den vollständigen Code finden Sie, indem Sie auf
diesen Link klicken.
Wenn Sie mehr über Visualisierung erfahren möchten, lesen Sie weiter.
VisualisierungHier sollte alles klar sein, aber ich werde die schwierigen Teile erklären.
Wir haben also eine Variable cellSize, die die Anzahl der Pixel in jedem Quadrat bestimmt.
void settings(){ size(gridW*cellSize, gridH*cellSize); }
Daher erstellen wir ein Feld mit den Seiten gridW x gridH, in dem die Größe jedes Quadrats dem Wert von cellSize entspricht.
Dann bringen wir die Variablen in ihren ursprünglichen Zustand zurück.
void setup(){
So initialisieren Sie ein Feld:
Schalten Sie dann die Antwort auf Mausklicks ein.
Und die Anzeigefunktion nennen wir einmal für jeden Frame.
void draw() { background(0);
Und das ist alles, hier ist unser Minensuchboot.
Das Spiel sieht einfach aus, ist aber insgesamt voll funktionsfähig. Und denken Sie daran: Minesweeper macht süchtig!
Skillbox empfiehlt: