Inhoudsopgave:

Mijnenveger-Raspberry-Pi-editie - Ajarnpa
Mijnenveger-Raspberry-Pi-editie - Ajarnpa

Video: Mijnenveger-Raspberry-Pi-editie - Ajarnpa

Video: Mijnenveger-Raspberry-Pi-editie - Ajarnpa
Video: Minesweeper in Minecraft for Raspberry Pi 2024, Juli-
Anonim
Mijnenveger-Raspberry-Pi-editie
Mijnenveger-Raspberry-Pi-editie
Mijnenveger-Raspberry-Pi-editie
Mijnenveger-Raspberry-Pi-editie

Mijn laatste project voor de CSC 130-serie aan de Louisiana Tech University is de Mijnenveger Raspberry Pi-editie. In dit project probeerde ik het klassieke spel mijnenveger na te bootsen door gebruik te maken van de Tkinter-bibliotheek van de programmeertaal Python. Het raster dat het mijnenvegerspel omvat, is acht tegels breed en vijf tegels hoog. De opmaak van het project is geschikt en geperfectioneerd voor het gebruik van een Raspberry Pi die is geïnstalleerd met Python 2.7.

De code en afbeeldingen voor het eindproject van de Minesweeper Raspberry Pi Edition kunnen worden gedownload via de volgende link:

Mijnenveger-Raspberry-Pi-editie

Benodigdheden

x1 Raspberry Pi

Python 2.7 geïnstalleerd op de Raspberry Pi

Microsoft Powerpoint (of een andere software om afbeeldingen voor knoppen te maken)

Stap 1: Maak knopafbeeldingen

Knopafbeeldingen maken
Knopafbeeldingen maken

UITLEG:

Elke knop waaruit de GUI bestaat, moet worden gemaakt. Voor deze taak heb ik Microsoft Powerpoint gebruikt om de afbeeldingen te maken die ik op de knoppen moest weergeven.

Eerst heb ik de tien tegelknoppen gemaakt die nodig zijn om het mijnenvegerraster te maken (blanco, bob, nul, één, twee, drie, vier, vijf, zes, zeven en acht) met behulp van Microsoft Powerpoint.

Ten tweede heb ik de vier afbeeldingen gemaakt die nodig zijn voor het menuscherm (menuweergave, knop voor gemakkelijke moeilijkheidsgraad, knop voor gemiddelde moeilijkheidsgraad en knop voor harde moeilijkheid) met behulp van Microsoft Powerpoint.

Ten derde heb ik de afbeelding gemaakt die nodig is voor de herstartknop en de afbeeldingen die nodig zijn voor de andere verschillende weergaveknoppen (een 'game over'-weergave, een 'u wint'-weergave en een 'regels'-weergave) met Microsoft Powerpoint.

Ten vierde moet u het formaat van uw afbeeldingen aanpassen zodat ze op uw scherm passen. Voor mijn Rasberry Pi heb ik de volgende afmetingen voor het venster gebruikt (verwijzend naar pixels in lengte en breedte): 432x576.

Stap 2: Programma formatteren

Formaat programma
Formaat programma

UITLEG:

Voordat er daadwerkelijk kan worden geprogrammeerd, moeten we de bibliotheken die we nodig hebben importeren en het grootste deel van ons programma schrijven.

Eerst moeten we * importeren uit de Tkinter-bibliotheek en shuffle uit de willekeurige bibliotheek. Ten tweede moeten we de volgende stappen in code uitvoeren in het hoofdgedeelte van het programma: maak het venster, stel het titelvenster in, genereer de GUI en geef de GUI weer en wacht op gebruikersinteractie. Deze code is in de juiste opmaak geschreven met betrekking tot de Tkinter-bibliotheek (kijk naar de code in de instructie om de juiste opmaak te zien).

Stap 3: Maak de GUI (Menu & Minesweeper Grid)

Maak de GUI (Menu & Minesweeper Grid)
Maak de GUI (Menu & Minesweeper Grid)
Maak de GUI (Menu & Minesweeper Grid)
Maak de GUI (Menu & Minesweeper Grid)
Maak de GUI (Menu & Minesweeper Grid)
Maak de GUI (Menu & Minesweeper Grid)
Maak de GUI (Menu & Minesweeper Grid)
Maak de GUI (Menu & Minesweeper Grid)

UITLEG:

Bij het opstarten van het programma wordt het menuscherm geopend. Nadat de moeilijkheidsgraad is geselecteerd (door op een van de moeilijkheidsknoppen op het menuscherm te klikken), wordt de GUI vernieuwd met het mijnenvegerraster, een display en een herstartknop. Aangezien je net begint met het werken aan de GUI, hoeven we alleen het menu te starten, de moeilijkheidsknoppen van het menu operationeel te maken en de GUI te vernieuwen naar het spelscherm met het mijnenvegerraster.

Ten eerste kunnen we het menuscherm zichzelf laten weergeven bij het opstarten van het programma door de "setupMenu"-methode aan te roepen in de constructor van de MainGUI-klasse.

Ten tweede kunnen we elk van de moeilijkheidsknoppen van het menu bepaalde regels code laten uitvoeren wanneer erop wordt geklikt door een "process" -methode toe te voegen (zal ook het commando lambda: self.process ("returnButtonName") moeten toevoegen binnen de parameters van de gebruikte knopfunctie bij het maken van elke moeilijkheidsknop). Er worden drie if-else-instructies gemaakt in de "process"-methode en voeren bepaalde andere methoden en regels extra code uit, afhankelijk van waar de knop gelijk aan is (knop is gelijk aan de naam van de knop die het laatst is geregistreerd).

Ten derde, terwijl het menuscherm is geopend en de gebruiker op een van de moeilijkheidsknoppen klikt, zal het programma een bepaalde waarde opslaan in de variabele "moeilijkheid" (moeilijkheid is gelijk aan "gemakkelijk", "gemiddeld" of "hard" gebaseerd uit welke moeilijkheidsknop is geklikt. Deze klik op een knop weet welke if-else-instructie moet volgen op basis van de naam van de knop die het laatst is geregistreerd (welke knop is gelijk aan). Bovendien, om de variabele "moeilijkheid" opnieuw toe te wijzen, moeten we eerst instantiëren het buiten de klasse. Dus we zullen de variabele "moeilijkheid" instellen als een lege tekenreeks voordat de klasse "MainGUI" wordt gemaakt.

Ten vierde, wis de GUI van de knoppen die zijn gemaakt met de "setupMenu" -methode door een "clearMenu" -methode te maken (met de functie button.destroy() in meerdere gevallen) en de "clearMenu" -methode aan te roepen in de "process" -methode (onder elk van de moeilijkheidsknoppen registreert zich na de toewijzing van de moeilijkheidsvariabele).

Ten vijfde, ververs de GUI door een "setSLASHresetGUI" -methode te maken (knoppen zijn op dezelfde manier gemaakt als in de "setupMenu" -methode) en de "setSLASHresetGUI" -methode aan te roepen in de "proces" -methode (onder elk van de moeilijkheidsknop registers na de moeilijkheidsgraad toewijzen van variabelen en het aanroepen van de "clearMenu"-methode).

Bovendien, voordat alle knoppen worden toegewezen binnen de "setSLASHresetGUI"-methode, moeten we de rijen en kolommen binnen het raster configureren en nadat alle knoppen zijn toegewezen binnen de "setSLASHresetGUI"-methode, moeten we alle inhoud in het raster inpakken (kijk naar de code gegeven in de instructable om de juiste opmaak te zien).

Stap 4: Maak de knoppen op het in-game scherm operationeel

Maak de knoppen op het in-game scherm operationeel
Maak de knoppen op het in-game scherm operationeel
Maak de knoppen op het in-game scherm operationeel
Maak de knoppen op het in-game scherm operationeel
Maak de knoppen op het in-game scherm operationeel
Maak de knoppen op het in-game scherm operationeel
Maak de knoppen op het in-game scherm operationeel
Maak de knoppen op het in-game scherm operationeel

UITLEG:

Om ervoor te zorgen dat de knoppen bepaalde regels code uitvoeren wanneer erop wordt geklikt, moeten we methoden uitvoeren binnen de "proces"-methode. Voor deze taak zullen we meerdere nieuwe methoden, variabelen en lijsten moeten maken.

Eerst maken we twee lijsten. Er zal een lijst zijn met de naam "grid". Deze "raster"-lijst zal alleen uit de gehele getallen 9 en 0 bestaan. In deze lijst staan negens voor bommen en nullen voor niet-bommen. Dit is hoe het programma zal onderscheiden of een tegel een bom is of niet. Er wordt een tweede lijst gemaakt, die "status" wordt genoemd. Deze "status"-lijst bestaat uit slechts één tekenreeks ("0", "1", "2", "3", "4", "5", "6", "7", "8", "b "). In deze lijst komt elke tekenreeks overeen met een bepaalde afbeelding. Dit is hoe het programma weet welke afbeelding op elke knop in het mijnenvegerraster moet worden weergegeven. Elke knop in het mijnenvegerraster heeft een overeenkomstige index in elke lijst op basis van de plaatsing in het raster. De bijbehorende index wordt toegewezen door de volgende procedure (knopnummer - 1). De overeenkomstige index van knop één in elke lijst is bijvoorbeeld index nul. Ten slotte zullen deze twee lijsten worden uitgevoerd voordat de "MainGUI"-klasse wordt uitgevoerd en buiten de "MainGUI"-klasse worden gemaakt. De klasse "raster" wordt gemaakt als een lege lijst (raster = ) en de lijst "status" wordt gemaakt door een bereikfunctie (toevoegen van veertig enkele tekenreeksen van "n" aan de lijst "status").

Ten tweede zullen we verschillende methoden maken die het aantal mijnen eromheen kunnen detecteren en die kunnen worden opgeroepen wanneer op een knop wordt geklikt (de beslissing welke methode moet worden uitgevoerd, wordt bepaald door de plaatsing van de knop). Deze methodes zullen onze mijnanalysatoren worden genoemd. Deze methoden verhogen een teller genaamd "NumOfMines" en gebruiken bepaalde indexen in de "raster"-lijst om te bepalen hoeveel bommen de tegel omringen. De string die wordt opgeslagen in de variabele "NumOfMines" zal worden gebruikt om dezelfde corresponderende index in de "status" lijst te vervangen. Nu vraag je je misschien af hoe het programma weet welke index het moet gebruiken. Wanneer een knop is geregistreerd in de "process"-methode, wordt een variabele "index" gemaakt/opnieuw toegewezen aan een bepaald geheel getal (op basis van welke string de knop registreert). Een van de gemaakte methoden zal die toegewezen index gebruiken om de plaatsing van de tegel en de indexen van de tegels eromheen te kennen (het algoritme binnen de methode zal dit uitzoeken). Bovendien moeten we, om de variabele "index" opnieuw toe te wijzen, deze eerst buiten de klas instantiëren. Dus we zullen de variabele "index" vooraf instellen als het gehele getal nul voordat de klasse "MainGUI" wordt gemaakt.

Ten derde zullen "operatie"-methoden worden gecreëerd. Elke keer dat een knop wordt geregistreerd, wordt een "operatie"-methode uitgevoerd. Deze "operatie"-methoden worden uitgevoerd in de "proces"-methode. In de "process"-methode bepalen meerdere if-else-instructies op welke knop is geklikt (op basis van wat de knop is). Dit is waar een bepaalde "operatie"-methode wordt aangeroepen (in de if-else-instructies).

Ten vierde zullen we ingaan op hoe de knoppen operationeel worden. Zoals eerder vermeld, bevinden meerdere if-else-instructies zich in de "proces"-methode en voeren bepaalde andere methoden en regels extra code uit, afhankelijk van waar de knop gelijk aan is (knop is gelijk aan de string die het laatst is geregistreerd). Binnen deze if-else-statements zal het volgende in volgorde plaatsvinden: index zal globaal worden toegewezen, die corresponderende index in de "status" lijst zal opnieuw worden toegewezen aan de string "b" (als de corresponderende index van de "raster" lijst gelijk is aan het gehele getal negen), wordt een overeenkomstige "operatie"-methode uitgevoerd (als de overeenkomstige index van de "raster"-lijst gelijk is aan het gehele getal nul), zal die overeenkomstige index in de "status"-lijst opnieuw worden toegewezen aan een string die gelijk is aan de variabele "NumOfMines" (als de corresponderende index van de "grid"-lijst gelijk is aan het gehele getal nul), en de GUI wordt vernieuwd door de "setSLASHresetGUI"-methode aan te roepen.

Stap 5: "setDifficulty"-methode & "restart"-methode

Afbeelding
Afbeelding
Afbeelding
Afbeelding

UITLEG:

Vervolgens moet een "setDifficulty" -methode worden gemaakt en moet de herstartknop onderaan het in-game-scherm operationeel worden (door een "restart" -methode te creëren die wordt uitgevoerd wanneer erop wordt geklikt door de gebruiker).

Eerst moet de "setDifficulty"-methode worden geïmplementeerd in de if-else-instructies van de moeilijkheidsknoppen in de "process"-methode en in de "restart"-methode. De regels code en methoden die in deze methode worden uitgevoerd, zijn vrij eenvoudig. In de "setDifficulty"-methode voegen we een bepaalde hoeveelheid nullen (niet-bommen) en negens (bommen) toe aan de "raster"-lijst (via twee bereikfuncties binnen elke if-else-instructie), en dan zullen we de "grid" lijst (met de willekeurige bibliotheek shuffle functie) binnen de "setDifficulty" methode (nadat de if-else statements zijn uitgevoerd). De verhouding van nullen tot negens wordt bepaald door de string waarop de variabele "moeilijkheidsgraad" is ingesteld ("eenvoudig": 34-6, "gemiddeld": 28-12, "hard": 16-24).

Ten tweede zullen we in de "restart"-methode de variabelen "index" en "NumOfMinesLEFT" globaal op nul stellen, zowel de "status"- als de "grid" -lijsten globaal leegmaken, de "status" -lijst resetten met een bereikfunctie (toevoegen veertig enkelvoudige tekenreeksen van "n" naar de "status"-lijst), en gebruik de "setDifficulty"-methode.

Stap 6: Scenario's voor het beëindigen van het spel

Scenario's voor het beëindigen van het spel
Scenario's voor het beëindigen van het spel
Scenario's voor het beëindigen van het spel
Scenario's voor het beëindigen van het spel
Scenario's voor het beëindigen van het spel
Scenario's voor het beëindigen van het spel
Scenario's voor het beëindigen van het spel
Scenario's voor het beëindigen van het spel

UITLEG:

Elk mijnenvegerspel heeft twee scenario's voor het beëindigen van het spel: winnen en verliezen. Binnen dit programma zullen we deze twee scenario's voor het beëindigen van het spel implementeren met twee nieuwe methoden: een "You_A_Winner_Son"-methode en een "GameOver"-methode. Voordat de GUI wordt vernieuwd binnen de "proces"-methode en op basis van de indexen die zijn gewijzigd door de twee scenario-methoden voor het beëindigen van het spel, wordt de weergaveknop gewijzigd om de uitkomst correct weer te geven.

Ten eerste, wanneer de gebruiker op de laatste verborgen niet-bomtegel klikt, moet de "You_A_Winner_Son"-methode worden uitgevoerd. We zullen deze taak voltooien door de "You_A_Winner_Son"-methode aan te roepen elke keer dat er op een tegel wordt geklikt en de tegel een niet-bomtegel blijkt te zijn (binnen de "operatie"-methoden die worden uitgevoerd in de "proces"-methode). Als aan de winnende voorwaarden is voldaan, worden twee if-else-instructies binnen de "You_A_Winner_Son"-methode uitgevoerd. De eerste if-else-opdracht wordt altijd uitgevoerd, ongeacht of de speler heeft gewonnen of niet wanneer deze methode wordt aangeroepen. Op basis van waar de variabele "moeilijkheid" gelijk aan is, een bepaald algoritme dat bepaalt hoeveel mijnen/bommen er verborgen blijven. Het gehele getal dat door dit algoritme wordt gevonden, wordt opgeslagen in de variabele "NumOfMinesLEFT". Vervolgens wordt tussen de twee if-else-instructies een ander algoritme uitgevoerd om het aantal resterende starttegels te vinden (niet-geklikte tegels). Het gehele getal dat door dit algoritme wordt gevonden, wordt opgeslagen in de variabele "NumOfStartingTilesLEFT". Het tweede if-else statement wordt altijd uitgevoerd, ongeacht of de speler heeft gewonnen of niet wanneer deze methode wordt aangeroepen. Op basis van waar de variabele "moeilijkheid" gelijk aan is, kan een van de drie if-else-instructies worden uitgevoerd als aan hun voorwaarden wordt voldaan. De voorwaarden zijn gebaseerd op wat de twee variabelen "NumOfMinesLEFT" en "NumOfStartingTilesLEFT" gelijk zijn aan. Binnen deze drie if-else-statements wordt een algoritme uitgevoerd dat elke knop onbruikbaar maakt (het spel is afgelopen).

Ten tweede, wanneer de gebruiker op een van de verborgen bomtegels klikt, moet de "GameOver"-methode worden uitgevoerd. We zullen deze taak voltooien door de "GameOver"-methode aan te roepen elke keer dat er op een tegel wordt geklikt en de tegel een bomtegel blijkt te zijn (binnen de "operatie"-methoden die worden uitgevoerd in de "process"-methode). Wanneer de "GameOver"-methode wordt gebruikt, wordt een algoritme uitgevoerd dat elke starttegel onbruikbaar maakt (het spel is afgelopen) en de verborgen bomtegels worden onthuld (op basis van de overeenkomstige indexen in de "rasterlijst, bepaalde indexen in de lijst "status" wordt opnieuw toegewezen aan de tekenreeks "b" van één teken).

Ten derde zal de weergave van het in-game scherm elke keer dat de GUI wordt vernieuwd, worden bijgewerkt door heel weinig kleine wijzigingen aan te brengen in de "setSLASHresetGUI"-methode. Nadat het raster van de GUI is geconfigureerd, zullen we drie if-else-instructies plaatsen waar de huidige toewijzing van de weergaveknop wordt geplaatst. Een van de drie if-else-instructies wordt uitgevoerd op basis van wat de volgende variabelen zijn: "GameOverDETECTOR", "difficulty, "NumOfMinesLEFT" en "NumOfStartingTilesLEFT". Zoals je je misschien afvraagt, is de variabele "GameOverDETECTOR" een nieuwe variabele. Deze variabele wordt gemaakt vlak voordat de if-else-instructies worden uitgevoerd binnen de "setSLASHresetGUI"-methode. De variabele "GameOverDETECTOR" is gelijk aan het gehele getal dat wordt gevonden met behulp van een algoritme dat bepaalt hoeveel indexen binnen het "raster" list opnieuw zijn toegewezen aan het gehele getal negenennegentig (hoe de knoppen onbruikbaar worden gemaakt) Op basis van welke if-else-verklaring aan de voorwaarden is voldaan, zal een overeenkomstige nieuwe toewijzing aan het display plaatsvinden.

Stap 7: De herstartknop operationeel maken

De herstartknop operationeel maken
De herstartknop operationeel maken

UITLEG:

Deze stap is toevallig de kortste. Het meeste werk voor deze stap is al gedaan. Het enige dat we nu hoeven te doen, is de "restart"-methode uitvoeren telkens wanneer de gebruiker op de herstartknop klikt.

Ten eerste en als laatste zullen we de "restart"-methode in de "proces"-methode uitvoeren met een if-else-statement. Als de tekenreeks "!" is geregistreerd, wordt de "restart"-methode uitgevoerd. We zullen ook een knop moeten maken met de naam herstart aan het einde van de "setSLASHresetGUI"-methode voordat de inhoud van het raster wordt samengepakt. Deze herstartknop verwerkt de string "!" (commando lambda: self.process("!")) en voer de corresponderende "restart"-methode uit binnen de "process"-methode.

Aanbevolen: