Indholdsfortegnelse:

Minesweeper-Raspberry-Pi-Edition: 7 trin (med billeder)
Minesweeper-Raspberry-Pi-Edition: 7 trin (med billeder)

Video: Minesweeper-Raspberry-Pi-Edition: 7 trin (med billeder)

Video: Minesweeper-Raspberry-Pi-Edition: 7 trin (med billeder)
Video: NileRed Drops His Bromine! 2024, Juli
Anonim
Minestryger-Hindbær-Pi-udgave
Minestryger-Hindbær-Pi-udgave
Minestryger-Hindbær-Pi-udgave
Minestryger-Hindbær-Pi-udgave

Mit sidste projekt for CSC 130 -serien ved Louisiana Tech University er Minesweeper Raspberry Pi Edition. I dette projekt forsøgte jeg at genskabe det klassiske minesweeper -spil ved at bruge Tkinter -biblioteket i Python -programmeringssproget. Gitteret, som minestryger -spillet omfatter, er otte brikker i bredden og fem fliser i højden. Formateringen af projektet er blevet tilpasset og perfektioneret til brug af en Raspberry Pi installeret med Python 2.7.

Koden og billederne til Minesweeper Raspberry Pi Edition sidste projekt kan downloades på følgende link:

Minestryger-Hindbær-Pi-udgave

Forbrugsvarer

x1 Raspberry Pi

Python 2.7 installeret på Raspberry Pi

Microsoft Powerpoint (eller anden software til at oprette billeder til knapper)

Trin 1: Opret knapbilleder

Opret knapbilleder
Opret knapbilleder

FORKLARING:

Hver knap, der udgør GUI, skal oprettes. Til denne opgave brugte jeg Microsoft Powerpoint til at lave de billeder, jeg skulle vise på knapperne.

Først oprettede jeg de ti fliseknapper, der var nødvendige for at lave minestrygerens gitter (tomt, bob, nul, en, to, tre, fire, fem, seks, syv og otte) ved hjælp af Microsoft Powerpoint.

For det andet lavede jeg de fire billeder, der var nødvendige til menuskærmen (menudisplay, knap til let sværhedsgrad, knap til middel sværhedsgrad og knap til sværhedsgrad) ved hjælp af Microsoft Powerpoint.

For det tredje oprettede jeg det billede, der er nødvendigt til genstartsknappen, og de billeder, der er nødvendige til de andre forskellige displayknapper (et "game over" display, et "du vinder" display og et "regler" display) ved hjælp af Microsoft Powerpoint.

For det fjerde skal du ændre størrelsen på dine billeder, så de passer ind i din skærm. Til min Rasberry Pi brugte jeg følgende dimensioner for vinduet (henviser til pixel i længde og bredde): 432x576.

Trin 2: Formater program

Formatér program
Formatér program

FORKLARING:

Inden en egentlig programmering kan finde sted, skal vi importere de biblioteker, vi har brug for, og skrive hoveddelen af vores program.

Først skal vi importere * fra Tkinter -biblioteket og blande fra det tilfældige bibliotek. For det andet skal vi fuldføre følgende trin i kode inden for programmets hoveddel: opret vinduet, indstil titelvinduet, generer GUI, og vis GUI og vent på brugerinteraktion. Denne kode er skrevet i korrekt formatering i forhold til Tkinter -biblioteket (se på koden, der er angivet i instruktionsbogen, for at se korrekt formatering).

Trin 3: Opret GUI (Menu & Minesweeper Grid)

Opret GUI (Menu & Minesweeper Grid)
Opret GUI (Menu & Minesweeper Grid)
Opret GUI (Menu & Minesweeper Grid)
Opret GUI (Menu & Minesweeper Grid)
Opret GUI (Menu & Minesweeper Grid)
Opret GUI (Menu & Minesweeper Grid)
Opret GUI (Menu & Minesweeper Grid)
Opret GUI (Menu & Minesweeper Grid)

FORKLARING:

Når programmet startes, startes menuskærmen. Efter at vanskeligheden er valgt (ved at klikke på en af vanskelighedsknapperne på menuskærmen), opdateres GUI'en med minestrygergitteret, et display og en genstartsknap. Da du lige er begyndt at arbejde på GUI'en, behøver vi kun at få menuen til at starte, få knapperne i menuens vanskeligheder til at fungere og få GUI til at opdatere til spilskærmen med minestryger -gitteret.

For det første kan vi få menuskærmen til at vise sig selv ved opstart af programmet ved at kalde "setupMenu" -metoden inden for konstruktøren af MainGUI -klassen.

For det andet kan vi få hver af menuens vanskelighedsknapper til at udføre bestemte kodelinjer, når der klikkes på dem ved at tilføje en "proces" -metode (skal også tilføje kommando lambda: self.process ("returnButtonName") inden for parametrene for den anvendte knapfunktion ved oprettelsen af hver vanskelighedsknap). Tre if-else-sætninger vil blive oprettet i "proces" -metoden og udføre visse andre metoder og linjer med ekstra kode afhængigt af, hvad knappen er lig med (knappen er lig med det knapnavn, der sidst blev registreret).

For det tredje, mens menuskærmen er oppe, og hvis brugeren klikker på en af vanskelighedsknapperne, gemmer programmet en vis værdi i variablen "vanskelighedsgrad" (sværhedsgrad er lig med "let", "medium" eller "hård" baseret fra hvilken vanskeligheds knap der klikkes på). Dette klik på en knap ved hvilken if-else-sætning der skal følges baseret på hvilket knapnavn der sidst blev registreret (hvilken knap er lig med). Desuden skal vi først tilskrive variablen "vanskelighedsgrad" først Det vil være uden for klassen. Så vi angiver variablen "vanskeligheder" som en tom streng, før "MainGUI" -klassen oprettes.

For det fjerde skal du rydde GUI'en for de knapper, der er lavet med "setupMenu" -metoden ved at lave en "clearMenu" -metode (ved hjælp af funktionen button.destroy () i flere tilfælde) og kalde "clearMenu" -metoden i "proces" -metoden (under hver af vanskelighedsknappen registreres efter vanskelighedsvariabeltildelingen).

For det femte skal du opdatere GUI'en ved at lave en "setSLASHresetGUI" -metode (knapper laves på samme måde som i "setupMenu" -metoden) og kalde metoden "setSLASHresetGUI" i "proces" -metoden (under hver af vanskeligheds -knapperne registreres efter vanskelighedsvariabel tildeling og kalder "clearMenu" -metoden).

Inden alle knapper tildeles inden for metoden "setSLASHresetGUI", skal vi konfigurere rækker og kolonner i gitteret, og når alle knapper er tildelt inden for "setSLASHresetGUI" -metoden, skal vi pakke alt indhold i gitteret (se på kode angivet i instruktionsbogen for at se korrekt formatering).

Trin 4: Gør knapperne på skærmen i spillet operationelle

Gør knapperne på skærmen i spillet operationelle
Gør knapperne på skærmen i spillet operationelle
Gør knapperne på skærmen i spillet operationelle
Gør knapperne på skærmen i spillet operationelle
Gør knapperne på skærmen i spillet operationelle
Gør knapperne på skærmen i spillet operationelle
Gør knapperne på skærmen i spillet operationelle
Gør knapperne på skærmen i spillet operationelle

FORKLARING:

For at få knapperne til at udføre bestemte kodelinjer, når der klikkes på dem, bliver vi nødt til at udføre metoder inden for "proces" -metoden. Til denne opgave bliver vi nødt til at lave flere nye metoder, variabler og lister.

Først laver vi to lister. Der vil være en liste kaldet "grid". Denne "grid" -liste vil kun bestå af heltalene 9 og 0. På denne liste vil ni repræsentere bomber, og nuller vil repræsentere ikke-bomber. Sådan vil programmet skelne mellem, om en flise er en bombe eller ej. En anden liste vil blive lavet, og den vil blive kaldt "status". Denne "status" -liste består kun af en tegnstreng ("0", "1", "2", "3", "4", "5", "6", "7", "8", "b "). På denne liste svarer hver enkelt tegnstreng til et bestemt billede. Sådan ved programmet, hvilket billede der skal vises på hver knap i minestrygerens gitter. Hver knap i minestrygergitteret vil have et tilsvarende indeks på hver liste baseret på dets placering i nettet. Det tilhørende indeks tildeles ved følgende procedure (knapnummer - 1). For eksempel er knappen ens tilsvarende indeks på hver liste indeksnul. Endelig vil disse to lister blive eksekveret før "MainGUI" klassen udføres og vil blive oprettet uden for "MainGUI" klassen. "Gitter" -klassen oprettes som en tom liste (grid = ), og "status" -listen oprettes af en rækkefunktion (tilføjelse af fyrre enkelt tegnstrenge "n" til "status" -listen).

For det andet vil vi lave forskellige metoder, der kan registrere antallet af miner, der omgiver det, og som kan kaldes på, når der klikkes på en knap (beslutningen om hvilken metode, der skal udføres, bestemmes af knappens placering). Netop disse metoder vil blive kaldt vores mineanalysatorer. Disse metoder øger en tæller kaldet "NumOfMines" og vil bruge visse indekser i "grid" -listen til at bestemme, hvor mange bomber der omgiver flisen. Strengen, der vil blive gemt i variablen "NumOfMines", bruges til at erstatte det samme tilsvarende indeks i listen "status". Nu kan du undre dig over, hvordan programmet ved, hvilket indeks der skal bruges. Når en knap er registreret i "proces" -metoden, vil der blive oprettet/tildelt et variabelt "indeks" til et bestemt heltal (baseret på hvilken streng knappen registrerer). En af de oprettede metoder vil bruge det tildelte indeks for at kende placeringen af flisen og indekserne for de fliser, der omgiver den (algoritme inden for metoden finder ud af dette). Derudover skal vi først tildele den uden for klassen for at tildele variablen "indeks" igen. Så vi vil forudindstille "indeks" -variablen som heltal nul, før "MainGUI" -klassen oprettes.

For det tredje vil "operation" -metoder blive oprettet. En "operation" -metode vil blive udført hver gang en knap registreres. Disse "operation" metoder vil blive udført i "proces" metoden. I "proces" -metoden vil flere if-else-sætninger afgøre, hvilken knap der blev klikket på (baseret på hvad knappen er lig med). Det er her, der skal bruges en bestemt "operation" -metode (i if-else-sætningerne).

For det fjerde vil vi faktisk komme ind på, hvordan knapperne bliver operationelle. Som nævnt tidligere er flere if-else-sætninger placeret i "proces" -metoden og udfører visse andre metoder og linjer med ekstra kode afhængigt af, hvad knappen er lig med (knappen er lig med uanset hvilken streng, der sidst blev registreret). Inden for disse if-else-sætninger vil følgende forekomme i rækkefølge: indeks vil blive tildelt globalt, det tilsvarende indeks i "status" -listen vil blive tildelt strengen "b" (hvis det tilsvarende indeks for "grid" -listen er lig med heltalet ni), vil en tilsvarende "operation" -metode blive udført (hvis det tilsvarende indeks for "grid" -listen er lig med heltalet nul), vil det tilsvarende indeks i "status" -listen blive tildelt en streng, der er lig med variablen "NumOfMines" (hvis det tilsvarende indeks for "grid" -listen er lig med heltalet nul), og GUI'en opdateres ved at kalde metoden "setSLASHresetGUI".

Trin 5: "setDif vanskeligheds" metode og "genstart" metode

Billede
Billede
Billede
Billede

FORKLARING:

Dernæst skal der oprettes en "setDif vanskeligheds" -metode, og genstartsknappen i bunden af skærmen i spillet skal fungere (ved at oprette en "genstart" -metode, så den kan udføres, når den klikkes af brugeren).

Først skal metoden "setDif vanskelighed" implementeres i if-else-udsagnene fra vanskelighedsknapperne i "proces" -metoden og i "genstart" -metoden. Kodelinjerne og metoderne udført i denne metode er ganske enkle. I metoden "setDificiency" tilføjer vi en vis mængde nuller (ikke-bomber) og ni (bomber) til "grid" -listen (via to områdefunktioner inden for hver if-else-sætning), og derefter vil vi blande "grid" -liste (med tilfældigt biblioteks blandingsfunktion) inden for metoden "setDif vanskelighed" (efter if-else-sætningerne er udført). Forholdet mellem nuller og ni bestemmes af, hvilken streng variablen "sværhedsgrad" er indstillet til ("let": 34-6, "medium": 28-12, "hård": 16-24).

For det andet sætter vi i metoden "genstart" variablerne "indeks" og "NumOfMinesLEFT" til nul globalt, tømmer både "status" og "gitter" -lister globalt, nulstiller "status" -listen med en rækkefunktion (tilføjer fyrre enkelt tegnstrenge "n" til "status" -listen), og kald på metoden "setDif vanskelighed".

Trin 6: Scenarier, der afslutter spil

Scenarier, der afslutter spil
Scenarier, der afslutter spil
Scenarier, der afslutter spil
Scenarier, der afslutter spil
Scenarier, der afslutter spil
Scenarier, der afslutter spil
Scenarier, der afslutter spil
Scenarier, der afslutter spil

FORKLARING:

Hvert minestryger-spil har to scenarier, der afslutter spillet: sejr og tab. Inden for dette program implementerer vi disse to game-ending scenarier med to nye metoder: en "You_A_Winner_Son" metode og en "GameOver" metode. Inden GUI'en opdateres inden for "proces" -metoden og baseret på de indekser, der er ændret af de to spilafslutende scenarimetoder, vil displayknappen blive ændret for korrekt at repræsentere resultatet.

Først når brugeren klikker på den sidste skjulte ikke-bombe flise, skal metoden "You_A_Winner_Son" udføres. Vi vil fuldføre denne opgave ved at benytte metoden "You_A_Winner_Son" hver gang der klikkes på en flise, og der er fundet en flise uden bombe (inden for "operation" -metoderne, der udføres i "proces" -metoden). Hvis vinderbetingelserne er opfyldt, udføres to if-else-udsagn inden for metoden "You_A_Winner_Son". Den første if-else-erklæring vil altid blive udført, uanset om spilleren vandt eller ej, når denne metode bruges. Baseret på hvad variablen "sværhedsgrad" er lig med, en bestemt algoritme, der bestemmer, hvor mange miner/bomber der er tilbage skjult. Heltallet, der findes af denne algoritme, gemmes i variablen "NumOfMinesLEFT". Dernæst vil der mellem de to if-else-sætninger blive eksekveret en anden algoritme for at finde antallet af resterende startfliser (ikke-markerede fliser). Heltallet, der findes af denne algoritme, gemmes i variablen "NumOfStartingTilesLEFT". Den anden if-else-erklæring vil altid blive udført, uanset om spilleren vandt eller ej, når denne metode bruges. Baseret på hvad variablen "vanskelighed" er lig med, kan en af tre if-else-sætninger eksekveres, hvis betingelserne er opfyldt. Betingelserne vil være baseret på, hvad de to variabler "NumOfMinesLEFT" og "NumOfStartingTilesLEFT" er lig med. Inden for disse tre if-else-udsagn vil der blive udført en algoritme, der gør hver knap ubrugelig (spillet er slut).

For det andet, når brugeren klikker på en af de skjulte bombefliser, skal "GameOver" -metoden udføres. Vi vil fuldføre denne opgave ved at benytte "GameOver" -metoden, hver gang der klikkes på en brik, og der er fundet en flise (inden for "operation" -metoderne, der udføres i "proces" -metoden). Når der benyttes "GameOver" -metoden, vil der blive udført en algoritme, der gør hver startflise ubrugelig (spillet er slut), og de skjulte bombefliser afsløres (baseret på de tilsvarende indekser i "gridlisten, visse indekser i "status" -listen vil blive tildelt en enkelttegns streng "b").

For det tredje opdateres visningen af skærmen i spillet hver gang GUI'en opdateres ved at foretage meget få mindre redigeringer af metoden "setSLASHresetGUI". Efter at netværket i GUI'en er konfigureret, placerer vi tre if-else-sætninger, hvor den aktuelle displayknap-tildeling er placeret. En af de tre if-else-sætninger vil blive udført baseret på, hvad følgende variabler er lig med: "GameOverDETECTOR", "vanskeligheder", NumOfMinesLEFT "og" NumOfStartingTilesLEFT ". Som du måske undrer dig over, er variablen" GameOverDETECTOR "en ny variabel. Denne variabel oprettes lige før if-else-sætningerne eksekveres inden for metoden "setSLASHresetGUI". Variablen "GameOverDETECTOR" vil være lig med heltalet, der findes ved hjælp af en algoritme, der finder hvor mange indekser i "nettet" liste er blevet tildelt til heltallet ni og halvtreds (hvordan knapperne gøres ubrugelige). Baseret på hvis if-else-sætningens betingelser er opfyldt, vil en tilsvarende omfordeling til displayet forekomme.

Trin 7: Gør genstartsknappen operationel

Gør genstartsknappen operationel
Gør genstartsknappen operationel

FORKLARING:

Dette trin er tilfældigvis det korteste. Det meste af arbejdet til dette trin er allerede udført. Alt, hvad vi skal gøre nu, er at udføre "genstart" -metoden, hver gang brugeren klikker på genstartsknappen.

Først og sidst vil vi udføre metoden "genstart" i "proces" -metoden med en if-else-sætning. Hvis strengen "!" er registreret, skal "genstart" -metoden udføres. Vi bliver også nødt til at oprette en knap, der kaldes genstart i slutningen af metoden "setSLASHresetGUI", før indholdet af gitteret pakkes sammen. Denne genstart -knap behandler strengen "!" (kommando lambda: self.process ("!")) og udfør den tilsvarende "genstart" -metode inden for "proces" -metoden.

Anbefalede: