Innehållsförteckning:

Minesweeper-Raspberry-Pi-Edition: 7 steg (med bilder)
Minesweeper-Raspberry-Pi-Edition: 7 steg (med bilder)

Video: Minesweeper-Raspberry-Pi-Edition: 7 steg (med bilder)

Video: Minesweeper-Raspberry-Pi-Edition: 7 steg (med bilder)
Video: NileRed Drops His Bromine! 2024, Juli
Anonim
Minesweeper-Raspberry-Pi-Edition
Minesweeper-Raspberry-Pi-Edition
Minesweeper-Raspberry-Pi-Edition
Minesweeper-Raspberry-Pi-Edition

Mitt sista projekt för CSC 130 -serien vid Louisiana Tech University är Minesweeper Raspberry Pi Edition. I detta projekt försökte jag återskapa det klassiska spelet minesvepare genom att använda Tkinter -biblioteket för Python -programmeringsspråket. Rutnätet som gruvindustrispelet omfattar är åtta brickor i bredd och fem brickor i höjd. Formateringen av projektet har anpassats och perfekt för användning av en Raspberry Pi installerad med Python 2.7.

Koden och bilderna för det slutliga projektet Minesweeper Raspberry Pi Edition kan laddas ner på följande länk:

Minesweeper-Raspberry-Pi-Edition

Tillbehör

x1 Raspberry Pi

Python 2.7 installerad på Raspberry Pi

Microsoft Powerpoint (eller annan programvara för att skapa bilder för knappar)

Steg 1: Skapa knappbilder

Skapa knappbilder
Skapa knappbilder

FÖRKLARING:

Varje knapp som utgör GUI måste skapas. För denna uppgift använde jag Microsoft Powerpoint för att göra de bilder jag behövde visa på knapparna.

Först skapade jag de tio kakelknappar som behövs för att göra minsvepnätet (tomt, bob, noll, ett, två, tre, fyra, fem, sex, sju och åtta) med Microsoft Powerpoint.

För det andra gjorde jag de fyra bilder som behövs för menyskärmen (menyvisning, knapp för lätt svårighet, knapp för medel svårighet och knapp för svår svårighet) med Microsoft Powerpoint.

För det tredje skapade jag den bild som behövs för omstartsknappen och bilderna som behövs för de andra olika visningsknapparna (en "game over" -skärm, en "du vinner" -skärm och en "regler" -visning) med Microsoft Powerpoint.

För det fjärde måste du ändra storlek på dina bilder så att de passar in på skärmen. För min Rasberry Pi använde jag följande dimensioner för fönstret (med hänvisning till pixlar i längd och bredd): 432x576.

Steg 2: Formatera program

Formatera program
Formatera program

FÖRKLARING:

Innan någon egentlig programmering kan äga rum måste vi importera de bibliotek vi behöver och skriva huvuddelen av vårt program.

Först måste vi importera * från Tkinter -biblioteket och blanda från det slumpmässiga biblioteket. För det andra måste vi slutföra följande steg i kod inom programmets huvuddel: skapa fönstret, ställ in titelfönstret, skapa GUI och visa GUI och vänta på användarinteraktion. Denna kod är skriven i korrekt formatering med avseende på Tkinter -biblioteket (titta på koden som ges i instruktionsboken för att se korrekt formatering).

Steg 3: Skapa GUI (Menu & Minesweeper Grid)

Skapa GUI (Menu & Minesweeper Grid)
Skapa GUI (Menu & Minesweeper Grid)
Skapa GUI (Menu & Minesweeper Grid)
Skapa GUI (Menu & Minesweeper Grid)
Skapa GUI (Menu & Minesweeper Grid)
Skapa GUI (Menu & Minesweeper Grid)
Skapa GUI (Menu & Minesweeper Grid)
Skapa GUI (Menu & Minesweeper Grid)

FÖRKLARING:

När programmet startas ska menyskärmen startas. Efter att svårighetsgraden har valts (genom att klicka på en av svårighetsknapparna på menyskärmen), ska GUI uppdateras med gruvsvegrutnätet, en display och en omstartsknapp. Eftersom du precis har börjat arbeta med GUI behöver vi bara få menyn att starta, få knapparna för menyproblem att fungera och få GUI att uppdatera till spelskärmen med minesvepnätet.

Först kan vi få menyskärmen att visa sig själv vid start av programmet genom att anropa "setupMenu" -metoden inom konstruktören av MainGUI -klassen.

För det andra kan vi låta var och en av menyens svårighetsknappar köra vissa kodrader när de klickas genom att lägga till en "process" -metod (måste också lägga till kommando lambda: self.process ("returnButtonName") inom parametrarna för knappfunktionen som används i skapandet av varje svårighetsknapp). Tre if-else-satser kommer att skapas i "process" -metoden och exekvera vissa andra metoder och rader med ytterligare kod beroende på vad knappen är lika med (knappen är lika med det knappnamn som senast registrerades).

För det tredje, medan menyskärmen är uppe och om användaren klickar på en av svårighetsknapparna, kommer programmet att spara ett visst värde till variabeln "svårighetsgrad" (svårigheten är lika med "lätt", "medel" eller "hårt" baserat av vilken svårighetsknapp som klickas). Detta klick på en knapp vet vilken if-else-sats som ska följas baserat på vilket knappnamn som senast registrerades (vilken knapp är lika). Dessutom måste vi först omedelbart tilldela variabeln "svårighetsgrad" så vi kommer att ställa in variabeln "svårighetsgrad" som en tom sträng innan "MainGUI" -klassen skapas.

Fjärde, rensa GUI för knapparna som görs med "setupMenu" -metoden genom att göra en "clearMenu" -metod (med funktionen button.destroy () i flera instanser) och anropa "clearMenu" -metoden i "process" -metoden (under var och en av svårighetsknapparna registreras efter svårighetsvariabelns tilldelning).

För det femte, uppdatera GUI genom att göra en "setSLASHresetGUI" -metod (knapparna görs på samma sätt som i "setupMenu" -metoden) och anropa "setSLASHresetGUI" -metoden i "process" -metoden (under var och en av svårighetsknapparna registreras efter svårighetsvariabel tilldelning och att kalla "clearMenu" -metoden).

Innan alla knappar tilldelas inom metoden "setSLASHresetGUI" måste vi dessutom konfigurera raderna och kolumnerna i rutnätet och efter att alla knappar har tilldelats inom "setSLASHresetGUI" -metoden måste vi packa allt innehåll i rutnätet (titta på kod som anges i instruktionsboken för att se korrekt formatering).

Steg 4: Gör knapparna på skärmen i spelet fungerande

Gör knapparna på skärmen i spelet funktionsdugliga
Gör knapparna på skärmen i spelet funktionsdugliga
Gör knapparna på skärmen i spelet funktionsdugliga
Gör knapparna på skärmen i spelet funktionsdugliga
Gör knapparna på skärmen i spelet funktionsdugliga
Gör knapparna på skärmen i spelet funktionsdugliga
Gör knapparna på skärmen i spelet funktionsdugliga
Gör knapparna på skärmen i spelet funktionsdugliga

FÖRKLARING:

För att knapparna ska köra vissa kodrader när de klickas måste vi köra metoder inom "process" -metoden. För denna uppgift måste vi göra flera nya metoder, variabler och listor.

Först kommer vi att göra två listor. Det kommer att finnas en lista som heter "rutnät". Denna "rutnät" -lista kommer endast att bestå av heltal 9 och 0. I den här listan representerar nio bomber och nollor representerar icke-bomber. Så här kommer programmet att skilja om en kakel är en bomb eller inte. En andra lista kommer att göras, och den kommer att kallas "status". Denna "status" -lista består av endast en teckensträng ("0", "1", "2", "3", "4", "5", "6", "7", "8", "b "). I den här listan kommer var och en teckensträng att motsvara en viss bild. Så här kommer programmet att veta vilken bild som ska visas på varje knapp i gruvfältets rutnät. Varje knapp i gruvsvejarnätet kommer att ha ett motsvarande index i varje lista baserat på dess placering i rutnätet. Motsvarande index tilldelas enligt följande procedur (knappnummer - 1). Till exempel är knappens motsvarande index i varje lista indexnoll. Slutligen körs dessa två listor innan "MainGUI" -klassen körs och skapas utanför "MainGUI" -klassen. "Grid" -klassen skapas som en tom lista (rutnät = ) och "status" -listan skapas av en intervallfunktion (lägger till fyrtio strängar med "n" i "status" -listan).

För det andra kommer vi att göra olika metoder som kan upptäcka antalet gruvor som omger den och som kan användas när en knapp klickas (beslutet om vilken metod som ska utföras bestäms av knappens placering). Just dessa metoder kommer att kallas våra gruvanalysatorer. Dessa metoder kommer att öka en räknare som kallas "NumOfMines" och kommer att använda vissa index i listan "rutnät" för att bestämma hur många bomber som omger brickan. Strängen som kommer att lagras inom variabeln "NumOfMines" kommer att användas för att ersätta samma motsvarande index i "status" -listan. Nu kan du undra hur programmet kommer att veta vilket index som ska användas. När en knapp registreras i "process" -metoden skapas/tilldelas ett variabelt "index" till ett visst heltal (baserat på vilken sträng knappen registrerar). En av metoderna som skapas kommer att använda det tilldelade indexet för att veta placeringen av brickan och indexen för brickorna som omger den (algoritm inom metoden kommer att räkna ut detta). För att tilldela variabeln "index" igen måste vi först instansiera den utanför klassen. Så vi kommer att förinställa variabeln "index" som heltalet innan "MainGUI" -klassen skapas.

För det tredje kommer "operation" -metoder att skapas. En "operation" -metod kommer att köras varje gång en knapp registreras. Dessa "drift" -metoder kommer att köras i "process" -metoden. I "process" -metoden kommer flera if-else-satser att avgöra vilken knapp som klickades (baserat på vad knappen är lika med). Det är här en viss "operation" -metod kommer att användas (i if-else-uttalandena).

För det fjärde kommer vi faktiskt in på hur knapparna fungerar. Som nämnts tidigare finns flera if-else-satser i "process" -metoden och kör vissa andra metoder och rader med ytterligare kod beroende på vad knappen är lika med (knappen är lika oavsett vilken sträng som senast registrerades). Inom dessa if-else-satser kommer följande att ske i ordning: index kommer att tilldelas globalt, att motsvarande index i "status" -listan tilldelas strängen "b" igen (om motsvarande index för "rutnät" -listan är lika med heltalet nio), kommer en motsvarande "operation" -metod att utföras (om motsvarande index för "rutnät" -listan är lika med heltalet noll), kommer motsvarande index i "status" -listan att tilldelas en sträng som är lika med variabeln "NumOfMines" (om motsvarande index för "rutnät" -listan är lika med heltalet), och GUI uppdateras genom att anropa metoden "setSLASHresetGUI".

Steg 5: Metoden "setDifidity" och "omstart"

Bild
Bild
Bild
Bild

FÖRKLARING:

Därefter måste en "setDificiency" -metod skapas och omstartsknappen längst ner på spelskärmen måste bli operativ (genom att skapa en "omstart" -metod för att den ska kunna köras när den klickas av användaren).

Först måste metoden "setDificiency" implementeras i if-else-uttalandena för svårighetsknapparna i "process" -metoden och i "omstart" -metoden. Kodraderna och metoderna som utförs i denna metod är ganska enkla. I metoden "setDificiency" lägger vi till en viss mängd nollor (icke-bomber) och nior (bomber) till "rutnät" -listan (via två intervallfunktioner inom varje if-else-sats), och sedan blandar vi "grid" -lista (med slumpmässigt biblioteks blandningsfunktion) inom metoden "setDificiency" (efter att if-else-satser har körts). Förhållandet mellan nollor och nio bestäms av vilken sträng variabeln "svårighetsgrad" är inställd på ("lätt": 34-6, "medium": 28-12, "hårt": 16-24).

För det andra, i "omstart" -metoden kommer vi att ställa in variablerna "index" och "NumOfMinesLEFT" till noll globalt, töm både "status" och "rutnät" -listorna globalt, återställ "status" -listan med en intervallfunktion (lägg till fyrtio enstaka teckensträngar med "n" till "status" -listan), och anropa "setDificiency" -metoden.

Steg 6: Spelslutande scenarier

Spelslutande scenarier
Spelslutande scenarier
Spelslutande scenarier
Spelslutande scenarier
Spelslutande scenarier
Spelslutande scenarier
Spelslutande scenarier
Spelslutande scenarier

FÖRKLARING:

Varje minesveparspel har två scenarier som slutar med spelet: vinst och förlust. Inom detta program kommer vi att implementera dessa två spelslutande scenarier med två nya metoder: en "You_A_Winner_Son" -metod och en "GameOver" -metod. Innan GUI uppdateras inom "process" -metoden och baserat på indexen som ändrats av de två metoderna som slutar med spelet, kommer displayknappen att ändras för att korrekt representera resultatet.

Först när användaren klickar på den sista dolda icke-bombplattan måste metoden "You_A_Winner_Son" köras. Vi kommer att slutföra den här uppgiften genom att använda "You_A_Winner_Son" -metoden varje gång du klickar på en bricka och det visar sig att den är en icke-bombkakel (inom "operation" -metoderna som utförs i "process" -metoden). Om de vinnande villkoren är uppfyllda kommer två if-else-uttalanden inom metoden "You_A_Winner_Son" att köras. Det första if-else-uttalandet kommer alltid att utföras oavsett om spelaren vann eller inte när denna metod används. Baserat på vad variabeln "svårighet" är lika med, en viss algoritm som avgör hur många gruvor/bomber som lämnas gömda. Heltalet som hittas av denna algoritm sparas i variabeln "NumOfMinesLEFT". Därefter, mellan de två if-else-satsen kommer en annan algoritm att köras för att hitta antalet kvarvarande brickor (oklickade brickor). Heltalet som hittas av denna algoritm sparas i variabeln "NumOfStartingTilesLEFT". Det andra if-else-uttalandet kommer alltid att utföras oavsett om spelaren vann eller inte när denna metod används. Baserat på vad variabeln "svårighet" är lika med kan ett av tre if-else-uttalanden köras om deras villkor är uppfyllda. Villkoren kommer att baseras på vad de två variablerna "NumOfMinesLEFT" och "NumOfStartingTilesLEFT" är lika med. Inom dessa tre if-else-uttalanden kommer en algoritm att köras som gör varje knapp värdelös (spelet är över).

För det andra, när användaren klickar på en av de dolda bombplattorna, måste "GameOver" -metoden köras. Vi kommer att slutföra denna uppgift genom att använda "GameOver" -metoden varje gång ett klick klickas och brickan befinner sig vara en bombkakel (inom "operation" -metoderna som utförs i "process" -metoden). När "GameOver" -metoden används, körs en algoritm som gör varje startbricka värdelös (spelet är över) och de dolda bombbrickorna avslöjas (baserat på motsvarande index i "rutnätlistan, vissa index i "status" -listan kommer att tilldelas enstaka strängen "b").

För det tredje kommer visningen av skärmen i spelet att uppdateras varje gång GUI uppdateras genom att göra väldigt få mindre ändringar av metoden "setSLASHresetGUI". Efter att rutnätet för GUI har konfigurerats kommer vi att placera tre if-else-satser där den aktuella displayknappstilldelningen är placerad. En av de tre if-else-satserna kommer att köras baserat på vad följande variabler är lika med: "GameOverDETECTOR", "svårighet", "NumOfMinesLEFT" och "NumOfStartingTilesLEFT". Som du kanske undrar är variabeln "GameOverDETECTOR" en ny variabel. Denna variabel skapas precis innan if-else-satserna körs inom metoden "setSLASHresetGUI". Variabeln "GameOverDETECTOR" kommer att vara lika med heltalet som hittas med en algoritm som hittar hur många index i "rutnätet" list har omfördelats till heltalet nittionio (hur knapparna görs värdelösa). Baserat på om if-else-satsens villkor är uppfyllda, kommer en motsvarande tilldelning till displayen att ske.

Steg 7: Gör omstartsknappen operativ

Gör omstartsknappen operativ
Gör omstartsknappen operativ

FÖRKLARING:

Detta steg råkar vara det kortaste. Det mesta av arbetet för detta steg har redan gjorts. Allt vi behöver göra nu är att köra "omstart" -metoden varje gång användaren klickar på omstartsknappen.

Först och sist kommer vi att köra "omstart" -metoden i "process" -metoden med en if-else-sats. Om strängen "!" är registrerad, ska "omstart" -metoden köras. Vi måste också skapa en knapp som kallas omstart i slutet av metoden "setSLASHresetGUI" innan innehållet i rutnätet packas ihop. Denna omstartsknapp kommer att behandla strängen "!" (kommando lambda: self.process ("!")) och kör motsvarande "restart" -metod inom "process" -metoden.

Rekommenderad: