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, Juli
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 Tehničkom sveučilištu Louisiana je Minesweeper Raspberry Pi Edition. U ovom projektu pokušao sam ponovo stvoriti klasičnu igru minolovca koristeći biblioteku Tkinter programskog jezika Python. Rešetka koju igra minolovac uključuje osam pločica širine i pet pločica visine. Formatiranje projekta prilagođeno je i usavršeno za upotrebu Raspberry Pi instaliranog sa Python 2.7.

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

Minolovac-Raspberry-Pi-Edition

Supplies

x1 Raspberry Pi

Python 2.7 instaliran na Raspberry Pi

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

Korak 1: Kreirajte slike dugmeta

Kreirajte slike dugmeta
Kreirajte slike dugmeta

OBJAŠNJENJE:

Svako dugme koje čini GUI morat će se kreirati. Za ovaj zadatak koristio sam Microsoft Powerpoint kako bih napravio slike koje su mi potrebne za prikaz na gumbima.

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

Drugo, napravio sam četiri slike potrebne za ekran menija (prikaz menija, dugme za laku poteškoću, dugme srednje težine i dugme za teške poteškoće) koristeći Microsoft Powerpoint.

Treće, stvorio sam sliku potrebnu za dugme za ponovno pokretanje i slike potrebne za druga različita dugmad za prikaz (ekran "igra preko", ekran "pobeđujete" i prikaz "pravila") koristeći Microsoft Powerpoint.

Četvrto, morat ćete promijeniti veličinu slika tako da stanu na vaš ekran. Za svoj Rasberry Pi koristio sam sljedeće dimenzije prozora (odnose se na piksele po dužini i širini): 432x576.

Korak 2: Formatirajte program

Formatiranje programa
Formatiranje programa

OBJAŠNJENJE:

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

Prvo ćemo morati uvesti * iz biblioteke Tkinter i miješati iz slučajne biblioteke. Drugo, morat ćemo dovršiti sljedeće korake u kodu u glavnom dijelu programa: stvoriti prozor, postaviti naslovni prozor, generirati GUI i prikazati GUI i pričekati interakciju korisnika. Ovaj kôd je napisan pravilnim oblikovanjem u odnosu na biblioteku Tkinter (pogledajte kod dat u uputstvu da biste vidjeli pravilno oblikovanje).

Korak 3: Kreirajte GUI (Mreža i Minolovka)

Kreirajte GUI (Mreža i Minolovka)
Kreirajte GUI (Mreža i Minolovka)
Kreirajte GUI (Mreža i Minolovka)
Kreirajte GUI (Mreža i Minolovka)
Kreirajte GUI (Mreža i Minolovka)
Kreirajte GUI (Mreža i Minolovka)
Kreirajte GUI (Mreža i Minolovka)
Kreirajte GUI (Mreža i Minolovka)

OBJAŠNJENJE:

Nakon pokretanja programa, pokrenut će se zaslon izbornika. Nakon što se izabere poteškoća (klikom na jedno od dugmadi za poteškoće na ekranu 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 u izborniku i osvježavanje grafičkog sučelja na ekran za igru s mrežom minolovaca.

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

Drugo, možemo imati da svaki od tastera sa poteškoćama na meniju izvrši određene redove koda kad god se klikne dodavanjem metode "process" (morat će se dodati i naredba lambda: self.process ("returnButtonName") unutar parametara funkcije dugmeta u kreiranju svakog dugmeta za poteškoće). Tri if-else naredbe bit će kreirane u "process" metodi i izvršit će određene druge metode i retke dodatnog koda ovisno o tome što je dugme jednako (button jednako bilo kojem imenu dugmeta koji je zadnji put registriran).

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

Četvrto, očistite GUI gumba napravljenih metodom "setupMenu" tako što ćete napraviti metodu "clearMenu" (koristeći funkciju button.destroy () u više instanci) i pozvati metodu "clearMenu" u metodi "process" (pod svako dugme za poteškoće se registruje nakon dodjeljivanja varijable težine).

Peto, osvježite GUI tako što ćete napraviti metodu "setSLASHresetGUI" (dugmad su napravljena na isti način kao u metodi "setupMenu") i pozvati metodu "setSLASHresetGUI" u metodi "process" (ispod svakog registra tipki za poteškoće nakon dodjeljivanje varijabli poteškoća i pozivanje metode "clearMenu").

Dodatno, prije nego što se svi gumbi dodijele u okviru metode "setSLASHresetGUI", moramo konfigurirati redove i stupce unutar mreže, a nakon što su svi gumbi dodijeljeni unutar metode "setSLASHresetGUI" moramo zapakirati sav sadržaj unutar mreže (pogledajte kôd dat u uputstvu za pravilno formatiranje).

Korak 4: Omogućite da tasteri na ekranu u igri budu operativni

Neka tasteri na ekranu u igri budu operativni
Neka tasteri na ekranu u igri budu operativni
Neka tasteri na ekranu u igri budu operativni
Neka tasteri na ekranu u igri budu operativni
Neka tasteri na ekranu u igri budu operativni
Neka tasteri na ekranu u igri budu operativni
Neka tasteri na ekranu u igri budu operativni
Neka tasteri na ekranu u igri budu operativni

OBJAŠNJENJE:

Da bi gumbi izvršili određene redove koda kada se kliknu, morat ćemo izvršiti metode unutar metode "process". Za ovaj zadatak morat ćemo napraviti više novih metoda, varijabli i lista.

Prvo ćemo napraviti dvije liste. Postojat će lista pod nazivom "rešetka". Ova lista "rešetke" sastojat će se samo od cijelih brojeva 9 i 0. Na ovoj listi devet će predstavljati bombe, a nule će predstavljati ne-bombe. Ovako će program razlikovati je li pločica bomba ili ne. Napravit će se druga lista koja će se zvati "status". Ova lista "statusa" sastoji se od samo jednog niza znakova ("0", "1", "2", "3", "4", "5", "6", "7", "8", "b" "). Na ovoj listi će svaki niz znakova odgovarati određenoj slici. Ovako će program znati koju sliku prikazati na svakom gumbu u mreži minolovca. Svako dugme u rešetki minopolagača imat će odgovarajući indeks na svakoj listi na osnovu svog položaja u mreži. Odgovarajući indeks će biti dodijeljen sljedećom procedurom (broj dugmeta - 1). Na primjer, odgovarajući indeks dugmeta na svakoj listi je indeks nula. Na kraju, ove dvije liste će se izvršiti prije nego što se izvrši klasa "MainGUI" i bit će kreirane izvan klase "MainGUI". Klasa "grid" će biti kreirana kao prazna lista (grid = ), a lista "status" će biti kreirana funkcijom raspona (dodajući četrdeset nizova s jednim znakom "n" listi "status").

Drugo, napravit ćemo različite metode koje mogu otkriti broj mina koje ga okružuju i koje se mogu pozvati kada se pritisne dugme (odluka o tome koju metodu treba izvršiti bit će određena postavljanjem dugmeta). Upravo će se te metode zvati naši analizatori rudnika. Ove metode povećavaju brojač pod nazivom "NumOfMines" i koristit će određene indekse unutar "grid" liste za određivanje koliko bombi okružuje pločicu. Niz koji će biti uskladišten u varijabli "NumOfMines" će se koristiti za zamjenu istog odgovarajućeg indeksa na listi "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 kreiranih 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 "index" varijable morat ćemo je prvo instancirati izvan klase. Zato ćemo postaviti varijablu "index" kao cijelu nulu prije nego što se kreira klasa "MainGUI".

Treće, bit će stvorene "operativne" metode. Metoda "operacije" će se izvoditi svaki put kada se dugme registruje. Ove metode "operacije" bit će izvedene u metodi "procesa". U metodi "process", više if-else naredbi će odrediti koje je dugme pritisnuto (na osnovu onoga što je dugme jednako). Ovdje će se pozvati određena metoda "operacije" (u naredbama if-else).

Četvrto, zapravo ćemo istražiti kako tasteri postaju operativni. Kao što je ranije 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 dugme jednako (button je jednako što je niz koji je zadnji put registriran). Unutar ovih naredbi if-else dogodit će se sljedeće po redoslijedu: indeks će biti dodijeljen globalno, odgovarajući indeks na listi "statusa" bit će dodijeljen nizu "b" (ako je odgovarajući indeks liste "rešetka" jednak cijeli broj devet), bit će izvedena odgovarajuća metoda "operacije" (ako je odgovarajući indeks liste "rešetke" jednak cijeloj nuli), odgovarajući indeks na listi "statusa" bit će dodijeljen nizu koji je jednak varijabli "NumOfMines" (ako je odgovarajući indeks liste "grid" jednak cijeloj nuli), a GUI će se osvježiti pozivanjem metode "setSLASHresetGUI".

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

Image
Image
Image
Image

OBJAŠNJENJE:

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

Prvo, metoda "setDifficulty" morat će se implementirati u if-else izjave tipki za poteškoće u "process" metodi i u "restart" metodi. Linije koda i metode izvedene ovom metodom prilično su jednostavne. U "setDifficulty" metodi, mi ćemo dodati određenu količinu nula (ne-bombi) i devetki (bombi) na "grid" listu (putem dvije funkcije raspona unutar svake naredbe if-else), a zatim ćemo miješati "grid" listu (sa funkcijom nasumične biblioteke u slučajnom redoslijedu) unutar "setDifficulty" metode (nakon izvršavanja naredbi if-else). Omjer nula i devetki bit će određen na koji je niz postavljena varijabla "težavnost" ("lako": 34-6, "srednje": 28-12, "teško": 16-24).

Drugo, u metodi "restart" postavit ćemo varijable "index" i "NumOfMinesLEFT" na nulu globalno, globalno isprazniti i "status" i "grid" liste, resetirati listu "status" s funkcijom raspona (dodavanjem četrdeset nizova s jednim znakom od "n" na listi "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

OBJAŠNJENJE:

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 se grafički korisnički interfejs osvježi unutar metode "proces" i na osnovu indeksa promijenjenih pomoću dvije metode scenarija završetka igre, gumb za prikaz će se promijeniti kako bi pravilno 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 (u okviru 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 izvršiti bez obzira je li igrač pobijedio ili ne kada se pozove ova metoda. Na osnovu 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 će se uvijek izvoditi bez obzira je li igrač pobijedio ili ne kada se pozove ova metoda. Na osnovu onoga što je varijabla "poteškoća" jednaka, jedna od tri naredbe if-else može se izvršiti ako su ispunjeni njihovi uslovi. Uslovi će se zasnivati na tome na šta su jednake dvije varijable "NumOfMinesLEFT" i "NumOfStartingTilesLEFT". Unutar ove tri naredbe if-else, izvršit će se algoritam koji će svako dugme učiniti beskorisnim (igra je završena).

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 utvrdi da je pločica bombe (unutar metoda "operacije" izvedenih u metodi "proces"). Kada se pozove "GameOver" metoda, izvršit će se algoritam koji će svaku početnu pločicu učiniti beskorisnom (igra je završena) i skrivene pločice bombe će biti otkrivene (na osnovu odgovarajućih indeksa unutar "grid liste", određenih indeksa na popisu "status" bit će dodijeljen jednoznakovnom nizu "b").

Treće, prikaz ekrana u igri će se ažurirati svaki put kada se grafički korisnički interfejs 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 postavljen trenutni raspored tipki za prikaz. Jedna od tri naredbe if-else će se izvršiti na osnovu 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 će biti kreirana 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" liste su dodijeljene na cijeli broj devedeset devet (kako su gumbi beskorisni). Na osnovu čega su ispunjeni uvjeti if-else, doći će do odgovarajuće preraspodjele prikaza.

Korak 7: Omogućavanje da dugme za ponovno pokretanje postane operativno

Uključivanje dugmeta za ponovno pokretanje
Uključivanje dugmeta za ponovno pokretanje

OBJAŠNJENJE:

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

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

Preporučuje se: