Innholdsfortegnelse:

Minesveiper-Raspberry-Pi-utgave: 7 trinn (med bilder)
Minesveiper-Raspberry-Pi-utgave: 7 trinn (med bilder)

Video: Minesveiper-Raspberry-Pi-utgave: 7 trinn (med bilder)

Video: Minesveiper-Raspberry-Pi-utgave: 7 trinn (med bilder)
Video: BTT - Manta E3EZ - CB1 with EMMc install 2024, November
Anonim
Minesveiper-Bringebær-Pi-utgave
Minesveiper-Bringebær-Pi-utgave
Minesveiper-Bringebær-Pi-utgave
Minesveiper-Bringebær-Pi-utgave

Mitt siste prosjekt for CSC 130 -serien ved Louisiana Tech University er Minesweeper Raspberry Pi Edition. I dette prosjektet søkte jeg å gjenskape det klassiske spillet minesveiper ved å bruke Tkinter -biblioteket til Python -programmeringsspråket. Rutenettet som minesveiper -spillet omfatter er åtte fliser i bredden og fem fliser i høyden. Formateringen av prosjektet har blitt tilpasset og perfeksjonert for bruk av en Raspberry Pi installert med Python 2.7.

Koden og bildene for Minesweeper Raspberry Pi Edition -prosjektet kan lastes ned på følgende lenke:

Minesveiper-Bringebær-Pi-utgave

Rekvisita

x1 Raspberry Pi

Python 2.7 installert på Raspberry Pi

Microsoft Powerpoint (eller annen programvare for å lage bilder for knapper)

Trinn 1: Lag knappebilder

Lag knappebilder
Lag knappebilder

FORKLARING:

Hver knapp som utgjør GUI må opprettes. For denne oppgaven brukte jeg Microsoft Powerpoint til å lage bildene jeg trengte å vise på knappene.

Først opprettet jeg de ti flisknappene som trengs for å lage minesveiperutenettet (tomt, bob, null, en, to, tre, fire, fem, seks, syv og åtte) ved hjelp av Microsoft Powerpoint.

For det andre lagde jeg de fire bildene som trengs for menyskjermen (menydisplay, lett vanskelighets -knapp, knapp for middels vanskelighet og knapp for vanskelig vanskelighet) ved hjelp av Microsoft Powerpoint.

For det tredje opprettet jeg bildet som trengs for omstartsknappen og bildene som trengs for de andre forskjellige skjermknappene (en "game over" -skjerm, en "du vinner" -skjerm og en "regler" -visning) ved hjelp av Microsoft Powerpoint.

For det fjerde må du endre størrelsen på bildene slik at de passer inn på skjermen. For min Rasberry Pi brukte jeg følgende dimensjoner for vinduet (refererer til piksler i lengde og bredde): 432x576.

Trinn 2: Formater program

Formater program
Formater program

FORKLARING:

Før noen egentlig programmering kan finne sted, må vi importere bibliotekene vi trenger og skrive hoveddelen av programmet vårt.

Først må vi importere * fra Tkinter -biblioteket og blande fra tilfeldig bibliotek. For det andre må vi fullføre følgende trinn i kode i hoveddelen av programmet: lag vinduet, sett tittelvinduet, generer GUI, og vis GUI og vent på brukerinteraksjon. Denne koden er skrevet i riktig formatering i forhold til Tkinter -biblioteket (se på koden som er gitt i instruksjonene for å se riktig formatering).

Trinn 3: Lag GUI (Menu & Minesweeper Grid)

Lag GUI (Menu & Minesweeper Grid)
Lag GUI (Menu & Minesweeper Grid)
Lag GUI (Menu & Minesweeper Grid)
Lag GUI (Menu & Minesweeper Grid)
Lag GUI (Menu & Minesweeper Grid)
Lag GUI (Menu & Minesweeper Grid)
Lag GUI (Menu & Minesweeper Grid)
Lag GUI (Menu & Minesweeper Grid)

FORKLARING:

Ved oppstart av programmet skal menyskjermen startes. Etter at vanskeligheten er valgt (ved å klikke på en av vanskelighetsknappene på menyskjermen), skal GUI oppdateres med minesveiperutenettet, et display og en omstartsknapp. Siden du bare har begynt å jobbe med GUI, trenger vi bare å få menyen til å starte, få knappene for menyproblemer til å fungere, og få GUI til å oppdatere spillskjermen med minesveiperutenettet.

Først kan vi få menyskjermen til å vise seg selv ved oppstart av programmet ved å kalle "setupMenu" -metoden i konstruktøren av MainGUI -klassen.

For det andre kan vi få hver av menyens vanskelighets -knapper til å utføre visse kodelinjer når de klikkes ved å legge til en "prosess" -metode (må også legge til kommando lambda: self.process ("returnButtonName") innenfor parameterne til knappfunksjonen som brukes ved opprettelsen av hver vanskelighetsknapp). Tre if-else-setninger vil bli opprettet i "prosess" -metoden og utføre visse andre metoder og linjer med tilleggskode avhengig av hva knappen er lik (knappen er lik uansett hvilken knappnavn som sist ble registrert).

For det tredje, mens menyskjermen er oppe og hvis brukeren klikker på en av vanskelighetsknappene, vil programmet lagre en viss verdi i variabelen "vanskelighetsgrad" (vanskeligheten er lik "lett", "middels" eller "hard" basert av hvilken vanskelighetsgradsknapp det klikkes på). Dette klikket på en knapp vet hvilken if-else-setning som skal følges basert på hvilket knappnavn som sist ble registrert (hvilken knapp er lik). I tillegg må vi først tildele variabelen "vanskelighetsgrad" først den skal settes utenfor klassen. Så vi vil sette variabelen "vanskelighetsgrad" som en tom streng før "MainGUI" -klassen opprettes.

For det fjerde, fjern GUI for knappene som er laget av "setupMenu" -metoden ved å lage en "clearMenu" -metode (ved hjelp av funksjonen button.destroy () i flere forekomster) og kall "clearMenu" -metoden i "prosess" -metoden (under hver av vanskelighets -knappen registrerer seg etter vanskelighetsvariabeloppgaven).

For det femte, oppdater GUI -en ved å lage en "setSLASHresetGUI" -metode (knappene er laget på samme måte som i "setupMenu" -metoden) og ring "setSLASHresetGUI" -metoden i "prosess" -metoden (under hver av vanskelighetsknappene registreres etter vanskelighetsgrad variabel tildeling og kaller "clearMenu" -metoden).

I tillegg må vi pakke alt innholdet i rutenettet før alle knappene er tilordnet innenfor "setSLASHresetGUI" -metoden, og etter at alle knappene er tilordnet innenfor "setSLASHresetGUI" -metoden, må vi pakke alt innholdet i rutenettet (se på koden gitt i instruksjonsboken for å se riktig formatering).

Trinn 4: Gjør knappene på skjermen i spillet operative

Gjør knappene på skjermen i spillet operative
Gjør knappene på skjermen i spillet operative
Gjør knappene på skjermen i spillet operative
Gjør knappene på skjermen i spillet operative
Gjør knappene på skjermen i spillet operative
Gjør knappene på skjermen i spillet operative
Gjør knappene på skjermen i spillet operative
Gjør knappene på skjermen i spillet operative

FORKLARING:

For å få knappene til å utføre visse kodelinjer når de klikkes, må vi utføre metoder innenfor "prosess" -metoden. For denne oppgaven må vi lage flere nye metoder, variabler og lister.

Først skal vi lage to lister. Det vil være en liste som heter "grid". Denne "grid" -listen vil bare bestå av heltallene 9 og 0. I denne listen vil ni representere bomber, og nuller vil representere ikke-bomber. Slik vil programmet skille om en flis er en bombe eller ikke. En annen liste vil bli laget, og den vil bli kalt "status". Denne "status" -listen består av bare én tegnstrenge ("0", "1", "2", "3", "4", "5", "6", "7", "8", "b "). I denne listen vil hver tegnstreng svare til et bestemt bilde. Slik vet programmet hvilket bilde som skal vises på hver knapp i minesveiperutenettet. Hver knapp i minesveiperettet vil ha en tilsvarende indeks i hver liste basert på plasseringen i rutenettet. Den tilsvarende indeksen vil bli tilordnet ved følgende prosedyre (knappnummer - 1). For eksempel er knappens tilsvarende indeks i hver liste indeksnull. Til slutt vil disse to listene bli utført før "MainGUI" -klassen kjøres og vil bli opprettet utenfor "MainGUI" -klassen. "Rutenett" -klassen vil bli opprettet som en tom liste (rutenett = ) og "status" -listen vil bli opprettet av en rekkeviddefunksjon (legge til førti enkelt tegnstrenger med "n" til "status" -listen).

For det andre vil vi lage forskjellige metoder som kan oppdage antall miner som omgir den, og som kan kalles på når en knapp klikkes (avgjørelsen av hvilken metode som skal utføres, bestemmes av plasseringen av knappen). Nettopp disse metodene vil bli kalt våre gruve -analysatorer. Disse metodene vil øke en teller som kalles "NumOfMines" og vil bruke visse indekser i "rutenett" -listen for å bestemme hvor mange bomber som omgir flisen. Strengen som vil bli lagret i variabelen "NumOfMines" vil bli brukt til å erstatte den samme tilsvarende indeksen i "status" -listen. Nå kan du lure på hvordan programmet vet hvilken indeks du skal bruke. Når en knapp er registrert i "prosess" -metoden, vil en variabel "indeks" bli opprettet/tildelt til et bestemt heltall (basert på hvilken streng knappen registrerer). En av metodene som er opprettet, vil bruke den tildelte indeksen for å vite plasseringen av flisen og indeksene til flisene som omgir den (algoritmen i metoden vil finne ut dette). I tillegg, for å tilordne "indeks" -variabelen igjen, må vi først instansere den utenfor klassen. Så vi vil forhåndsinnstille "indeks" -variabelen som heltall null før "MainGUI" -klassen opprettes.

For det tredje vil "operasjons" metoder bli opprettet. En "operasjons" -metode vil bli utført hver gang en knapp registreres. Disse "operasjons" metodene vil bli utført i "prosess" metoden. I "prosess" -metoden vil flere if-else-setninger avgjøre hvilken knapp det ble klikket på (basert på hva knappen er lik). Det er her en bestemt "operasjons" -metode vil bli påkalt (i if-else-setningene).

For det fjerde vil vi faktisk komme inn på hvordan knappene blir operative. Som nevnt tidligere er flere if-else-setninger lokalisert i "prosess" -metoden og utfører visse andre metoder og linjer med tilleggskode avhengig av hva knappen er lik (knappen er lik uansett hvilken streng det var som sist ble registrert). Innen disse if-else-setningene vil følgende skje i rekkefølge: indeks vil bli tildelt globalt, den tilsvarende indeksen i "status" -listen vil bli tildelt strengen "b" på nytt (hvis den tilsvarende indeksen i "rutenett" -listen er lik heltallet ni), vil en tilsvarende "operasjons" -metode bli utført (hvis den tilsvarende indeksen i "rutenett" -listen er lik heltallet null), vil den tilsvarende indeksen i "status" -listen bli tildelt en streng som er lik variabelen "NumOfMines" (hvis den tilsvarende indeksen for "grid" -listen er lik heltallet null), og GUI -en vil bli oppdatert ved å kalle metoden "setSLASHresetGUI".

Trinn 5: "setDifblemy" -metode og "restart" -metode

Bilde
Bilde
Bilde
Bilde

FORKLARING:

Deretter må du opprette en "setDif vanskelighets" -metode, og omstartsknappen nederst på skjermen i spillet må bli operativ (ved å opprette en "omstart" -metode for å kjøre den når den klikkes av brukeren).

Først må metoden "setDifidity" implementeres i if-else-setningene til vanskelighets-knappene i "prosess" -metoden og i "omstart" -metoden. Kodelinjene og metodene som er utført i denne metoden er ganske enkle. I metoden "sett vanskeligheter" vil vi legge til en viss mengde nuller (ikke-bomber) og ni (bomber) til "rutenett" -listen (via to områdefunksjoner i hver if-else-setning), og deretter blander vi "grid" -liste (med det tilfeldige bibliotekets blandingsfunksjon) innenfor "setDif vanskelighets" -metoden (etter at if-else-setningene er utført). Forholdet mellom nuller og ni vil bli bestemt av hvilken streng variabelen "vanskelighetsgrad" er satt til ("lett": 34-6, "middels": 28-12, "hard": 16-24).

For det andre vil vi i "omstart" -metoden sette variablene "indeks" og "NumOfMinesLEFT" til null globalt, tømme både "status" og "rutenett" -listene globalt, tilbakestille "status" -listen med en rekkeviddefunksjon (legge til førti enkelttegnsstrenger med "n" til "status" -listen), og kaller på "sett med vanskelighetsgraden" -metoden.

Trinn 6: Spillavslutningsscenarier

Spillavslutningsscenarier
Spillavslutningsscenarier
Spillavslutningsscenarier
Spillavslutningsscenarier
Spillavslutningsscenarier
Spillavslutningsscenarier
Spillavslutningsscenarier
Spillavslutningsscenarier

FORKLARING:

Hvert minesveiper-spill har to scenarier som slutter på spillet: seier og tap. I dette programmet vil vi implementere disse to spillavslutningsscenariene med to nye metoder: en "You_A_Winner_Son" -metode og en "GameOver" -metode. Før GUI oppdateres i "prosess" -metoden og basert på indeksene som er endret av de to metodene som avsluttes med spillet, vil visningsknappen endres for å representere resultatet på riktig måte.

Først når brukeren klikker på den siste skjulte ikke-bombeflisen, må metoden "You_A_Winner_Son" utføres. Vi vil fullføre denne oppgaven ved å benytte "You_A_Winner_Son" -metoden hver gang det klikkes på en flis og det er funnet at flisen er en ikke-bombeflate (innenfor "operasjons" -metodene som utføres i "prosess" -metoden). Hvis vinnervilkårene er oppfylt, vil to if-else-utsagn i "You_A_Winner_Son" -metoden bli utført. Den første if-else-setningen vil alltid utføres uavhengig av om spilleren vant eller ikke når denne metoden ble benyttet. Basert på hva variabelen "vanskelighetsgrad" er lik, en viss algoritme som vil bestemme hvor mange gruver/bomber som er igjen skjult. Heltallet som blir funnet av denne algoritmen vil bli lagret i variabelen "NumOfMinesLEFT". Deretter vil en annen algoritme bli utført mellom de to if-else-setningene for å finne antall startfliser som er igjen (ubrikke). Heltallet som blir funnet av denne algoritmen vil bli lagret i variabelen "NumOfStartingTilesLEFT". Den andre if-else-setningen vil alltid utføres uavhengig av om spilleren vant eller ikke når denne metoden brukes. Basert på hva variabelen "vanskelighetsgrad" er lik, kan en av tre if-else-utsagn utføres hvis betingelsene er oppfylt. Betingelsene vil være basert på hva de to variablene "NumOfMinesLEFT" og "NumOfStartingTilesLEFT" er lik. Innen disse tre if-else-setningene vil det bli utført en algoritme som gjør hver knapp ubrukelig (spillet er over).

For det andre, når brukeren klikker på en av de skjulte bombeflisene, må "GameOver" -metoden utføres. Vi vil fullføre denne oppgaven ved å benytte "GameOver" -metoden hver gang det klikkes på en flis og det er funnet at flisen er en bombeflate (innenfor "operasjons" -metodene som utføres i "prosess" -metoden). Når "GameOver" -metoden brukes, vil en algoritme bli utført som vil gjøre hver startflis ubrukelig (spillet er over), og de skjulte bombeflisene vil bli avslørt (basert på de tilsvarende indeksene i "rutenettlisten, visse indekser i "status" -listen vil bli tilordnet entegnsstrengen "b") på nytt.

For det tredje vil visningen av skjermen i spillet oppdateres hver gang GUI-en oppdateres ved å gjøre svært få mindre endringer i metoden "setSLASHresetGUI". Etter at rutenettet til GUI er konfigurert, plasserer vi tre if-else-setninger der gjeldende displayknapptilordning er plassert. En av de tre if-else-setningene vil utføres basert på hva følgende variabler er lik: "GameOverDETECTOR", "vanskeligheter", "NumOfMinesLEFT" og "NumOfStartingTilesLEFT". Som du kanskje lurer på, er variabelen "GameOverDETECTOR" en ny variabel. Denne variabelen vil bli opprettet rett før if-else-setningene utføres i metoden "setSLASHresetGUI". Variabelen "GameOverDETECTOR" vil være lik heltallet som blir funnet ved hjelp av en algoritme som finner hvor mange indekser i "rutenettet" list har tilordnet nytt til heltallet nittini (hvordan knappene blir ubrukelige). Basert på om if-else-setningens betingelser er oppfylt, vil en tilsvarende tilordning til displayet skje.

Trinn 7: Gjør omstartsknappen operativ

Gjør omstartsknappen operativ
Gjør omstartsknappen operativ

FORKLARING:

Dette trinnet er tilfeldigvis det korteste. Det meste av arbeidet for dette trinnet er allerede utført. Alt vi trenger å gjøre nå er å utføre "restart" -metoden hver gang brukeren klikker på knappen restart.

Først og sist vil vi utføre metoden "omstart" i "prosess" -metoden med en if-else-setning. Hvis strengen "!" er registrert, skal "restart" -metoden utføres. Vi må også opprette en knapp som heter restart på slutten av "setSLASHresetGUI" -metoden før innholdet i rutenettet pakkes sammen. Denne omstartsknappen vil behandle strengen "!" (kommando lambda: self.process ("!")) og kjør den tilsvarende "restart" -metoden innenfor "prosess" -metoden.

Anbefalt: