Kazalo:

Minolovac-Raspberry-Pi-Edition: 7 korakov (s slikami)
Minolovac-Raspberry-Pi-Edition: 7 korakov (s slikami)

Video: Minolovac-Raspberry-Pi-Edition: 7 korakov (s slikami)

Video: Minolovac-Raspberry-Pi-Edition: 7 korakov (s slikami)
Video: Штукатурка стен - самое полное видео! Переделка хрущевки от А до Я. #5 2024, Julij
Anonim
Minolovac-Raspberry-Pi-Edition
Minolovac-Raspberry-Pi-Edition
Minolovac-Raspberry-Pi-Edition
Minolovac-Raspberry-Pi-Edition

Moj zadnji projekt za serijo CSC 130 na Univerzi Louisiana Tech je Minesweeper Raspberry Pi Edition. V tem projektu sem želel poustvariti klasično igro minolovcev z uporabo knjižnice Tkinter programskega jezika Python. Mreža, ki jo zajema igra minolovca, je osem ploščic v širino in pet ploščic v višino. Oblikovanje projekta je bilo primerno in izpopolnjeno za uporabo Raspberry Pi, nameščenega s Pythonom 2.7.

Kodo in slike za končni projekt Minesweeper Raspberry Pi Edition lahko prenesete na naslednji povezavi:

Minolovac-Raspberry-Pi-Edition

Zaloge

x1 Raspberry Pi

Python 2.7 nameščen na Raspberry Pi

Microsoft Powerpoint (ali druga programska oprema za ustvarjanje slik za gumbe)

1. korak: Ustvarite slike gumbov

Ustvari slike gumbov
Ustvari slike gumbov

POJASNILO:

Vsak gumb, ki sestavlja grafični vmesnik, bo treba ustvariti. Za to nalogo sem s pomočjo programa Microsoft Powerpoint naredil slike, ki so potrebne za prikaz na gumbih.

Najprej sem ustvaril deset gumbov za ploščice, ki so potrebni za izdelavo mreže minolovcev (prazno, bob, nič, ena, dva, tri, štiri, pet, šest, sedem in osem) z uporabo programa Microsoft Powerpoint.

Drugič, naredil sem štiri slike, potrebne za zaslon menija (prikaz menija, gumb za lažje težave, gumb za srednje težave in gumb za težke težave) z uporabo programa Microsoft Powerpoint.

Tretjič, s pomočjo programa Microsoft Powerpoint sem ustvaril sliko, potrebno za gumb za ponovni zagon, in slike, potrebne za druge različne gumbe zaslona (prikaz "igre nad", "zmagaš" in "pravila").

Četrtič, slikam boste morali spremeniti velikost, da se prilegajo zaslonu. Za svoj Rasberry Pi sem za okno uporabil naslednje dimenzije (glede na slikovne pike po dolžini in širini): 432x576.

2. korak: Oblikujte program

Oblikuj program
Oblikuj program

POJASNILO:

Preden lahko pride do dejanskega programiranja, moramo uvoziti knjižnice, ki jih potrebujemo, in napisati glavni del našega programa.

Najprej bomo morali uvoziti * iz knjižnice Tkinter in premešati iz naključne knjižnice. Drugič, v kodi v glavnem delu programa bomo morali opraviti naslednje korake: ustvariti okno, nastaviti naslovno okno, ustvariti grafični vmesnik in prikazati grafični vmesnik ter počakati na interakcijo uporabnika. Ta koda je napisana v pravilnem oblikovanju glede na knjižnico Tkinter (za pravilno oblikovanje si oglejte kodo v navodilu.

3. korak: Ustvarite grafični vmesnik (Mreža in mreža minolovcev)

Ustvarite grafični vmesnik (Mreža in mreža minolovcev)
Ustvarite grafični vmesnik (Mreža in mreža minolovcev)
Ustvarite grafični vmesnik (Mreža in mreža minolovcev)
Ustvarite grafični vmesnik (Mreža in mreža minolovcev)
Ustvarite grafični vmesnik (Mreža in mreža minolovcev)
Ustvarite grafični vmesnik (Mreža in mreža minolovcev)
Ustvarite grafični vmesnik (Mreža in mreža minolovcev)
Ustvarite grafični vmesnik (Mreža in mreža minolovcev)

POJASNILO:

Ob zagonu programa se odpre zaslon menija. Ko izberete težavo (s klikom na enega od gumbov težavnosti na zaslonu menija), se grafični vmesnik osveži z mrežo minolovca, zaslonom in gumbom za ponovni zagon. Ker šele začenjate z delom na grafičnem vmesniku, bomo morali le zagnati meni, omogočiti delovanje tipk za težave z menijem in posodobiti grafični vmesnik na zaslon igre z mrežo minolovcev.

Prvič, zaslon menija se lahko prikaže ob zagonu programa s klicem metode "setupMenu" v konstruktorju razreda MainGUI.

Drugič, imamo lahko, da vsak od težavnostnih gumbov v meniju ob vsakem kliku izvede določene vrstice kode (z dodajanjem metode »proces« (vnesti bo treba tudi ukaz lambda: self.process (»returnButtonName«) v parametrih uporabljene funkcije gumba) pri ustvarjanju vsakega težavnostnega gumba). V metodi "process" bodo ustvarjeni trije stavki if-else, ki bodo izvajali nekatere druge metode in vrstice dodatne kode, odvisno od tega, kaj je enako gumbu (gumb je enak imenu gumba, ki je bil nazadnje registriran).

Tretjič, medtem ko je zaslon z menijem navzgor in če uporabnik klikne enega od težavnostnih gumbov, bo program shranil določeno vrednost v spremenljivko "težavnost" (težavnost je enaka "enostavni", "srednji" ali "trdi" od tega, kateri gumb težavnosti je kliknjen). Ta klik gumba ve, kateri izjavi if-else je treba slediti glede na to, katero ime gumba je bilo nazadnje registrirano (kateri gumb je enak). Poleg tega bomo za ponovno dodelitev spremenljivke "težavnost" morali najprej narediti primerek izven razreda. Tako bomo spremenljivko "težavnost" nastavili kot prazen niz, preden bo ustvarjen razred "MainGUI".

Četrtič, počistite grafični vmesnik gumbov, narejenih z metodo "setupMenu", tako da naredite metodo "clearMenu" (z uporabo funkcije button.destroy () v več primerkih) in prikličete metodo "clearMenu" v metodi "process" (pod vsak od težavnostnih gumbov se registrira po dodelitvi spremenljivke težavnosti).

Petič, osvežite grafični vmesnik tako, da uporabite metodo "setSLASHresetGUI" (gumbi so narejeni na enak način kot pri metodi "setupMenu") in prikličete metodo "setSLASHresetGUI" v metodi "process" (pod vsakim registrom tipk za težave po dodelitev spremenljivk težavnosti in klicanje metode "clearMenu").

Poleg tega moramo pred dodelitvijo vseh gumbov v metodi "setSLASHresetGUI" konfigurirati vrstice in stolpce v mreži in potem, ko so vsi gumbi dodeljeni v metodi "setSLASHresetGUI", moramo pakirati vso vsebino v mreži (poglejte kodo, podano v navodilu za ogled pravilnega oblikovanja).

4. korak: Vklopite gumbe na zaslonu v igri

Gumbi na zaslonu v igri naj delujejo
Gumbi na zaslonu v igri naj delujejo
Gumbi na zaslonu v igri naj delujejo
Gumbi na zaslonu v igri naj delujejo
Gumbi na zaslonu v igri naj delujejo
Gumbi na zaslonu v igri naj delujejo
Gumbi na zaslonu v igri naj bodo operativni
Gumbi na zaslonu v igri naj bodo operativni

POJASNILO:

Če želimo, da gumbi ob kliku izvajajo določene vrstice kode, bomo morali izvajati metode znotraj metode "process". Za to nalogo bomo morali narediti več novih metod, spremenljivk in seznamov.

Najprej bomo naredili dva seznama. Prikazal se bo seznam z imenom "mreža". Ta "mrežni" seznam bo sestavljen samo iz celih števil 9 in 0. Na tem seznamu bodo devetke predstavljale bombe, ničle pa nebombe. Tako bo program razlikoval, če je ploščica bomba ali ne. Sestavil se bo drugi seznam, ki se bo imenoval "status". Ta seznam "stanja" je sestavljen samo iz enega niza znakov ("0", "1", "2", "3", "4", "5", "6", "7", "8", "b" "). Na tem seznamu bo vsak niz znakov ustrezal določeni sliki. Tako bo program vedel, kakšno sliko naj prikaže na vsakem gumbu v mreži minolovcev. Vsak gumb v mreži minolovcev bo imel na vsakem seznamu ustrezen indeks glede na njegovo umestitev v mrežo. Ustrezni indeks bo dodeljen po naslednjem postopku (številka gumba - 1). Na primer, ustrezen indeks gumba na vsakem seznamu je indeks nič. Nazadnje bosta ta dva seznama izvedena pred izvedbo razreda "MainGUI" in bosta ustvarjena zunaj razreda "MainGUI". Razred "grid" bo ustvarjen kot prazen seznam (grid = ), seznam "status" pa s funkcijo obsega (na seznam "status" doda štirideset nizov z enim znakom "n").

Drugič, naredili bomo različne metode, ki lahko zaznajo število min, ki ga obkrožajo, in ki jih je mogoče priklicati, ko kliknete gumb (odločitev o tem, katero metodo je treba izvesti, se določi s postavitvijo gumba). Prav te metode bomo imenovali naši rudarski analizatorji. Te metode bodo povečale števec, imenovan "NumOfMines", in uporabile določene indekse na seznamu "mreže", da ugotovijo, koliko bomb je obdano s ploščico. Niz, ki bo shranjen v spremenljivki "NumOfMines", bo uporabljen za zamenjavo istega ustreznega indeksa na seznamu "status". Zdaj se lahko vprašate, kako bo program vedel, kateri indeks uporabiti. Ko je gumb registriran v metodi "process", bo spremenljivka "index" ustvarjena/dodeljena določenemu številu (glede na to, kateri niz gumb registrira). Eden od ustvarjenih načinov bo uporabil ta dodeljeni indeks, da bo poznal postavitev ploščice in indekse ploščic, ki jo obdajajo (algoritem v metodi bo to ugotovil). Poleg tega bomo za ponovno dodelitev spremenljivke "index" morali najprej ustvariti primerek zunaj razreda. Tako bomo spremenljivko "index" prednastavili kot celo število pred ustvarjanjem razreda "MainGUI".

Tretjič, ustvarjene bodo "operacijske" metode. Metoda "operation" se izvede vsakič, ko je gumb registriran. Te metode "delovanja" bodo izvedene v metodi "proces". Pri metodi "process" bo več stavkov if-else določilo, kateri gumb je bil kliknjen (glede na to, kaj je gumb enak). Tu se bo pojavila določena metoda delovanja (v stavkih if-else).

Četrtič, dejansko bomo preučili, kako gumbi delujejo. Kot smo že omenili, se v metodi "process" nahaja več stavkov if-else, ki izvajajo nekatere druge metode in vrstice dodatne kode, odvisno od tega, kaj je enako gumbu (gumb je enak tistemu, ki je bil nazadnje registriran). Znotraj teh stavkov if-else se bo po vrstnem redu zgodilo naslednje: indeks bo dodeljen globalno, ustrezni indeks na seznamu "status" bo dodeljen nizu "b" (če je ustrezen indeks seznama "mreža" enak celo število devet), se bo izvedla ustrezna metoda "operacije" (če je ustrezen indeks seznama "mreže" enak celi številki nič), se bo ustrezni indeks na seznamu "stanje" prerazporedil v niz, ki je enak spremenljivki "NumOfMines" (če je ustrezen indeks seznama "grid" enak celi številki nič), grafični vmesnik pa bo osvežen s klicem metode "setSLASHresetGUI".

5. korak: Metoda »setDifficulty« in »Restart«

Slika
Slika
Slika
Slika

POJASNILO:

Nato bo treba ustvariti metodo "setDifficulty" in gumb za ponovni zagon, ki se nahaja na dnu zaslona v igri, bo moral delovati (z ustvarjanjem metode "restart", ki jo bo lahko izvedel, ko bo uporabnik kliknil nanjo).

Najprej bo treba metodo "setDifficulty" implementirati v stavke if-else težavnostnih gumbov v metodi "process" in v metodi "restart". Vrstice kode in metod, izvedenih pri tej metodi, so precej preproste. V metodi "setDifficulty" bomo na seznam "mreže" (prek dveh funkcij obsega znotraj vsakega stavka if-else) dodali določeno količino ničel (ne-bomb) in devetih (bomb), nato pa bomo premešali "grid" seznam (s funkcijo naključnega izbora knjižnice) v metodi "setDifficulty" (po izvedbi stavkov if-else). Razmerje med ničlami in devetimi bo določeno s tem, na kateri niz je nastavljena spremenljivka "težavnost" ("enostavno": 34-6, "srednje": 28-12, "trdo": 16-24).

Drugič, pri metodi "restart" bomo spremenljivki "index" in "NumOfMinesLEFT" globalno nastavili na nič, globalno izpraznili sezname "status" in "grid", seznam "status" ponastavili s funkcijo obsega (dodajanje štirideset enojnih nizov "n" na seznam "status") in pokličejo metodo "setDifficulty".

6. korak: Scenariji za konec igre

Scenariji za konec igre
Scenariji za konec igre
Scenariji za konec igre
Scenariji za konec igre
Scenariji za konec igre
Scenariji za konec igre
Scenariji za konec igre
Scenariji za konec igre

POJASNILO:

Vsaka igra minolovca ima dva scenarija za konec igre: zmago in poraz. V tem programu bomo izvedli ta dva scenarija zaključka igre z dvema novim metodama: metodo "You_A_Winner_Son" in metodo "GameOver". Preden se grafični vmesnik osveži v okviru metode "proces" in na podlagi indeksov, spremenjenih z dvema metodama scenarija za konec igre, se bo gumb za prikaz spremenil, da bo pravilno predstavljal rezultat.

Najprej, ko uporabnik klikne zadnjo skrito ploščico brez bomb, je treba izvesti metodo "You_A_Winner_Son". To nalogo bomo zaključili s klicem na metodo "You_A_Winner_Son" vsakič, ko kliknete ploščico in ugotovite, da je ploščica brez bomb (v okviru "operacijskih" metod, izvedenih v metodi "process"). Če so izpolnjeni zmagovalni pogoji, se izvedeta dve izjavi if-else v metodi "You_A_Winner_Son". Prvi stavek if-else se bo vedno izvedel, ne glede na to, ali je igralec zmagal ali ne, ko se pokliče ta metoda. Na podlagi tega, kaj je spremenljivka "težavnost" enaka, določen algoritem, ki bo določil, koliko min/bomb je skrite. Celo število, ki ga najde ta algoritem, bo shranjeno v spremenljivki "NumOfMinesLEFT". Nato bo med dvema izjavama if-else izveden drug algoritem, ki bo poiskal število preostalih začetnih ploščic (ploščice brez klika). Celo število, ki ga najde ta algoritem, bo shranjeno v spremenljivki "NumOfStartingTilesLEFT". Drugi stavek if-else se bo vedno izvedel, ne glede na to, ali je igralec zmagal ali ne, ko se pokliče ta metoda. Glede na to, kaj je spremenljivka "težavnost" enaka, se lahko izvede eden od treh stavkov if-else, če so izpolnjeni njihovi pogoji. Pogoji bodo temeljili na tem, koliko sta dve spremenljivki "NumOfMinesLEFT" in "NumOfStartingTilesLEFT" enaki. V teh treh stavkih if-else bo izveden algoritem, zaradi katerega bo vsak gumb neuporaben (igra je končana).

Drugič, ko uporabnik klikne eno od skritih ploščic bombe, je treba izvesti metodo "GameOver". To nalogo bomo zaključili s klicem na metodo "GameOver" vsakič, ko kliknemo ploščico in ugotovimo, da je ploščica bomba (v metodah "operation", izvedenih v metodi "process"). Ko se prikliče metoda "GameOver", se izvede algoritem, s katerim bo vsaka začetna ploščica neuporabna (igra je končana), skrite ploščice bombe pa bodo razkrite (na podlagi ustreznih indeksov na "mrežnem seznamu", določenih indeksov na seznamu "status" bo ponovno dodeljen enoznamenčnemu nizu "b").

Tretjič, prikaz zaslona v igri se bo posodobil vsakič, ko se grafični vmesnik osveži, tako da se izvede zelo malo manjših sprememb metode "setSLASHresetGUI". Ko je mreža grafičnega vmesnika konfigurirana, bomo postavili tri stavke if-else, kamor je postavljena trenutna dodelitev gumbov zaslona. Eden od treh stavkov if-else se bo izvajal na podlagi enakih naslednjih spremenljivk: "GameOverDETECTOR", "težavnost," NumOfMinesLEFT "in" NumOfStartingTilesLEFT ". Kot se morda sprašujete, je spremenljivka" GameOverDETECTOR "nova spremenljivka. Ta spremenljivka bo ustvarjena tik pred izvedbo stavkov if-else v metodi "setSLASHresetGUI". Spremenljivka "GameOverDETECTOR" bo enaka celemu številu, ki ga najdemo z algoritmom, ki ugotovi, koliko indeksov v "mreži" seznami so bili dodeljeni na devetdeset devet (kako so gumbi neuporabni). Na podlagi tega so izpolnjeni pogoji stavka if-else, bo prišlo do ustrezne prerazporeditve prikaza.

7. korak: Ustvarjanje gumba za ponovni zagon

Omogočanje delovanja gumba za ponovni zagon
Omogočanje delovanja gumba za ponovni zagon

POJASNILO:

Ta korak je najkrajši. Večina dela za ta korak je že opravljena. Vse, kar moramo zdaj storiti, je, da vsakič, ko uporabnik klikne gumb za ponovni zagon, izvedemo metodo »restart«.

Najprej in nazadnje bomo izvedli metodo »restart« v metodi »process« z stavkom if-else. Če je niz "!" je registriran, potem se izvede metoda "restart". Prav tako bomo morali ustvariti gumb, imenovan restart, na koncu metode "setSLASHresetGUI", preden se vsebina mreže zapakira skupaj. Ta gumb za ponovni zagon bo obdelal niz "!" (ukaz lambda: self.process ("!")) in izvedite ustrezno metodo "restart" v metodi "process".

Priporočena: