Inhaltsverzeichnis:

Minesweeper-Raspberry-Pi-Edition - Gunook
Minesweeper-Raspberry-Pi-Edition - Gunook

Video: Minesweeper-Raspberry-Pi-Edition - Gunook

Video: Minesweeper-Raspberry-Pi-Edition - Gunook
Video: Minesweeper in Minecraft for Raspberry Pi 2024, Juli
Anonim
Minesweeper-Raspberry-Pi-Edition
Minesweeper-Raspberry-Pi-Edition
Minesweeper-Himbeer-Pi-Edition
Minesweeper-Himbeer-Pi-Edition

Mein letztes Projekt für die CSC 130-Serie an der Louisiana Tech University ist die Minesweeper Raspberry Pi Edition. In diesem Projekt habe ich versucht, das klassische Minesweeper-Spiel nachzubilden, indem ich die Tkinter-Bibliothek der Programmiersprache Python verwendet habe. Das Raster, das das Minesweeper-Spiel umfasst, ist acht Kacheln in der Breite und fünf Kacheln in der Höhe. Die Formatierung des Projekts wurde für die Verwendung eines Raspberry Pis mit installiertem Python 2.7 geeignet und perfektioniert.

Der Code und die Bilder für das Abschlussprojekt der Minesweeper Raspberry Pi Edition können unter folgendem Link heruntergeladen werden:

Minesweeper-Raspberry-Pi-Edition

Lieferungen

x1 Himbeer-Pi

Python 2.7 auf dem Raspberry Pi installiert

Microsoft Powerpoint (oder eine andere Software zum Erstellen von Bildern für Schaltflächen)

Schritt 1: Schaltflächenbilder erstellen

Schaltflächenbilder erstellen
Schaltflächenbilder erstellen

ERLÄUTERUNG:

Jede Schaltfläche, aus der die GUI besteht, muss erstellt werden. Für diese Aufgabe habe ich Microsoft Powerpoint verwendet, um die Bilder zu erstellen, die ich für die Anzeige auf den Schaltflächen benötigte.

Zuerst habe ich die zehn Kachelschaltflächen erstellt, die zum Erstellen des Minesweeper-Rasters (leer, bob, null, eins, zwei, drei, vier, fünf, sechs, sieben und acht) mit Microsoft Powerpoint erforderlich sind.

Zweitens habe ich die vier Bilder für den Menübildschirm (Menüanzeige, Schaltfläche für leichte Schwierigkeit, Schaltfläche für mittlere Schwierigkeit und Schaltfläche für schwere Schwierigkeit) mit Microsoft Powerpoint erstellt.

Drittens habe ich das Bild, das für die Neustart-Schaltfläche benötigt wird, und die Bilder, die für die anderen verschiedenen Anzeigeschaltflächen benötigt werden (eine "Spiel vorbei"-Anzeige, eine "Sie gewinnen"-Anzeige und eine "Regeln"-Anzeige) mit Microsoft Powerpoint erstellt.

Viertens müssen Sie die Größe Ihrer Bilder ändern, damit sie in Ihren Bildschirm passen. Für meinen Rasberry Pi habe ich folgende Abmessungen für das Fenster verwendet (bezogen auf Pixel in Länge und Breite): 432x576.

Schritt 2: Programm formatieren

Programm formatieren
Programm formatieren

ERLÄUTERUNG:

Bevor eine eigentliche Programmierung stattfinden kann, müssen wir die benötigten Bibliotheken importieren und den Hauptteil unseres Programms schreiben.

Zuerst müssen wir * aus der Tkinter-Bibliothek importieren und aus der Zufallsbibliothek mischen. Zweitens müssen wir im Hauptteil des Programms die folgenden Schritte im Code ausführen: Fenster erstellen, Titelfenster festlegen, GUI generieren und GUI anzeigen und auf Benutzerinteraktion warten. Dieser Code ist in der richtigen Formatierung in Bezug auf die Tkinter-Bibliothek geschrieben (sehen Sie sich den Code in der Anleitung an, um die richtige Formatierung zu sehen).

Schritt 3: Erstellen Sie die GUI (Menü & Minesweeper-Raster)

Erstellen Sie die GUI (Menü & Minesweeper-Raster)
Erstellen Sie die GUI (Menü & Minesweeper-Raster)
Erstellen Sie die GUI (Menü & Minesweeper-Raster)
Erstellen Sie die GUI (Menü & Minesweeper-Raster)
Erstellen Sie die GUI (Menü & Minesweeper-Raster)
Erstellen Sie die GUI (Menü & Minesweeper-Raster)
Erstellen Sie die GUI (Menü & Minesweeper-Raster)
Erstellen Sie die GUI (Menü & Minesweeper-Raster)

ERLÄUTERUNG:

Beim Start des Programms wird der Menübildschirm gestartet. Nachdem der Schwierigkeitsgrad ausgewählt wurde (durch Anklicken einer der Schwierigkeitsschaltflächen auf dem Menübildschirm), wird die GUI mit dem Minensucherraster, einer Anzeige und einer Neustartschaltfläche aktualisiert. Da Sie gerade erst mit der Arbeit an der GUI beginnen, müssen wir nur das Menü starten, die Menüschwierigkeitsschaltflächen betriebsbereit machen und die GUI auf den Spielbildschirm mit dem Minesweeper-Raster aktualisieren.

Erstens können wir den Menübildschirm beim Start des Programms anzeigen lassen, indem wir die Methode "setupMenu" im Konstruktor der MainGUI-Klasse aufrufen.

Zweitens können wir jede der Schwierigkeitsschaltflächen des Menüs bestimmte Codezeilen ausführen lassen, wenn sie angeklickt werden, indem wir eine "process" -Methode hinzufügen (muss auch den Befehl lambda: self.process ("returnButtonName") innerhalb der Parameter der verwendeten Schaltflächenfunktion hinzufügen bei der Erstellung jeder Schwierigkeitsschaltfläche). Drei if-else-Anweisungen werden in der Methode "process" erstellt und führen bestimmte andere Methoden und zusätzliche Codezeilen aus, je nachdem, was die Schaltfläche gleicht (Schaltfläche entspricht dem zuletzt registrierten Schaltflächennamen).

Drittens, während der Menübildschirm geöffnet ist und der Benutzer auf eine der Schwierigkeitsschaltflächen klickt, speichert das Programm einen bestimmten Wert in der Variablen "Schwierigkeit" (Schwierigkeit gleich "leicht", "mittel" oder "schwer" basierend auf welche Schwierigkeitsschaltfläche geklickt wird). Dieser Klick auf eine Schaltfläche weiß, welche if-else-Anweisung folgen soll, basierend auf dem zuletzt registrierten Schaltflächennamen (welche Schaltfläche entspricht). es außerhalb der Klasse. So werden wir die Variable "difficulty" als leeren String setzen, bevor die "MainGUI"-Klasse erstellt wird.

Viertens, löschen Sie die GUI der Schaltflächen, die von der Methode "setupMenu" erstellt wurden, indem Sie eine Methode "clearMenu" erstellen (unter Verwendung der Funktion button.destroy() in mehreren Instanzen) und die Methode "clearMenu" in der Methode "process" aufrufen (unter jede der Schwierigkeitstasten registriert sich nach der Zuweisung der Schwierigkeitsvariablen).

Fünftens aktualisieren Sie die GUI, indem Sie eine Methode "setSLASHresetGUI" erstellen (Schaltflächen werden auf die gleiche Weise wie in der Methode "setupMenu" erstellt) und die Methode "setSLASHresetGUI" in der Methode "process" aufrufen (unter jedem der Schwierigkeitsschaltflächen registriert sich nach dem Schwierigkeitsvariablenzuweisung und Aufruf der Methode "clearMenu").

Bevor alle Schaltflächen innerhalb der Methode "setSLASHresetGUI" zugewiesen werden, müssen wir außerdem die Zeilen und Spalten im Raster konfigurieren und nachdem alle Schaltflächen innerhalb der Methode "setSLASHresetGUI" zugewiesen wurden, müssen wir den gesamten Inhalt in das Raster packen (siehe Code im instructable angegeben, um die richtige Formatierung zu sehen).

Schritt 4: Machen Sie die Schaltflächen auf dem In-Game-Bildschirm betriebsbereit

Machen Sie die Schaltflächen auf dem In-Game-Bildschirm betriebsbereit
Machen Sie die Schaltflächen auf dem In-Game-Bildschirm betriebsbereit
Machen Sie die Schaltflächen auf dem In-Game-Bildschirm betriebsbereit
Machen Sie die Schaltflächen auf dem In-Game-Bildschirm betriebsbereit
Machen Sie die Schaltflächen auf dem In-Game-Bildschirm betriebsbereit
Machen Sie die Schaltflächen auf dem In-Game-Bildschirm betriebsbereit
Machen Sie die Schaltflächen auf dem Bildschirm im Spiel betriebsbereit
Machen Sie die Schaltflächen auf dem Bildschirm im Spiel betriebsbereit

ERLÄUTERUNG:

Damit die Schaltflächen beim Anklicken bestimmte Codezeilen ausführen, müssen wir Methoden innerhalb der Methode "process" ausführen. Für diese Aufgabe müssen wir mehrere neue Methoden, Variablen und Listen erstellen.

Zuerst erstellen wir zwei Listen. Es wird eine Liste namens "Grid" geben. Diese "Gitter"-Liste besteht nur aus den ganzen Zahlen 9 und 0. In dieser Liste stehen Neunen für Bomben und Nullen für Nicht-Bomben. So erkennt das Programm, ob eine Kachel eine Bombe ist oder nicht. Es wird eine zweite Liste erstellt, die als "Status" bezeichnet wird. Diese "Status"-Liste besteht nur aus einer Zeichenkette ("0", "1", "2", "3", "4", "5", "6", "7", "8", "b "). In dieser Liste entspricht jede einzelne Zeichenfolge einem bestimmten Bild. Auf diese Weise weiß das Programm, welches Bild auf jeder Schaltfläche im Minesweeper-Raster angezeigt werden soll. Jede Schaltfläche im Minesweeper-Gitter hat einen entsprechenden Index in jeder Liste, basierend auf ihrer Platzierung im Gitter. Der entsprechende Index wird durch das folgende Verfahren zugewiesen (Tastennummer - 1). Der entsprechende Index von Schaltfläche eins in jeder Liste ist beispielsweise der Index null. Schließlich werden diese beiden Listen vor der Ausführung der Klasse "MainGUI" ausgeführt und außerhalb der Klasse "MainGUI" erstellt. Die Klasse "grid" wird als leere Liste erstellt (grid = ) und die Liste "status" wird durch eine Bereichsfunktion erstellt (Hinzufügen von vierzig Einzelzeichenfolgen von "n" zur Liste "status").

Zweitens werden wir verschiedene Methoden entwickeln, die die Anzahl der umliegenden Minen erkennen können und die aufgerufen werden können, wenn eine Schaltfläche angeklickt wird (die Entscheidung, welche Methode ausgeführt werden soll, wird durch die Platzierung der Schaltfläche bestimmt). Genau diese Methoden werden unsere Minenanalysatoren genannt. Diese Methoden inkrementieren einen Zähler namens "NumOfMines" und verwenden bestimmte Indizes innerhalb der "Grid"-Liste, um zu bestimmen, wie viele Bomben die Kachel umgeben. Der String, der in der Variablen "NumOfMines" gespeichert wird, wird verwendet, um denselben entsprechenden Index in der "Status"-Liste zu ersetzen. Jetzt fragen Sie sich vielleicht, woher das Programm den zu verwendenden Index erkennt. Wenn eine Schaltfläche in der Methode "process" registriert wird, wird eine Variable "index" erstellt/einer bestimmten Ganzzahl neu zugewiesen (basierend auf der Zeichenfolge, die die Schaltfläche registriert). Eine der erstellten Methoden verwendet diesen zugewiesenen Index, um die Platzierung der Kachel und die Indizes der sie umgebenden Kacheln zu kennen (der Algorithmus innerhalb der Methode wird dies herausfinden). Um die Variable "index" neu zuzuweisen, müssen wir sie außerdem außerhalb der Klasse instanziieren. Daher werden wir die Variable "index" als ganzzahlige Null vorgeben, bevor die Klasse "MainGUI" erstellt wird.

Drittens werden "Operation"-Methoden erstellt. Jedes Mal, wenn eine Schaltfläche registriert wird, wird eine "Operation"-Methode ausgeführt. Diese "Operation"-Methoden werden in der "process"-Methode ausgeführt. Bei der "process"-Methode bestimmen mehrere if-else-Anweisungen, auf welche Schaltfläche geklickt wurde (basierend auf der Gleichheit der Schaltfläche). Hier wird eine bestimmte "Operation"-Methode aufgerufen (in den if-else-Anweisungen).

Viertens werden wir uns damit befassen, wie die Tasten funktionieren. Wie bereits erwähnt, befinden sich mehrere if-else-Anweisungen in der Methode "process" und führen bestimmte andere Methoden und zusätzliche Codezeilen aus, je nachdem, was die Schaltfläche entspricht (Schaltfläche entspricht der zuletzt registrierten Zeichenfolge). Innerhalb dieser if-else-Anweisungen geschieht Folgendes der Reihe nach: Index wird global zugewiesen, der entsprechende Index in der "status"-Liste wird dem String "b" neu zugewiesen (wenn der entsprechende Index der "grid"-Liste gleich die ganze Zahl Neun), wird eine entsprechende "Operation"-Methode ausgeführt (wenn der entsprechende Index der "Grid"-Liste gleich der Ganzzahl Null ist), wird dieser entsprechende Index in der "Status"-Liste einem String neu zugewiesen, der der Variablen entspricht "NumOfMines" (wenn der entsprechende Index der "grid"-Liste gleich der ganzen Zahl Null ist), und die GUI wird durch den Aufruf der Methode "setSLASHresetGUI" aktualisiert.

Schritt 5: Methode "setDifficulty" & Methode "restart"

Bild
Bild
Bild
Bild

ERLÄUTERUNG:

Als nächstes muss eine "setDifficulty"-Methode erstellt werden und die Neustart-Schaltfläche am unteren Rand des Ingame-Bildschirms muss betriebsbereit sein (indem eine "restart" -Methode erstellt wird, die ausgeführt wird, wenn sie vom Benutzer angeklickt wird).

Zunächst muss die Methode "setDifficulty" in den if-else-Anweisungen der Schwierigkeitsschaltflächen in der Methode "process" und in der Methode "restart" implementiert werden. Die Codezeilen und Methoden, die in dieser Methode ausgeführt werden, sind recht einfach. In der Methode "setDifficulty" werden wir eine bestimmte Anzahl von Nullen (Nicht-Bomben) und Neunen (Bomben) an die "Grid"-Liste anhängen (über zwei Bereichsfunktionen innerhalb jeder if-else-Anweisung) und dann mischen wir die "grid"-Liste (mit der Shuffle-Funktion der Zufallsbibliothek) innerhalb der Methode "setDifficulty" (nachdem die if-else-Anweisungen ausgeführt wurden). Das Verhältnis von Nullen zu Neunen wird dadurch bestimmt, auf welche Zeichenkette die Variable "Schwierigkeit" gesetzt ist ("leicht": 34-6, "mittel": 28-12, "schwer": 16-24).

Zweitens werden wir in der Methode "restart" die Variablen "index" und "NumOfMinesLEFT" global auf Null setzen, sowohl die "status"- als auch die "grid"-Liste global leeren, die "status"-Liste mit einer Bereichsfunktion zurücksetzen (Hinzufügen vierzig einzelne Zeichenfolgen von "n" in die "status"-Liste) und rufen die Methode "setDifficulty" auf.

Schritt 6: Szenarien zum Ende des Spiels

Spielende-Szenarien
Spielende-Szenarien
Spielende-Szenarien
Spielende-Szenarien
Spielende-Szenarien
Spielende-Szenarien
Spielende-Szenarien
Spielende-Szenarien

ERLÄUTERUNG:

Jedes Minesweeper-Spiel hat zwei Spielende-Szenarien: Gewinn und Verlust. Innerhalb dieses Programms werden wir diese beiden Spielende-Szenarien mit zwei neuen Methoden implementieren: einer "You_A_Winner_Son"-Methode und einer "GameOver"-Methode. Bevor die GUI innerhalb der "Prozess"-Methode aktualisiert wird und basierend auf den Indizes, die durch die beiden Spielende-Szenario-Methoden geändert wurden, wird die Anzeigeschaltfläche geändert, um das Ergebnis richtig darzustellen.

Wenn der Benutzer zuerst auf die letzte versteckte Nicht-Bombe-Kachel klickt, muss die Methode "You_A_Winner_Son" ausgeführt werden. Wir werden diese Aufgabe abschließen, indem wir die Methode "You_A_Winner_Son" jedes Mal aufrufen, wenn auf eine Kachel geklickt wird und die Kachel als nicht bombardiert erkannt wird (innerhalb der Methoden "operation", die in der Methode "process" ausgeführt werden). Wenn die Gewinnbedingungen erfüllt sind, werden zwei if-else-Anweisungen innerhalb der Methode "You_A_Winner_Son" ausgeführt. Die erste if-else-Anweisung wird immer ausgeführt, unabhängig davon, ob der Spieler gewonnen hat oder nicht, wenn diese Methode aufgerufen wird. Basierend darauf, was die Variable "Schwierigkeit" ist, ein bestimmter Algorithmus, der bestimmt, wie viele Minen/Bomben versteckt bleiben. Die von diesem Algorithmus gefundene Ganzzahl wird in der Variablen "NumOfMinesLEFT" gespeichert. Als nächstes wird zwischen den beiden if-else-Anweisungen ein weiterer Algorithmus ausgeführt, um die Anzahl der verbleibenden Startkacheln (nicht angeklickte Kacheln) zu ermitteln. Die von diesem Algorithmus gefundene Ganzzahl wird in der Variablen "NumOfStartingTilesLEFT" gespeichert. Die zweite if-else-Anweisung wird immer ausgeführt, unabhängig davon, ob der Spieler gewonnen hat oder nicht, wenn diese Methode aufgerufen wird. Je nachdem, was die Variable "Schwierigkeit" ist, kann eine von drei if-else-Anweisungen ausgeführt werden, wenn ihre Bedingungen erfüllt sind. Die Bedingungen richten sich nach den beiden Variablen "NumOfMinesLEFT" und "NumOfStartingTilesLEFT". Innerhalb dieser drei if-else-Anweisungen wird ein Algorithmus ausgeführt, der jeden Button nutzlos macht (das Spiel ist vorbei).

Zweitens, wenn der Benutzer auf eine der versteckten Bombenkacheln klickt, muss die Methode "GameOver" ausgeführt werden. Wir werden diese Aufgabe abschließen, indem wir die Methode "GameOver" jedes Mal aufrufen, wenn auf eine Kachel geklickt wird und die Kachel als Bombenkachel erkannt wird (innerhalb der Methoden "operation", die in der Methode "process" ausgeführt werden). Wenn die Methode "GameOver" aufgerufen wird, wird ein Algorithmus ausgeführt, der jedes Startplättchen unbrauchbar macht (das Spiel ist vorbei) und die versteckten Bombenplättchen werden aufgedeckt (basierend auf den entsprechenden Indizes innerhalb der "Rasterliste, bestimmte Indizes." in der Liste "status" wird der einstelligen Zeichenfolge "b") neu zugewiesen.

Drittens wird die Anzeige des Bildschirms im Spiel jedes Mal aktualisiert, wenn die GUI aktualisiert wird, indem nur sehr wenige geringfügige Änderungen an der Methode "setSLASHresetGUI" vorgenommen werden. Nachdem das Raster der GUI konfiguriert wurde, werden wir drei if-else-Anweisungen dort platzieren, wo die aktuelle Belegung der Anzeigeschaltfläche platziert wird. Eine der drei if-else-Anweisungen wird basierend auf den folgenden Variablen ausgeführt: "GameOverDETECTOR", "difficulty, "NumOfMinesLEFT" und "NumOfStartingTilesLEFT". Wie Sie sich vielleicht fragen, ist die Variable "GameOverDETECTOR" neu Variable. Diese Variable wird erstellt, bevor die if-else-Anweisungen innerhalb der Methode "setSLASHresetGUI" ausgeführt werden. Die Variable "GameOverDETECTOR" ist gleich der ganzen Zahl, die mit einem Algorithmus gefunden wird, der ermittelt, wie viele Indizes innerhalb des "Grids" sind. list auf die ganze Zahl neunundneunzig neu zugewiesen (wie die Schaltflächen unbrauchbar werden) Je nachdem, welche Bedingungen der if-else-Anweisung erfüllt sind, erfolgt eine entsprechende Neuzuweisung an die Anzeige.

Schritt 7: Den Neustart-Button betriebsbereit machen

Die Neustart-Taste betriebsbereit machen
Die Neustart-Taste betriebsbereit machen

ERLÄUTERUNG:

Dieser Schritt ist zufällig der kürzeste. Die meiste Arbeit für diesen Schritt ist bereits erledigt. Alles, was wir jetzt tun müssen, ist die Methode "restart" jedes Mal auszuführen, wenn der Benutzer auf die Schaltfläche "Neustart" klickt.

Zuerst und zuletzt führen wir die Methode "restart" in der Methode "process" mit einer if-else-Anweisung aus. Wenn die Zeichenfolge "!" registriert ist, dann soll die Methode "restart" ausgeführt werden. Außerdem müssen wir am Ende der Methode "setSLASHresetGUI" eine Schaltfläche namens restart erstellen, bevor der Inhalt des Grids zusammengepackt wird. Diese Neustart-Schaltfläche verarbeitet die Zeichenfolge "!" (Befehl lambda: self.process("!")) und führen Sie die entsprechende "restart"-Methode innerhalb der "process"-Methode aus.