Sadržaj:

Minolovac-Raspberry-Pi-Edition: 7 koraka (sa slikama)
Minolovac-Raspberry-Pi-Edition: 7 koraka (sa slikama)

Video: Minolovac-Raspberry-Pi-Edition: 7 koraka (sa slikama)

Video: Minolovac-Raspberry-Pi-Edition: 7 koraka (sa slikama)
Video: Как штукатурить откосы на окнах СВОИМИ РУКАМИ 2024, Srpanj
Anonim
Minolovac-Raspberry-Pi-Edition
Minolovac-Raspberry-Pi-Edition
Minolovac-Raspberry-Pi-Edition
Minolovac-Raspberry-Pi-Edition

Moj posljednji projekt za seriju CSC 130 na Sveučilištu Louisiana Tech je Minesweeper Raspberry Pi Edition. U ovom projektu pokušao sam ponovno stvoriti klasičnu igru minolovaca koristeći knjižnicu Tkinter programskog jezika Python. Rešetka koju igra minolovca obuhvaća je osam pločica po širini i pet pločica po visini. Formatiranje projekta prilagođeno je i usavršeno za upotrebu Raspberry Pi instaliranog s Pythonom 2.7.

Kôd i slike za završni projekt Minolovac Raspberry Pi Edition mogu se preuzeti na sljedećoj poveznici:

Minolovac-Raspberry-Pi-Edition

Pribor

x1 Malina Pi

Python 2.7 instaliran na Raspberry Pi

Microsoft Powerpoint (ili neki drugi softver za stvaranje slika za gumbe)

Korak 1: Stvorite slike gumba

Stvorite slike gumba
Stvorite slike gumba

OBRAZLOŽENJE:

Svaki gumb koji čini GUI morat će se stvoriti. Za ovaj sam zadatak upotrijebio Microsoft Powerpoint za izradu slika koje su mi potrebne za prikaz na gumbima.

Prvo sam stvorio deset gumba za pločice koji su potrebni za izradu mreže minolovca (prazno, bob, nula, jedan, dva, tri, četiri, pet, šest, sedam i osam) pomoću Microsoft Powerpointa.

Drugo, napravio sam četiri slike potrebne za zaslon izbornika (prikaz izbornika, gumb za laku poteškoću, gumb srednje težine i gumb za teške poteškoće) pomoću programa Microsoft Powerpoint.

Treće, stvorio sam sliku potrebnu za gumb za ponovno pokretanje i slike potrebne za druge različite tipke zaslona (zaslon "igra preko", zaslon "pobijedili ste" i prikaz "pravila") pomoću programa Microsoft Powerpoint.

Četvrto, morat ćete promijeniti veličinu slika kako bi stale na vaš zaslon. Za svoj Rasberry Pi koristio sam sljedeće dimenzije prozora (odnosi se na piksele po duljini i širini): 432x576.

Korak 2: Formatirajte program

Formatiranje programa
Formatiranje programa

OBRAZLOŽENJE:

Prije nego što dođe do stvarnog programiranja, moramo uvesti potrebne biblioteke i napisati glavni dio našeg programa.

Prvo ćemo morati uvesti * iz knjižnice Tkinter i nasumiciti iz slučajne knjižnice. Drugo, morat ćemo dovršiti sljedeće korake u kodu unutar glavnog dijela programa: stvoriti prozor, postaviti naslovni prozor, generirati GUI i prikazati GUI te pričekati interakciju korisnika. Ovaj kôd je napisan u ispravnom oblikovanju u odnosu na knjižnicu Tkinter (pogledajte kod dat u uputama da biste vidjeli pravilno oblikovanje).

Korak 3: Izradite GUI (Izbornik i Minolovka)

Izradite GUI (Mreža i Minolovka)
Izradite GUI (Mreža i Minolovka)
Izradite GUI (Mreža i Minolovka)
Izradite GUI (Mreža i Minolovka)
Izradite GUI (Izbornik i Minolovka)
Izradite GUI (Izbornik i Minolovka)
Izradite GUI (Mreža i Minolovka)
Izradite GUI (Mreža i Minolovka)

OBRAZLOŽENJE:

Nakon pokretanja programa, pokrenut će se zaslon izbornika. Nakon odabira poteškoće (pritiskom na jedan od gumba težine na zaslonu izbornika), GUI će se osvježiti rešetkom minolovaca, zaslonom i gumbom za ponovno pokretanje. Budući da tek počinjete raditi na grafičkom sučelju, trebat će nam samo pokretanje izbornika, aktiviranje gumba za poteškoće izbornika i osvježavanje grafičkog sučelja na zaslon igre s mrežom minolovaca.

Prvo, možemo prikazati zaslon izbornika pri pokretanju programa pozivanjem metode "setupMenu" unutar konstruktora klase MainGUI.

Drugo, možemo postići da svaki od gumba s poteškoćama na izborniku izvrši određene retke koda kad god se klikne dodavanjem metode "process" (morat će se dodati i naredba lambda: self.process ("returnButtonName") unutar parametara funkcije gumba u stvaranju svakog gumba težine). Tri if-else izraza bit će stvorena u "process" metodi i izvršit će određene druge metode i retke dodatnog koda ovisno o tome što je gumb jednak (button je jednak onome što je gumb zadnji put registriran).

Treće, dok je zaslon izbornika gore i ako korisnik klikne na jedan od gumba za poteškoće, program će spremiti određenu vrijednost u varijablu "težine" (poteškoća je jednaka "lako", "srednje" ili "teško" na temelju isključeno na koji se gumb poteškoće klikne). Ovaj klik na gumb zna koju naredbu if-else treba slijediti na temelju onog naziva gumba koji je zadnji put registriran (koji je gumb jednak). Dodatno, za ponovnu dodjelu varijable "poteškoće" morat ćemo prvo stvoriti instancu izvan klase. Pa ćemo postaviti varijablu "težavnost" kao prazan niz prije nego što se stvori klasa "MainGUI".

Četvrto, očistite GUI gumba izrađenih metodom "setupMenu" tako da napravite metodu "clearMenu" (koristeći funkciju button.destroy () u više instanci) i pozovete metodu "clearMenu" u metodi "process" (pod svaki od gumba za poteškoće registrira se nakon dodjele varijable težine).

Peto, osvježite GUI metodom "setSLASHresetGUI" (gumbi se izrađuju na isti način kao u metodi "setupMenu") i pozivanjem metode "setSLASHresetGUI" u metodi "process" (ispod svakog registra gumba za poteškoće nakon dodjeljivanje varijabli poteškoća i pozivanje metode "clearMenu").

Dodatno, prije nego što se svi gumbi dodijele unutar metode "setSLASHresetGUI", moramo konfigurirati retke i stupce unutar rešetke, a nakon što su svi gumbi dodijeljeni unutar metode "setSLASHresetGUI", moramo zapakirati sav sadržaj unutar mreže (pogledajte kôd dan u uputama da biste vidjeli pravilno oblikovanje).

Korak 4: Omogućite da gumbi na zaslonu u igri budu operativni

Neka gumbi na zaslonu u igri budu operativni
Neka gumbi na zaslonu u igri budu operativni
Neka gumbi na zaslonu u igri budu operativni
Neka gumbi na zaslonu u igri budu operativni
Neka gumbi na zaslonu u igri budu operativni
Neka gumbi na zaslonu u igri budu operativni
Neka gumbi na zaslonu u igri budu operativni
Neka gumbi na zaslonu u igri budu operativni

OBRAZLOŽENJE:

Da bi gumbi izvršili određene retke koda nakon klika, morat ćemo izvršiti metode unutar metode "process". Za ovaj zadatak morat ćemo napraviti više novih metoda, varijabli i popisa.

Prvo ćemo napraviti dva popisa. Postojat će popis pod nazivom "rešetka". Ovaj "grid" popis sastojat će se samo od cijelih brojeva 9 i 0. Na ovom popisu devet će predstavljati bombe, a nule će predstavljati ne-bombe. Ovako će program razlikovati je li pločica bomba ili ne. Napravit će se drugi popis koji će se zvati "status". Ovaj popis "statusa" sastoji se od samo jednog niza znakova ("0", "1", "2", "3", "4", "5", "6", "7", "8", "b" "). Na ovom popisu svaki niz znakova će odgovarati određenoj slici. Ovako će program znati koju sliku prikazati na svakom gumbu u mreži minolovca. Svaki gumb u rešetki minopolagača imat će odgovarajući indeks na svakom popisu, ovisno o položaju u mreži. Odgovarajući indeks bit će dodijeljen sljedećim postupkom (broj gumba - 1). Na primjer, odgovarajući indeks gumba na svakom popisu je indeks nula. Konačno, ove dvije liste bit će izvedene prije nego što se izvrši klasa "MainGUI" i bit će stvorene izvan klase "MainGUI". Klasa "grid" bit će stvorena kao prazan popis (grid = ), a popis "status" će biti kreiran funkcijom raspona (dodajući četrdeset nizova s jednim znakom "n" na popis "status").

Drugo, napravit ćemo različite metode koje mogu otkriti broj mina koje ga okružuju i koje se mogu pozvati kada se pritisne gumb (odluka o tome koju metodu treba izvesti bit će određena postavljanjem gumba). Upravo će se te metode zvati naši analizatori rudnika. Ove će metode povećati brojač pod nazivom "NumOfMines" i upotrijebit će određene indekse na popisu "rešetke" za određivanje koliko bombi okružuje pločicu. Niz koji će biti pohranjen unutar varijable "NumOfMines" koristit će se za zamjenu istog odgovarajućeg indeksa na popisu "status". Sada se možete zapitati kako će program znati koji indeks koristiti. Kada je gumb registriran u "process" metodi, tada će se stvoriti varijabla "index"/dodijeliti određenom cijelom broju (ovisno o tome koji niz gumb registrira). Jedna od stvorenih metoda će koristiti dodijeljeni indeks kako bi znala položaj pločice i indekse pločica koje je okružuju (algoritam unutar metode će to shvatiti). Dodatno, za ponovno dodjeljivanje varijable "index" morat ćemo je prvo instancirati izvan klase. Stoga ćemo varijablu "index" unaprijed postaviti kao cijelu nulu prije nego što se kreira klasa "MainGUI".

Treće, stvorit će se "operativne" metode. Metoda "operacije" izvodit će se svaki put kada se gumb registrira. Ove metode "operacije" izvodit će se u metodi "procesa". U metodi "process", više if-else izraza će odrediti koji je gumb kliknut (na temelju toga što je gumb jednak). Ovdje će se pozvati određena metoda "operacije" (u naredbama if-else).

Četvrto, zapravo ćemo istražiti kako gumbi postaju operativni. Kao što je prethodno rečeno, više if-else izraza nalazi se u "process" metodi i izvršava određene druge metode i retke dodatnog koda ovisno o tome što je gumb jednak (button je jednak bilo kojem nizu koji je zadnji put registriran). Unutar ovih naredbi if-else dogodit će se sljedeće po redu: indeks će biti dodijeljen globalno, odgovarajući indeks na popisu "status" bit će dodijeljen nizu "b" (ako je odgovarajući indeks popisa "rešetka" jednak cijeli broj devet), izvršit će se odgovarajuća metoda "operacije" (ako je odgovarajući indeks popisa "rešetka" jednak cijeloj nuli), odgovarajući indeks na popisu "statusa" bit će dodijeljen nizu koji je jednak varijabli "NumOfMines" (ako je odgovarajući indeks popisa "grid" jednak cijeloj nuli), a GUI će se osvježiti pozivanjem metode "setSLASHresetGUI".

Korak 5: Metoda "setDifficulty" i "Restart" Metoda

Slika
Slika
Slika
Slika

OBRAZLOŽENJE:

Zatim će trebati stvoriti metodu "setDifficulty", a gumb za ponovno pokretanje koji se nalazi pri dnu zaslona u igri morat će postati operativan (stvaranjem metode "ponovnog pokretanja" koju će izvršiti kada korisnik klikne na nju).

Prvo će se metoda "setDifficulty" morati implementirati u if-else izjave gumba poteškoća u "process" metodi i u "restart" metodi. Linije koda i metode izvedene ovom metodom prilično su jednostavne. U metodi "setDifficulty" dodat ćemo određenu količinu nula (ne-bombi) i devetki (bombi) na popis "rešetke" (putem dvije funkcije raspona unutar svake naredbe if-else), a zatim ćemo promiješati "grid" popis (s funkcijom nasumičnog odabira biblioteke) unutar "setDifficulty" metode (nakon izvođenja naredbi if-else). Omjer nula i devetki bit će određen prema tome na koji je niz postavljena varijabla "poteškoća" ("lako": 34-6, "srednje": 28-12, "tvrdo": 16-24).

Drugo, u metodi "restart" postavit ćemo varijable "index" i "NumOfMinesLEFT" na nulu globalno, globalno isprazniti popise "status" i "grid", poništiti popis "status" s funkcijom raspona (dodavanjem četrdeset nizova s jednim znakom od "n" na popis "statusa") i pozivaju metodu "setDifficulty".

Korak 6: Scenariji završetka igre

Scenariji završetka igre
Scenariji završetka igre
Scenariji završetka igre
Scenariji završetka igre
Scenariji završetka igre
Scenariji završetka igre
Scenariji završetka igre
Scenariji završetka igre

OBRAZLOŽENJE:

Svaka igra minolovca ima dva scenarija završetka igre: pobjedu i poraz. Unutar ovog programa implementirat ćemo ova dva scenarija završetka igre s dvije nove metode: metodom "You_A_Winner_Son" i "GameOver". Prije nego što se GUI osvježi unutar metode "process" i na temelju indeksa promijenjenih s dvije metode scenarija završetka igre, gumb za prikaz bit će promijenjen kako bi ispravno predstavljao ishod.

Prvo, kada korisnik klikne na posljednju skrivenu pločicu bez bombe, tada se mora izvršiti metoda "You_A_Winner_Son". Ovaj ćemo zadatak dovršiti pozivanjem metode "You_A_Winner_Son" svaki put kada se klikne na pločicu i kada se utvrdi da je pločica bez bombe (unutar metoda "operation" izvedenih u metodi "process"). Ako su uvjeti za pobjedu ispunjeni, tada će se izvršiti dvije naredbe if-else unutar metode "You_A_Winner_Son". Prva naredba if-else uvijek će se izvoditi bez obzira je li igrač pobijedio ili ne kada se pozove ova metoda. Na temelju onoga što je varijabla "poteškoća" jednaka, određeni algoritam koji će odrediti koliko je mina/bombi ostalo skriveno. Cijeli broj koji je pronađen ovim algoritmom bit će spremljen u varijablu "NumOfMinesLEFT". Zatim će se između dvije naredbe if-else izvršiti drugi algoritam za pronalaženje preostalih preostalih pločica (pločice bez klika). Cijeli broj koji je pronađen ovim algoritmom bit će spremljen u varijablu "NumOfStartingTilesLEFT". Druga naredba if-else uvijek će se izvršavati bez obzira je li igrač pobijedio ili ne kada se pozove ova metoda. Na temelju onoga što je varijabla "poteškoća" jednaka, jedan od tri if-else izraza može se izvršiti ako su ispunjeni njihovi uvjeti. Uvjeti će se temeljiti na onome na što su dvije varijable "NumOfMinesLEFT" i "NumOfStartingTilesLEFT" jednake. Unutar ove tri naredbe if-else izvršit će se algoritam koji će svaki gumb učiniti beskorisnim (igra je gotova).

Drugo, kada korisnik klikne na jednu od skrivenih pločica bombe, tada se mora izvršiti metoda "GameOver". Ovaj ćemo zadatak dovršiti pozivanjem metode "GameOver" svaki put kada se klikne na pločicu i za pločicu se kaže da je pločica bombe (unutar metoda "operacije" izvedenih u metodi "proces"). Kada se pozove metoda "GameOver", izvršit će se algoritam koji će svaku početnu pločicu učiniti beskorisnom (igra je završena), a skrivene pločice bombe će se otkriti (na temelju odgovarajućih indeksa unutar "popisa rešetki", određenih indeksa na popisu "status" bit će dodijeljen jednoznakovnom nizu "b").

Treće, prikaz zaslona u igri ažurirat će se svaki put kad se GUI osvježi unošenjem vrlo malo manjih izmjena u metodu "setSLASHresetGUI". Nakon što je mreža grafičkog sučelja konfigurirana, smjestit ćemo tri naredbe if-else gdje je postavljena trenutna dodjela gumba za prikaz. Jedna od tri naredbe if-else izvršit će se na temelju onoga što su sljedeće varijable jednake: "GameOverDETECTOR", "težavnost," NumOfMinesLEFT "i" NumOfStartingTilesLEFT ". Kao što se možda pitate, varijabla" GameOverDETECTOR "je nova Ova varijabla bit će stvorena neposredno prije izvođenja naredbi if-else unutar metode "setSLASHresetGUI". Varijabla "GameOverDETECTOR" bit će jednaka cijelom broju koji se nalazi pomoću algoritma koji pronalazi koliko indeksa unutar "mreže" Popis je dodijeljen na cijeli broj devedeset devet (kako su gumbi beskorisni). Na temelju kojih su ispunjeni uvjeti ako-else, doći će do odgovarajućeg preraspodjele prikaza.

Korak 7: Omogućavanje rada gumba za ponovno pokretanje

Uključivanje tipke za ponovno pokretanje
Uključivanje tipke za ponovno pokretanje

OBRAZLOŽENJE:

Ovaj korak je najkraći. Većina posla za ovaj korak već je obavljena. Sve što sada trebamo učiniti je izvršiti metodu "restart" svaki put kada korisnik klikne gumb za ponovno pokretanje.

Prvo i konačno, izvršit ćemo metodu "restart" u metodi "process" s if-else naredbom. Ako niz "!" je registrirana, tada će se izvršiti metoda "restart". Također ćemo morati stvoriti gumb pod nazivom restart na kraju metode "setSLASHresetGUI" prije nego što se sadržaj rešetke pakira zajedno. Ovaj gumb za ponovno pokretanje obradit će niz "!" (naredba lambda: self.process ("!")) i izvršite odgovarajuću metodu "restart" unutar metode "process".

Preporučeni: