Cuprins:

Minesweeper-Raspberry-Pi-Edition: 7 pași (cu imagini)
Minesweeper-Raspberry-Pi-Edition: 7 pași (cu imagini)

Video: Minesweeper-Raspberry-Pi-Edition: 7 pași (cu imagini)

Video: Minesweeper-Raspberry-Pi-Edition: 7 pași (cu imagini)
Video: Vending SCP-261 Pan-dimensional și Experiment Log 261 Ad De + complet + 2024, Noiembrie
Anonim
Minesweeper-Raspberry-Pi-Edition
Minesweeper-Raspberry-Pi-Edition
Minesweeper-Raspberry-Pi-Edition
Minesweeper-Raspberry-Pi-Edition

Proiectul meu final pentru seria CSC 130 de la Louisiana Tech University este Minesweeper Raspberry Pi Edition. În acest proiect, am căutat să recreez clasicul joc de minesweeper utilizând biblioteca Tkinter a limbajului de programare Python. Grila pe care o cuprinde jocul Minesweeper este de opt dale în lățime și cinci dale în înălțime. Formatarea proiectului a fost potrivită și perfecționată pentru utilizarea unui Raspberry Pi instalat cu Python 2.7.

Codul și imaginile pentru proiectul final Minesweeper Raspberry Pi Edition pot fi descărcate de pe următorul link:

Minesweeper-Raspberry-Pi-Edition

Provizii

x1 Raspberry Pi

Python 2.7 Instalat pe Raspberry Pi

Microsoft Powerpoint (sau un alt software pentru a crea imagini pentru butoane)

Pasul 1: Creați imagini cu butoane

Creați imagini cu butoane
Creați imagini cu butoane

EXPLICAŢIE:

Fiecare buton care alcătuiește GUI va trebui creat. Pentru această sarcină, am folosit Microsoft Powerpoint pentru a realiza imaginile de care aveam nevoie să le afișez pe butoane.

În primul rând, am creat cele zece butoane de țiglă necesare pentru a face grila de măturător (gol, bob, zero, unu, doi, trei, patru, cinci, șase, șapte și opt) folosind Microsoft Powerpoint.

În al doilea rând, am realizat cele patru imagini necesare pentru ecranul meniului (afișarea meniului, butonul de dificultate ușoară, butonul de dificultate medie și butonul de dificultate dificilă) folosind Microsoft Powerpoint.

În al treilea rând, am creat imaginea necesară pentru butonul de repornire și imaginile necesare pentru celelalte butoane diferite de afișare (un afișaj „joc peste”, un afișaj „câștigi” și un afișaj „reguli”) folosind Microsoft Powerpoint.

În al patrulea rând, va trebui să redimensionați imaginile pentru a se încadra în ecranul dvs. Pentru Rasberry Pi, am folosit următoarele dimensiuni pentru fereastră (referindu-se la pixeli în lungime și lățime): 432x576.

Pasul 2: Formatați programul

Formatați programul
Formatați programul

EXPLICAŢIE:

Înainte ca orice programare să poată avea loc, trebuie să importăm bibliotecile de care avem nevoie și să scriem partea principală a programului nostru.

Mai întâi, va trebui să importăm * din biblioteca Tkinter și să amestecăm din biblioteca aleatorie. În al doilea rând, va trebui să parcurgem următorii pași în cod în partea principală a programului: creați fereastra, setați fereastra de titlu, generați interfața grafică, afișați interfața grafică și așteptați interacțiunea cu utilizatorul. Acest cod este scris într-o formatare adecvată în raport cu biblioteca Tkinter (uitați-vă la codul dat în instructabil pentru a vedea formatarea corectă).

Pasul 3: Creați interfața grafică (Meniu și grilă Minesweeper)

Creați interfața grafică (Meniu și grilă Minesweeper)
Creați interfața grafică (Meniu și grilă Minesweeper)
Creați interfața grafică (Meniu și grilă Minesweeper)
Creați interfața grafică (Meniu și grilă Minesweeper)
Creați interfața grafică (Meniu și grilă Minesweeper)
Creați interfața grafică (Meniu și grilă Minesweeper)
Creați interfața grafică (Menu & Minesweeper Grid)
Creați interfața grafică (Menu & Minesweeper Grid)

EXPLICAŢIE:

La pornirea programului, va fi lansat ecranul meniului. După ce este selectată dificultatea (făcând clic pe unul dintre butoanele de dificultate de pe ecranul meniului), interfața grafică va fi reîmprospătată cu grila minieră, un afișaj și un buton de repornire. Întrucât abia începeți să lucrați la GUI, va trebui doar să lansăm meniul, să faceți ca butoanele de dificultate ale meniului să devină operaționale și să reîmprospătați GUI pe ecranul jocului cu grila minesweeper.

În primul rând, putem afișa ecranul meniului la pornirea programului apelând metoda „setupMenu” în cadrul constructorului clasei MainGUI.

În al doilea rând, putem face ca fiecare dintre butoanele de dificultate ale meniului să execute anumite linii de cod ori de câte ori se face clic prin adăugarea unei metode „proces” (va trebui să adăugăm și comanda lambda: self.process („returnButtonName”) în parametrii funcției butonului utilizat în crearea fiecărui buton de dificultate). Trei instrucțiuni if-else vor fi create în metoda „proces” și vor executa anumite alte metode și linii de cod suplimentar în funcție de ceea ce butonul este egal (butonul este egal cu numele butonului care a fost înregistrat ultima dată).

În al treilea rând, în timp ce ecranul meniului este activat și dacă utilizatorul face clic pe unul dintre butoanele de dificultate, atunci programul va salva o anumită valoare în variabila „dificultate” (dificultatea este egală cu „ușor”, „mediu” sau „greu”) pe care buton de dificultate este făcut clic). Acest clic pe un buton știe ce instrucțiune if-else să urmeze în funcție de numele butonului care a fost înregistrat ultima dată (ce buton este egal). În plus, pentru a reatribui variabila „dificultate” va trebui mai întâi să instanțiem deci vom seta variabila „dificultate” ca un șir gol înainte ca clasa „MainGUI” să fie creată.

În al patrulea rând, ștergeți GUI-ul butoanelor realizate prin metoda „setupMenu” făcând o metodă „clearMenu” (folosind funcția button.destroy () în mai multe instanțe) și apelând metoda „clearMenu” în metoda „proces” (în fiecare dintre butoanele de dificultate se înregistrează după atribuirea variabilei de dificultate).

În al cincilea rând, reîmprospătați interfața grafică făcând o metodă „setSLASHresetGUI” (butoanele sunt făcute la fel ca în metoda „setupMenu”) și apelând metoda „setSLASHresetGUI” în metoda „proces” (sub fiecare dintre butoanele de dificultate se înregistrează după atribuirea variabilelor de dificultate și apelarea metodei „clearMenu”).

În plus, înainte ca toate butoanele să fie alocate în cadrul metodei "setSLASHresetGUI" trebuie să configurăm rândurile și coloanele din grilă și după ce toate butoanele sunt alocate în cadrul metodei "setSLASHresetGUI" trebuie să împachetăm tot conținutul în grilă (uitați-vă la cod dat în instructabil pentru a vedea formatarea corectă).

Pasul 4: Faceți funcționale butoanele de pe ecranul din joc

Faceți ca butoanele de pe ecranul din joc să funcționeze
Faceți ca butoanele de pe ecranul din joc să funcționeze
Faceți ca butoanele de pe ecranul din joc să funcționeze
Faceți ca butoanele de pe ecranul din joc să funcționeze
Faceți ca butoanele de pe ecranul din joc să funcționeze
Faceți ca butoanele de pe ecranul din joc să funcționeze
Faceți ca butoanele de pe ecranul din joc să funcționeze
Faceți ca butoanele de pe ecranul din joc să funcționeze

EXPLICAŢIE:

Pentru ca butoanele să execute anumite linii de cod atunci când sunt făcute clic, va trebui să executăm metode în cadrul metodei „proces”. Pentru această sarcină, va trebui să realizăm mai multe metode, variabile și liste noi.

În primul rând, vom face două liste. Va exista o listă numită „grilă”. Această listă „grilă” va consta doar din numerele întregi 9 și 0. În această listă, nouă vor reprezenta bombe, iar zerourile vor reprezenta non-bombe. Acesta este modul în care programul va distinge dacă o țiglă este sau nu o bombă. O a doua listă va fi făcută și va fi numită „stare”. Această listă „stare” constă dintr-un singur șir de caractere („0”, „1”, „2”, „3”, „4”, „5”, „6”, „7”, „8”, „b” "). În această listă, fiecare șir de caractere va corespunde unei anumite imagini. Acesta este modul în care programul va ști ce imagine să afișeze pe fiecare buton din grila de măturătoare. Fiecare buton din grila de mina va avea un index corespunzător în fiecare listă pe baza plasării sale în grilă. Indicele corespunzător va fi atribuit prin următoarea procedură (numărul butonului - 1). De exemplu, indicele corespunzător al butonului în fiecare listă este indicele zero. În cele din urmă, aceste două liste vor fi executate înainte de executarea clasei "MainGUI" și vor fi create în afara clasei "MainGUI". Clasa „grilă” va fi creată ca o listă goală (grilă = ), iar lista „stare” va fi creată de o funcție de interval (adăugând patruzeci de șiruri de caractere de „n” la lista „stare”).

În al doilea rând, vom face diferite metode care pot detecta numărul de mine care îl înconjoară și care pot fi apelate când se face clic pe un buton (decizia carei metode care ar trebui executată va fi determinată de plasarea butonului). Aceste metode vor fi numite analizatorii noștri de mină. Aceste metode vor incrementa un contor numit „NumOfMines” și vor folosi anumiți indici din lista „grilă” pentru a determina câte bombe înconjoară țiglă. Șirul care va fi stocat în variabila „NumOfMines” va fi utilizat pentru a înlocui același index corespunzător din lista „status”. Acum, vă puteți întreba cum va ști programul ce index să utilizeze. Când un buton este înregistrat în metoda „proces”, atunci va fi creată / reatribuită o variabilă „index” la un anumit număr întreg (în funcție de ce șir înregistrează butonul). Una dintre metodele create va folosi acel index atribuit pentru a cunoaște amplasarea țiglei și indexurile plăcilor care o înconjoară (algoritmul din cadrul metodei va da seama de acest lucru). În plus, pentru a reatribui variabila „index” va trebui mai întâi să o instanțiem în afara clasei. Deci, vom preseta variabila „index” ca zero întreg înainte de a se crea clasa „MainGUI”.

În al treilea rând, vor fi create metode de „operațiune”. O metodă de „operațiune” va fi executată de fiecare dată când este înregistrat un buton. Aceste metode de „operațiune” vor fi executate în metoda „proces”. În metoda „proces”, mai multe instrucțiuni if-else vor determina care buton a fost făcut clic (pe baza butonului egal). Aici va fi apelată o anumită metodă de „operațiune” (în instrucțiunile if-else).

În al patrulea rând, vom intra de fapt în modul în care butoanele devin operaționale. După cum sa menționat anterior, mai multe instrucțiuni if-else sunt localizate în metoda „proces” și execută anumite alte metode și linii de cod suplimentar în funcție de ceea ce egalează butonul (butonul este egal cu șirul care a fost înregistrat ultima dată). În cadrul acestor afirmații if-else, vor apărea următoarele în ordine: indexul va fi atribuit global, acel index corespunzător din lista „status” va fi reasignat șirului „b” (dacă indexul corespunzător al listei „grid” este egal cu întregul nouă), se va executa o metodă de „operațiune” corespunzătoare (dacă indicele corespunzător al listei „grilă” este egal cu zero întreg), acel indice corespunzător din lista „stare” va fi reatribuit la un șir care este egal cu variabila „NumOfMines” (dacă indicele corespunzător al listei „grid” este egal cu zero întreg), iar interfața grafică va fi reîmprospătată apelând metoda „setSLASHresetGUI”.

Pasul 5: Metoda „setDifficulty” & Metoda „restart”

Imagine
Imagine
Imagine
Imagine

EXPLICAŢIE:

Apoi, va trebui creată o metodă „setDifficulty”, iar butonul de repornire situat în partea de jos a ecranului din joc va trebui să devină operațional (prin crearea unei metode de „repornire” pentru a fi executată atunci când este făcut clic de utilizator).

În primul rând, metoda „setDifficulty” va trebui implementată în instrucțiunile if-else ale butoanelor de dificultate din metoda „proces” și din metoda „restart”. Liniile de cod și metodele executate în această metodă sunt destul de simple. În metoda „setDifficulty”, vom adăuga o anumită cantitate de zerouri (non-bombe) și nouă (bombe) la lista „grid” (prin două funcții de gamă în cadrul fiecărei instrucțiuni if-else) și apoi vom amesteca lista "grilă" (cu funcția de amestecare a bibliotecii aleatorii) în cadrul metodei "setDifficulty" (după ce sunt executate instrucțiunile if-else). Raportul zero-uri la nouă va fi determinat de ce șir este setată variabila „dificultate” („ușor”: 34-6, „mediu”: 28-12, „greu”: 16-24).

În al doilea rând, în metoda „reporniți”, vom seta variabilele „index” și „NumOfMinesLEFT” la zero la nivel global, vom goli atât listele „status”, cât și „grid” la nivel global, vom reseta lista „status” cu o funcție de interval (adăugând patruzeci de șiruri de caractere simple de „n” la lista „stare”) și apelează la metoda „setDifficulty”.

Pasul 6: scenarii de finalizare a jocului

Scenarii de finalizare a jocului
Scenarii de finalizare a jocului
Scenarii de finalizare a jocului
Scenarii de finalizare a jocului
Scenarii de finalizare a jocului
Scenarii de finalizare a jocului
Scenarii de finalizare a jocului
Scenarii de finalizare a jocului

EXPLICAŢIE:

Fiecare joc de mina are două scenarii de finalizare a jocului: câștig și pierdere. În cadrul acestui program, vom implementa aceste două scenarii de finalizare a jocului cu două metode noi: o metodă „You_A_Winner_Son” și o metodă „GameOver”. Înainte ca interfața grafică să fie actualizată în cadrul metodei „proces” și pe baza indexurilor modificate de cele două metode de scenariu de finalizare a jocului, butonul de afișare va fi modificat pentru a reprezenta corect rezultatul.

În primul rând, atunci când utilizatorul face clic pe ultima țiglă ascunsă fără bombă, atunci trebuie executată metoda „You_A_Winner_Son”. Vom finaliza această sarcină apelând la metoda „You_A_Winner_Son” de fiecare dată când se face clic pe o țiglă și se găsește ca o țiglă fără bombă (în cadrul metodelor „operațională” executate în metoda „proces”). Dacă sunt îndeplinite condițiile de câștig, atunci vor fi executate două declarații if-else în cadrul metodei „You_A_Winner_Son”. Prima instrucțiune if-else se va executa întotdeauna indiferent dacă jucătorul a câștigat sau nu atunci când este apelată această metodă. Pe baza echivalentei variabilei „dificultate”, un anumit algoritm care va determina câte mine / bombe rămân ascunse. Numărul întreg găsit de acest algoritm va fi salvat în variabila „NumOfMinesLEFT”. Apoi, între cele două instrucțiuni if-else, va fi executat un alt algoritm pentru a găsi numărul de plăci inițiale rămase (plăci neclise). Numărul întreg găsit de acest algoritm va fi salvat în variabila „NumOfStartingTilesLEFT”. A doua instrucțiune if-else se va executa întotdeauna indiferent dacă jucătorul a câștigat sau nu atunci când este apelată această metodă. Pe baza variabilei „dificultate” este egală, una dintre cele trei instrucțiuni if-else poate fi executată dacă condițiile lor sunt îndeplinite. Condițiile se vor baza pe care sunt egale cele două variabile "NumOfMinesLEFT" și "NumOfStartingTilesLEFT". În cadrul acestor trei instrucțiuni if-else, va fi executat un algoritm care va face ca fiecare buton să fie inutil (jocul s-a terminat).

În al doilea rând, atunci când utilizatorul face clic pe una dintre piesele de bombă ascunse, atunci trebuie executată metoda „GameOver”. Vom finaliza această sarcină apelând la metoda "GameOver" de fiecare dată când se face clic pe o țiglă și se găsește ca o țiglă de bombă (în cadrul metodelor de „operațiune” executate în metoda „proces”). Când se apelează la metoda „GameOver”, se va executa un algoritm care va face inutilă fiecare țiglă de pornire (jocul s-a terminat) și vor fi dezvăluite plăcile ascunse ale bombei (pe baza indexurilor corespunzătoare din „lista grilelor, anumiți indici în lista „stare” va fi reatribuit șirului cu un singur caracter „b”).

În al treilea rând, afișarea ecranului din joc va fi actualizată de fiecare dată când GUI este reîmprospătată, făcând foarte puține editări minore la metoda „setSLASHresetGUI”. După configurarea grilei GUI, vom plasa trei instrucțiuni if-else unde este plasată atribuirea curentă a butonului de afișare. Una dintre cele trei instrucțiuni if-else se va executa pe baza următoarelor variabile egale cu: "GameOverDETECTOR", "dificultate," NumOfMinesLEFT "și" NumOfStartingTilesLEFT ". După cum vă puteți întreba, variabila" GameOverDETECTOR "este o nouă Această variabilă va fi creată chiar înainte ca instrucțiunile if-else să fie executate în cadrul metodei "setSLASHresetGUI". Variabila "GameOverDETECTOR" va fi egală cu întregul care se găsește folosind un algoritm care găsește câți indici din "grilă". list au fost realocate la numărul întreg nouăzeci și nouă (modul în care butoanele sunt inutile). Pe baza condițiilor instrucțiunii if-else sunt îndeplinite, va avea loc o reasignare corespunzătoare la afișaj.

Pasul 7: Punerea în funcțiune a butonului de repornire

Punerea în funcțiune a butonului de repornire
Punerea în funcțiune a butonului de repornire

EXPLICAŢIE:

Acest pas se întâmplă să fie cel mai scurt. Cea mai mare parte a muncii pentru acest pas a fost deja realizată. Tot ce va trebui să facem acum este să executăm metoda „reporniți” de fiecare dată când utilizatorul face clic pe butonul de repornire.

Mai întâi și în cele din urmă, vom executa metoda „restart” în metoda „proces” cu o instrucțiune if-else. Dacă șirul „!” este înregistrat, atunci se va executa metoda „repornire”. De asemenea, va trebui să creăm un buton numit restart la sfârșitul metodei "setSLASHresetGUI" înainte ca conținutul grilei să fie împachetate împreună. Acest buton de repornire va procesa șirul „!” (comanda lambda: self.process ("!")) și execută metoda corespunzătoare "restart" în cadrul metodei "proces".

Recomandat: