Sisukord:

Miinipilduja-Vaarika-Pi-väljaanne: 7 sammu (piltidega)
Miinipilduja-Vaarika-Pi-väljaanne: 7 sammu (piltidega)

Video: Miinipilduja-Vaarika-Pi-väljaanne: 7 sammu (piltidega)

Video: Miinipilduja-Vaarika-Pi-väljaanne: 7 sammu (piltidega)
Video: BTT - Manta M8P - MainSailOS with EMMc 2024, Juuli
Anonim
Miinipilduja-Vaarika-Pi-väljaanne
Miinipilduja-Vaarika-Pi-väljaanne
Miinipilduja-Vaarika-Pi-väljaanne
Miinipilduja-Vaarika-Pi-väljaanne

Minu viimane projekt CSC 130 seeria jaoks Louisiana tehnikaülikoolis on Minesweeper Raspberry Pi Edition. Selle projektiga püüdsin taasluua klassikalise miinipilduja mängu, kasutades programmeerimiskeele Pythoni Tkinter raamatukogu. Miinipildujamängu võrk on kaheksa plaadi laiune ja viie plaadi kõrgune. Projekti vormindus on sobinud ja täiustatud Python 2.7 -ga installitud Raspberry Pi kasutamiseks.

Minesweeper Raspberry Pi Edition lõpliku projekti koodi ja pilte saab alla laadida järgmiselt lingilt:

Miinipilduja-Vaarika-Pi-väljaanne

Tarvikud

x1 Rõivas

Python 2.7 installitud Raspberry Pi -le

Microsoft Powerpoint (või muu tarkvara nuppude jaoks piltide loomiseks)

Samm: looge nuppudega pilte

Loo nuppudega pilte
Loo nuppudega pilte

SELGITUS:

Iga GUI moodustav nupp tuleb luua. Selle ülesande jaoks kasutasin nuppudel kuvamiseks vajalike piltide tegemiseks Microsoft Powerpointi.

Esiteks lõin Microsoft Powerpointi abil kümme paaninuppu, mis on vajalikud miinipildujavõrgu tegemiseks (tühi, bob, null, üks, kaks, kolm, neli, viis, kuus, seitse ja kaheksa).

Teiseks tegin menüükuva jaoks vajalikud neli pilti (menüükuva, lihtsate nuppude nupp, keskmise raskusega nupp ja raskete raskuste nupp), kasutades Microsoft Powerpointi.

Kolmandaks lõin ma taaskäivitusnupu jaoks vajaliku pildi ja teiste erinevate kuvamisnuppude („mäng üle”, „võidad” kuva ja „reeglite” kuva) jaoks vajalikud pildid, kasutades Microsoft Powerpointi.

Neljandaks peate oma piltide suurust muutma, et need ekraanile mahuksid. Kasutasin oma Rasberry Pi puhul akna jaoks järgmisi mõõtmeid (mis viitavad pikslitele pikkuses ja laiuses): 432x576.

Samm: vormindage programm

Vormindusprogramm
Vormindusprogramm

SELGITUS:

Enne tegeliku programmeerimise alustamist peame importima vajalikud teegid ja kirjutama oma programmi põhiosa.

Esiteks peame importima * Tkinteri teegist ja juhuslikust teegist juhuslikult segama. Teiseks peame programmi põhiosas koodi abil täitma järgmised sammud: looma akna, seadistama tiitliakna, looma graafilise kasutajaliidese ja kuvama graafilise kasutajaliidese ning ootama kasutajate suhtlemist. See kood on kirjutatud Tkinteri raamatukogu suhtes õiges vormingus (õige vormindamise nägemiseks vaadake juhendis toodud koodi).

3. samm: looge GUI (menüü ja miinipildujavõrk)

Loo GUI (menüü ja miinipildujavõrk)
Loo GUI (menüü ja miinipildujavõrk)
Loo GUI (menüü ja miinipildujavõrk)
Loo GUI (menüü ja miinipildujavõrk)
Loo GUI (menüü ja miinipildujavõrk)
Loo GUI (menüü ja miinipildujavõrk)
Loo GUI (menüü ja miinipildujavõrk)
Loo GUI (menüü ja miinipildujavõrk)

SELGITUS:

Programmi käivitamisel avatakse menüükuva. Pärast raskuse valimist (klõpsates menüüekraanil ühte raskusnuppu) värskendatakse GUI -d miinipildujavõrgu, ekraani ja taaskäivitusnupu abil. Kuna te alles alustate GUI -ga töötamist, peame vaid käivitama menüü, laskma menüü raskusnupud tööle ja laskma GUI -l värskendada mänguekraani koos miinipildujavõrguga.

Esiteks saame programmi käivitamisel kuvada menüüekraani, kutsudes MainGUI klassi konstruktoris "setupMenu" meetodi.

Teiseks saame lasta iga menüü raskusnupul käivitada teatud koodirid, kui seda klõpsata, lisades "protsessi" meetodi (tuleb lisada ka käsk lambda: self.process ("returnButtonName") kasutatava nupu funktsiooni parameetrite piires iga raskusnupu loomisel). Meetodi "protsess" käigus luuakse kolm if-else lauset ja täidetakse teatud muid meetodeid ja lisakoodi ridu sõltuvalt nupu võrdsusest (nupp võrdub viimati registreeritud nupu nimega).

Kolmandaks, kui menüüekraan on üleval ja kui kasutaja klõpsab mõnel raskusnupul, salvestab programm teatud väärtuse muutujale „raskus” (raskusaste on „lihtne”, „keskmine” või „raske” selle nupu klõpsamisel teatakse, millist if-else lauset järgida, lähtudes sellest, mis nupu nimi viimati registreeriti (mis nupp võrdub). Lisaks peame muutuja "raskus" uuesti määramiseks esmalt aktiveerima see on väljaspool klassi. Seega määrame muutuja "raskused" tühjaks stringiks enne klassi "MainGUI" loomist.

Neljandaks tühjendage GUI "setupMenu" meetodil tehtud nuppudest, tehes meetodi "clearMenu" (kasutades mitmel juhul funktsiooni button.destroy ()) ja kutsudes "clearMenu" meetodi "process" (alt iga raskusnupp registreerub pärast raskusmuutuja määramist).

Viiendaks värskendage GUI -d, tehes meetodi "setSLASHresetGUI" (nupud on valmistatud samamoodi nagu "setupMenu" meetodis) ja helistades meetodi "process" meetodile "setSLASHresetGUI" (iga raskusnupuregistri all raskuste muutuja määramine ja "clearMenu" meetodi kutsumine).

Lisaks peame enne kõigi nuppude määramist meetodis "setSLASHresetGUI" konfigureerima ruudustiku read ja veerud ning pärast kõigi nuppude määramist meetodi "setSLASHresetGUI" raames peame pakkima kogu ruudustiku sisu (vaadake koodi, mis on antud juhendis, et näha õiget vormingut).

4. samm: muutke mängusisese ekraani nupud toimivaks

Muutke mängusisese ekraani nupud toimivaks
Muutke mängusisese ekraani nupud toimivaks
Muutke mängusisese ekraani nupud toimivaks
Muutke mängusisese ekraani nupud toimivaks
Muutke mängusisese ekraani nupud toimivaks
Muutke mängusisese ekraani nupud toimivaks
Muutke mängusisese ekraani nupud toimivaks
Muutke mängusisese ekraani nupud toimivaks

SELGITUS:

Selleks, et nupud saaksid klõpsamisel teatud koodiridasid täita, peame meetodi "protsess" raames täitma. Selle ülesande täitmiseks peame koostama mitu uut meetodit, muutujat ja loendit.

Esiteks teeme kaks nimekirja. Seal on nimekiri nimega "grid". See "ruudustiku" loend koosneb ainult täisarvudest 9 ja 0. Selles loendis tähistab üheksa pommi ja null mittepommi. Nii eristab programm, kas plaat on pomm või mitte. Tehakse teine nimekiri ja seda nimetatakse "olekuks". See "oleku" loend koosneb ainult ühest tähemärgist ("0", "1", "2", "3", "4", "5", "6", "7", "8", "b" "). Selles loendis vastab iga tähemärk teatud pildile. Nii saab programm teada, millist pilti miinipildujavõrgu igal nupul kuvada. Igal miinipildujavõrgu nupul on igas nimekirjas vastav indeks, mis põhineb selle paigutamisel võrku. Vastava indeksi määramiseks toimige järgmiselt (nupu number - 1). Näiteks iga loendi nuppude vastav indeks on nullindeks. Lõpuks täidetakse need kaks loendit enne klassi "MainGUI" täitmist ja luuakse väljaspool klassi "MainGUI". Klass "ruudustik" luuakse tühja loendina (ruudustik = ) ja loend "olek" luuakse vahemikfunktsiooniga (lisades loendile "olek" nelikümmend ühe tähemärgi stringi "n").

Teiseks valmistame erinevaid meetodeid, mis suudavad tuvastada seda ümbritsevate miinide arvu ja mida saab nupu klõpsamisel kasutada (otsuse, millist meetodit tuleks täita, määrab nupu paigutus). Just neid meetodeid nimetatakse meie miinianalüsaatoriteks. Need meetodid suurendavad loendurit nimega "NumOfMines" ja kasutavad ruudustiku loendis teatud indekseid, et teha kindlaks, kui palju pomme paani ümbritseb. Stringi, mis salvestatakse muutuja "NumOfMines", kasutatakse sama vastava indeksi asendamiseks loendis "olek". Nüüd võite küsida, kuidas programm teab, millist indeksit kasutada. Kui nupp on registreeritud meetodis "protsess", luuakse/määratakse muutuja "indeks" kindlale täisarvule (selle põhjal, millist stringi nupp registreerib). Üks loodud meetoditest kasutab seda määratud indeksit, et teada saada plaadi paigutust ja seda ümbritsevate plaatide indekseid (meetodi algoritm selgitab selle välja). Lisaks peame muutuja "indeks" uuesti määramiseks esmalt selle klassist välja näitama. Seega seadistame muutuja "index" täisarvuliseks nulliks enne klassi "MainGUI" loomist.

Kolmandaks luuakse "operatsioonimeetodid". Iga kord, kui nupp registreeritakse, käivitatakse meetod. Need "operatsiooni" meetodid täidetakse "protsessi" meetodis. Meetodi "protsess" puhul määravad mitu if-else lauset, millisele nupule klõpsati (selle alusel, mis nupuga võrdub). Siin kasutatakse teatud "operatsiooni" meetodit (lausetes if-else).

Neljandaks uurime tegelikult, kuidas nupud tööle hakkavad. Nagu varem öeldud, asuvad mitmed if-else laused meetodis "process" ja täidavad teatud muid meetodeid ja lisakoodi ridu sõltuvalt nupu võrdsusest (nupp võrdub viimati registreeritud stringiga). Nendes if-else lausetes ilmneb järgmine järjekord: indeks määratakse globaalselt, vastav nimekiri "staatus" määratakse uuesti stringile "b" (kui ruudustiku loendi vastav indeks on võrdne täisarv üheksa), käivitatakse vastav "operatsiooni" meetod (kui loendi "ruudustik" vastav indeks on täisarv null), määratakse vastav olekunimekirja indeks stringile, mis võrdub muutujaga "NumOfMines" (kui loendi "ruudustik" vastav indeks on täisarv null) ja GUI -d värskendatakse, kutsudes meetodit "setSLASHresetGUI".

Samm: meetod "setDifplicy" Meetod ja "restart" meetod

Pilt
Pilt
Pilt
Pilt

SELGITUS:

Järgmisena tuleb luua meetod "setDifplicy" ja mängusisese ekraani allosas asuv taaskäivitusnupp peab tööle hakkama (luues "taaskäivitamise" meetodi, mis käivitub, kui kasutaja seda klõpsab).

Esiteks tuleb "setDifplicy" meetod rakendada "protsessi" meetodi ja "restart" meetodi raskusnuppude if-else lausetes. Selle meetodiga täidetud koodiridad ja meetodid on üsna lihtsad. Meetodi "setDifplicy" korral lisame "grid" loendisse teatud koguse nulle (mittepommid) ja üheksa (pommid) (kahe vahemiku funktsiooni kaudu igas if-else lauses) ja seejärel segame "grid" loend (juhusliku teegi segamisfunktsiooniga) meetodi "setDifplicy" raames (pärast if-else lausete täitmist). Nullide ja üheksate suhe määratakse selle järgi, milliseks stringiks on määratud muutuja "raskus" ("lihtne": 34-6, "keskmine": 28-12, "raske": 16-24).

Teiseks seadistame "taaskäivitamise" meetodis muutujad "index" ja "NumOfMinesLEFT" globaalselt nulliks, tühjendame nii "status" kui ka "grid" loendid globaalselt, lähtestame "status" loendi vahemiku funktsiooniga (lisades nelikümmend ühe tähemärgi stringi "n" loendisse "olek") ja kasutage meetodit "setDifplicy".

6. samm: mängu lõpetamise stsenaariumid

Mängu lõpetamise stsenaariumid
Mängu lõpetamise stsenaariumid
Mängu lõpetamise stsenaariumid
Mängu lõpetamise stsenaariumid
Mängu lõpetamise stsenaariumid
Mängu lõpetamise stsenaariumid
Mängu lõpetamise stsenaariumid
Mängu lõpetamise stsenaariumid

SELGITUS:

Igal miinipilduja mängul on kaks mängu lõppemise stsenaariumi: võit ja kaotus. Selle programmi raames rakendame need kaks mängu lõpetamise stsenaariumi kahe uue meetodiga: meetodiga "You_A_Winner_Son" ja "GameOver". Enne GUI värskendamist "protsessi" meetodi raames ja kahe mängu lõppemise stsenaariumi meetodiga muudetud indeksite põhjal muudetakse kuvamisnuppu, et tulemus oleks õigesti esindatud.

Esiteks, kui kasutaja klõpsab viimasel peidetud mitte-pommipaanil, tuleb käivitada meetod "You_A_Winner_Son". Selle ülesande täitmiseks kutsume iga kord, kui klõpsame plaati ja leitakse, et plaat on mittepommiplaat (meetodite meetodil „toiming”), kasutades meetodit „You_A_Winner_Son”. Kui võidutingimused on täidetud, täidetakse meetodi "You_A_Winner_Son" raames kaks if-else lauset. Esimene if-else lause täidetakse alati olenemata sellest, kas mängija võitis või mitte, kui seda meetodit kasutatakse. Lähtuvalt sellest, millega muutuja "raskus" võrdub, on teatud algoritm, mis määrab kindlaks, kui palju miine/pomme on peidetud. Selle algoritmiga leitud täisarv salvestatakse muutuja "NumOfMinesLEFT". Järgmisena täidetakse kahe if-else avalduse vahel veel üks algoritm, et leida järelejäänud algusplaatide arv (klõpsamata plaadid). Selle algoritmiga leitud täisarv salvestatakse muutuja "NumOfStartingTilesLEFT". Teine if-else lause täidetakse alati olenemata sellest, kas mängija võitis või mitte, kui seda meetodit kasutatakse. Selle põhjal, millega muutuja "raskus" võrdub, võidakse nende tingimuste täitmisel täita üks kolmest if-else lausest. Tingimuste aluseks on see, millega võrduvad kaks muutujat "NumOfMinesLEFT" ja "NumOfStartingTilesLEFT". Nende kolme if-else avalduse raames täidetakse algoritm, mis muudab iga nupu kasutuks (mäng on lõppenud).

Teiseks, kui kasutaja klõpsab ühel peidetud pommiplaadil, tuleb käivitada meetod "GameOver". Selle ülesande täitmiseks kutsume iga kord, kui klõpsame plaadil ja leiame, et plaat on pommiplaat ("protsessi" meetodis täidetud "toimingute" raames), kasutades "GameOver" meetodit. "GameOver" meetodi kasutamisel käivitatakse algoritm, mis muudab iga alustava plaadi kasutuks (mäng on lõppenud) ja paljastatakse peidetud pommiplaadid (võrgunimekirja vastavate indeksite alusel, teatud indeksid) loendis "olek" määratakse uuesti ühekohalisele stringile "b").

Kolmandaks uuendatakse mängusisese ekraani kuva iga kord, kui GUI-d värskendatakse, tehes väga vähe väiksemaid muudatusi "setSLASHresetGUI" meetodis. Pärast GUI ruudustiku seadistamist paigutame kolm if-else lauset, kuhu praegune kuvamisnupp on paigutatud. Üks kolmest if-else lausest käivitub selle põhjal, millised on järgmised muutujad: "GameOverDETECTOR", "raskus", "NumOfMinesLEFT" ja "NumOfStartingTilesLEFT". Nagu võite mõelda, on muutuja "GameOverDETECTOR" uus muutuja. See muutuja luuakse vahetult enne if-else lausete täitmist meetodi "setSLASHresetGUI" raames. Muutuja "GameOverDETECTOR" on võrdne täisarvuga, mis leitakse algoritmi abil, mis leiab ruudustikus olevate indeksite arvu loend on määratud täisarvule üheksakümmend üheksa (kuidas nupud kasutuks muudetakse). Selle põhjal, millise avalduse if-else tingimused on täidetud, toimub ekraanile vastav ümberpaigutamine.

7. samm: taaskäivitusnupu töövõime muutmine

Taaskäivitusnupu toimivaks muutmine
Taaskäivitusnupu toimivaks muutmine

SELGITUS:

See samm juhtub olema kõige lühem. Enamik selle sammu töö on juba tehtud. Kõik, mida peame nüüd tegema, on käivitada "taaskäivitamise" meetod iga kord, kui kasutaja klõpsab taaskäivitusnupul.

Esiteks ja lõpuks käivitame "protsessi" meetodi "restart" meetodi avaldusega if-else. Kui string "!" on registreeritud, käivitatakse "taaskäivitamise" meetod. Samuti peame enne võrgu sisu kokku pakkimist looma meetodi "setSLASHresetGUI" lõpus nupu nimega restart. See taaskäivitusnupp töötleb stringi "!" (käsk lambda: self.process ("!")) ja käivitage "process" meetodi raames vastav "restart" meetod.

Soovitan: