Turinys:

„Minesweeper-Raspberry-Pi-Edition“: 7 žingsniai (su nuotraukomis)
„Minesweeper-Raspberry-Pi-Edition“: 7 žingsniai (su nuotraukomis)

Video: „Minesweeper-Raspberry-Pi-Edition“: 7 žingsniai (su nuotraukomis)

Video: „Minesweeper-Raspberry-Pi-Edition“: 7 žingsniai (su nuotraukomis)
Video: linux users be like 2024, Liepa
Anonim
„Minesweeper-Raspberry-Pi-Edition“
„Minesweeper-Raspberry-Pi-Edition“
„Minesweeper-Raspberry-Pi-Edition“
„Minesweeper-Raspberry-Pi-Edition“

Mano paskutinis CSC 130 serijos projektas Luizianos technikos universitete yra „Minesweeper Raspberry Pi Edition“. Šiame projekte aš siekiau atkurti klasikinį minų ieškotojo žaidimą, naudodamas „Python“programavimo kalbos „Tkinter“biblioteką. Minosvaidžio žaidimo tinklelį sudaro aštuonios plytelės pločio ir penkios plytelės aukščio. Projekto formatavimas buvo pritaikytas ir patobulintas naudoti „Raspberry Pi“, įdiegtą kartu su „Python 2.7“.

„Minesweeper Raspberry Pi Edition“galutinio projekto kodą ir vaizdus galima atsisiųsti iš šios nuorodos:

„Minesweeper-Raspberry-Pi-Edition“

Prekės

x1 Laisvė

„Python 2.7“įdiegta „Raspberry Pi“

„Microsoft Powerpoint“(arba kita programinė įranga, skirta mygtuko vaizdams kurti)

1 žingsnis: sukurkite mygtukų vaizdus

Sukurkite mygtukų vaizdus
Sukurkite mygtukų vaizdus

AIŠKINIMAS:

Reikės sukurti kiekvieną mygtuką, kuris sudaro GUI. Atlikdamas šią užduotį, naudoju „Microsoft Powerpoint“, kad padarytų vaizdus, kuriuos reikia rodyti mygtukuose.

Pirmiausia sukūriau dešimt plytelių mygtukų, reikalingų minų laivo tinklui (tuščias, bobas, nulis, vienas, du, trys, keturi, penki, šeši, septyni ir aštuoni) sukurti naudojant „Microsoft Powerpoint“.

Antra, aš padariau keturis vaizdus, reikalingus meniu ekranui (meniu rodymas, lengvo sunkumo mygtukas, vidutinio sunkumo mygtukas ir sunkių sunkumų mygtukas), naudodamas „Microsoft Powerpoint“.

Trečia, naudodamas „Microsoft Powerpoint“sukūriau vaizdą, reikalingą iš naujo paleisti mygtukui, ir vaizdus, reikalingus kitiems skirtingiems rodymo mygtukams („game over“ekranui, „you win“ekranui ir „taisyklių“ekranui).

Ketvirta, turėsite pakeisti savo vaizdų dydį, kad jie tilptų į jūsų ekraną. „Rasberry Pi“naudoju šiuos lango matmenis (atsižvelgiant į ilgio ir pločio pikselius): 432x576.

2 žingsnis: suformatuokite programą

Formatuoti programą
Formatuoti programą

AIŠKINIMAS:

Prieš pradėdami bet kokį faktinį programavimą, turime importuoti mums reikalingas bibliotekas ir parašyti pagrindinę programos dalį.

Pirma, turėsime importuoti * iš „Tkinter“bibliotekos ir maišyti iš atsitiktinės bibliotekos. Antra, pagrindinėje programos dalyje turėsime atlikti šiuos kodo veiksmus: sukurti langą, nustatyti pavadinimo langą, sugeneruoti GUI ir rodyti GUI bei laukti vartotojo sąveikos. Šis kodas yra parašytas tinkamu formatu „Tkinter“bibliotekos atžvilgiu (norėdami pamatyti tinkamą formatavimą, žiūrėkite instrukcijoje pateiktą kodą).

3 veiksmas: sukurkite GUI (meniu ir minų ieškiklio tinklelis)

Sukurkite GUI (meniu ir minų ieškiklio tinklelis)
Sukurkite GUI (meniu ir minų ieškiklio tinklelis)
Sukurkite GUI (meniu ir minų ieškiklio tinklelis)
Sukurkite GUI (meniu ir minų ieškiklio tinklelis)
Sukurkite GUI (meniu ir minų ieškiklio tinklelis)
Sukurkite GUI (meniu ir minų ieškiklio tinklelis)
Sukurkite GUI (meniu ir minų ieškiklio tinklelis)
Sukurkite GUI (meniu ir minų ieškiklio tinklelis)

AIŠKINIMAS:

Paleidus programą, atidaromas meniu ekranas. Pasirinkus sunkumą (spustelėjus vieną iš sunkumų mygtukų meniu ekrane), GUI atnaujinama naudojant minų laivo tinklelį, ekraną ir paleidimo mygtuką. Kadangi jūs tik pradedate dirbti su GUI, mums reikės tik paleisti meniu, pradėti veikti meniu sunkumų mygtukai ir atnaujinti GUI žaidimo ekrane naudojant minų laivo tinklelį.

Pirma, paleidus programą, meniu ekranas gali būti rodomas pats, paskambinus „setupMenu“metodui „MainGUI“klasės konstruktoriuje.

Antra, kiekvienas meniu sunkumų mygtukas gali vykdyti tam tikras kodo eilutes, kai tik spustelėjamas, pridedant „proceso“metodą (taip pat reikia pridėti komandą lambda: self.process („returnButtonName“) naudojamų mygtukų funkcijos parametruose kuriant kiekvieno sunkumo mygtuką). Trys „kitaip“teiginiai bus sukurti naudojant „proceso“metodą ir vykdys tam tikrus kitus metodus bei papildomo kodo eilutes, priklausomai nuo to, koks mygtukas yra lygus (mygtukas atitinka bet kokį paskutinį kartą užregistruoto mygtuko pavadinimą).

Trečia, kai meniu ekranas yra aukštyn ir jei vartotojas spustelėja vieną iš sudėtingumo mygtukų, programa išsaugos tam tikrą reikšmę kintamajame „sunkumas“(sunkumas lygus „lengvas“, „vidutinis“arba „sunkus“) Šis mygtuko paspaudimas žino, kurį teiginį, jei reikia, sekti pagal tai, koks mygtuko pavadinimas paskutinį kartą buvo užregistruotas (koks mygtukas yra lygus). Be to, norėdami iš naujo priskirti kintamąjį „sunkumas“, pirmiausia turėsime suaktyvinti prieš klasę „MainGUI“mes nustatysime kintamąjį „sunkumas“kaip tuščią eilutę.

Ketvirta, išvalykite „setupMenu“metodu padarytų mygtukų GUI, sukurdami „clearMenu“metodą (naudodami funkciją button.destroy () keliais atvejais) ir iškviesdami „clearMenu“metodą „process“metodu (sk. kiekvienas sunkumo mygtukas užregistruojamas po sunkumo kintamojo priskyrimo).

Penkta, atnaujinkite GUI sukurdami metodą „setSLASHresetGUI“(mygtukai yra pagaminti taip pat, kaip ir „setupMenu“metodu) ir iškviečiant „setSLASHresetGUI“metodą „process“metodu (po kiekvienu sunkumų mygtukų registru po kintamųjų priskyrimas ir „clearMenu“metodo iškvietimas).

Be to, prieš priskirdami visus mygtukus „setSLASHresetGUI“metodu, turime sukonfigūruoti tinklelio eilutes ir stulpelius, o po to, kai visi mygtukai yra priskirti „setSLASHresetGUI“metodu, turime supakuoti visą tinklelio turinį (žr. kodą, pateiktą instrukcijoje, kad pamatytumėte tinkamą formatavimą).

4 veiksmas: kad žaidimo ekrano mygtukai veiktų

Kad žaidimo ekrano mygtukai veiktų
Kad žaidimo ekrano mygtukai veiktų
Kad žaidimo ekrano mygtukai veiktų
Kad žaidimo ekrano mygtukai veiktų
Kad žaidimo ekrano mygtukai veiktų
Kad žaidimo ekrano mygtukai veiktų
Kad žaidimo ekrano mygtukai veiktų
Kad žaidimo ekrano mygtukai veiktų

AIŠKINIMAS:

Kad mygtukai spustelėję vykdytų tam tikras kodo eilutes, turėsime vykdyti metodus „proceso“metodu. Norėdami atlikti šią užduotį, turėsime sukurti kelis naujus metodus, kintamuosius ir sąrašus.

Pirma, sudarysime du sąrašus. Bus sąrašas, vadinamas „tinkleliu“. Šį „tinklelio“sąrašą sudarys tik sveikieji skaičiai 9 ir 0. Šiame sąraše devynios žymės bombas, o nuliai-ne bombas. Taip programa atskirs, ar plytelė yra bomba, ar ne. Bus sudarytas antrasis sąrašas ir jis bus vadinamas „būsena“. Šį „būsenos“sąrašą sudaro tik vienos simbolių eilutės („0“, „1“, „2“, „3“, „4“, „5“, „6“, „7“, „8“, „b“ ). Šiame sąraše kiekviena simbolių eilutė atitiks tam tikrą vaizdą. Taip programa žinos, kokį vaizdą rodyti ant kiekvieno mygtuko minų laivo tinklelyje. Kiekvienas mygtukų tinklelio mygtukas turės atitinkamą indeksą kiekviename sąraše, atsižvelgiant į jo vietą tinklelyje. Atitinkamas indeksas bus priskirtas tokia tvarka (mygtuko numeris - 1). Pavyzdžiui, kiekvieno sąrašo mygtukas yra nulinis indeksas. Galiausiai šie du sąrašai bus sudaryti prieš vykdant „MainGUI“klasę ir bus sukurti už „MainGUI“klasės ribų. Klasė „tinklelis“bus sukurta kaip tuščias sąrašas (tinklelis = ), o „būsenos“sąrašas bus sukurtas naudojant diapazono funkciją (į „būsenos“sąrašą įtraukiant keturiasdešimt vieno simbolio „n“eilučių).

Antra, mes padarysime įvairius metodus, galinčius aptikti jį supančių minų skaičių ir kuriuos galima panaudoti paspaudus mygtuką (sprendimą dėl to, kurį metodą reikia atlikti, lemia mygtuko vieta). Šie metodai bus vadinami mūsų minų analizatoriais. Šie metodai padidins skaitiklį, vadinamą „NumOfMines“, ir naudos tam tikrus „tinklelio“sąrašo indeksus, kad nustatytų, kiek bombų supa plytelę. Eilutė, kuri bus saugoma kintamajame „NumOfMines“, bus naudojama pakeisti tą patį atitinkamą indeksą sąraše „status“. Dabar jums gali kilti klausimas, kaip programa žinos, kurį indeksą naudoti. Kai mygtukas užregistruojamas „proceso“metodu, tada kintamasis „indeksas“bus sukurtas/priskirtas tam tikram sveikam skaičiui (atsižvelgiant į tai, kokią eilutę mygtukas registruoja). Vienas iš sukurtų metodų naudos tą priskirtą indeksą, kad žinotų plytelės vietą ir ją supančių plytelių indeksus (metodo algoritmas tai išsiaiškins). Be to, norėdami iš naujo priskirti kintamąjį „indeksas“, pirmiausia turėsime jį parodyti už klasės ribų. Taigi, prieš sukurdami „MainGUI“klasę, mes iš anksto nustatysime „index“kintamąjį kaip sveikąjį skaičių nulį.

Trečia, bus sukurti „operaciniai“metodai. „Operacijos“metodas bus vykdomas kiekvieną kartą, kai užregistruojamas mygtukas. Šie „operacijos“metodai bus vykdomi „proceso“metodu. Taikant „proceso“metodą, keli teiginiai, jei bus kitaip, nustatys, kuris mygtukas buvo spustelėtas (atsižvelgiant į to, kas yra mygtukas). Čia bus panaudotas tam tikras „operacijos“metodas (teiginiuose „jei kitaip“).

Ketvirta, mes iš tikrųjų išsiaiškinsime, kaip mygtukai pradeda veikti. Kaip minėta anksčiau, keli „jei“kiti teiginiai yra „proceso“metodu ir vykdo tam tikrus kitus metodus ir papildomo kodo eilutes, priklausomai nuo to, koks mygtukas yra lygus (mygtukas lygus paskutinei užregistruotai eilutei). Šiuose „jei-kitaip“teiginiuose bus nurodyta tokia tvarka: indeksas bus priskirtas visame pasaulyje, atitinkamas indeksas sąraše „būsena“bus priskiriamas eilutei „b“(jei atitinkamas sąrašo „tinklelis“indeksas lygus sveikasis skaičius devyni), bus vykdomas atitinkamas „operacijos“metodas (jei atitinkamas sąrašo „tinklelis“indeksas lygus sveikojo skaičiaus nuliui), tas atitinkamas indeksas sąraše „būsena“bus perrašytas į eilutę, lygią kintamajam „NumOfMines“(jei atitinkamas sąrašo „tinklelis“indeksas lygus sveikojo skaičiaus nuliui), o GUI bus atnaujinta paskambinus „setSLASHresetGUI“metodu.

5 veiksmas: „setDifplicy“metodas ir „restart“metodas

Vaizdas
Vaizdas
Vaizdas
Vaizdas

AIŠKINIMAS:

Tada reikės sukurti metodą „setDifplicy“, o žaidimo ekrano apačioje esantį paleidimo mygtuką pradėti naudoti (sukuriant „paleidimo“metodą, kad jis būtų įvykdytas, kai naudotojas spustelės jį)).

Pirma, „setDifplicy“metodą reikės įdiegti „proceso“metodo ir „restart“metodo sudėtingumo mygtukų „if-else“teiginiuose. Šiuo metodu vykdomos kodo eilutės ir metodai yra gana paprasti. Taikydami metodą „setDifplicy“, prie tinklelio sąrašo pridėsime tam tikrą skaičių nulių (ne bombų) ir devynių (bombų) (per dvi diapazono funkcijas kiekviename „if-else“teiginyje), tada sumaišysime „tinklelio“sąrašas (su atsitiktinės bibliotekos maišymo funkcija) „setDifplicy“metodu (įvykdžius „if-else“teiginius). Nulių ir devynių santykis bus nustatomas pagal tai, kokiai eilutei nustatytas kintamasis „sunkumas“(„lengva“: 34–6, „vidutinė“: 28–12, „kieta“: 16–24).

Antra, taikydami „paleidimo“metodą, kintamuosius „index“ir „NumOfMinesLEFT“nustatysime į nulį visame pasaulyje, ištuštinsime „status“ir „grid“sąrašus visame pasaulyje, iš naujo nustatysime „status“sąrašą naudodami diapazono funkciją (pridėdami keturiasdešimt vieno simbolio „n“eilučių į „statuso“sąrašą) ir pasinaudokite „setDifplicy“metodu.

6 žingsnis: žaidimo pabaigos scenarijai

Žaidimo pabaigos scenarijai
Žaidimo pabaigos scenarijai
Žaidimo pabaigos scenarijai
Žaidimo pabaigos scenarijai
Žaidimo pabaigos scenarijai
Žaidimo pabaigos scenarijai
Žaidimo pabaigos scenarijai
Žaidimo pabaigos scenarijai

AIŠKINIMAS:

Kiekviename minosvaidžio žaidime yra du žaidimo pabaigos scenarijai: laimėjimas ir pralaimėjimas. Šioje programoje mes įgyvendinsime šiuos du žaidimo pabaigos scenarijus dviem naujais metodais: „You_A_Winner_Son“metodu ir „GameOver“metodu. Prieš atnaujinant GUI naudojant „proceso“metodą ir remiantis rodikliais, pakeistais dviem žaidimo pabaigos scenarijais, ekrano mygtukas bus pakeistas, kad tinkamai atspindėtų rezultatą.

Pirma, kai naudotojas spustelėja paskutinę paslėptą plytelę be bombos, tada turi būti įvykdytas metodas „You_A_Winner_Son“. Mes atliksime šią užduotį, kiekvieną kartą paspaudę metodą „You_A_Winner_Son“, kai spustelėsite plytelę ir bus nustatyta, kad plytelė yra ne bombų plytelė (naudojant „operacijos“metodus, vykdomus „proceso“metodu). Jei laimėjimo sąlygos bus įvykdytos, bus įvykdyti du teiginio „jei-kitas“metodo „You_A_Winner_Son“metodai. Pirmasis „if-else“teiginys visada bus vykdomas, neatsižvelgiant į tai, ar žaidėjas laimėjo, ar ne, kai naudojamas šis metodas. Remiantis tuo, kam kintamasis „sunkumas“yra lygus, tam tikras algoritmas, kuris nustatys, kiek minų/bombų liko paslėptų. Sveikasis skaičius, kurį nustato šis algoritmas, bus išsaugotas kintamajame „NumOfMinesLEFT“. Toliau tarp dviejų teiginio „jei kitaip“bus vykdomas kitas algoritmas, kad būtų galima rasti likusių pradinių plytelių skaičių (nespaudžiamų plytelių). Sveikasis skaičius, kurį nustato šis algoritmas, bus išsaugotas kintamajame „NumOfStartingTilesLEFT“. Antrasis teiginys „jei kitaip“visada bus vykdomas, neatsižvelgiant į tai, ar žaidėjas laimėjo, ar ne, kai naudojamas šis metodas. Atsižvelgiant į tai, kam kintamasis „sunkumas“yra lygus, vienas iš trijų teiginių „jei kitaip“gali būti įvykdytas, jei įvykdomos jų sąlygos. Sąlygos bus pagrįstos tuo, kokie yra du kintamieji „NumOfMinesLEFT“ir „NumOfStartingTilesLEFT“. Šiuose trijuose „jei kitaip“teiginiuose bus įvykdytas algoritmas, dėl kurio kiekvienas mygtukas bus nenaudingas (žaidimas baigtas).

Antra, kai vartotojas spustelėja vieną iš paslėptų bombų plytelių, turi būti vykdomas „GameOver“metodas. Mes atliksime šią užduotį, kiekvieną kartą paspaudę „GameOver“metodą, kai spragtelėsite plytelę ir bus nustatyta, kad plytelė yra bombų plytelė (naudojant „operacijos“metodus, vykdomus „proceso“metodu). Pasinaudojus „GameOver“metodu, bus įvykdytas algoritmas, dėl kurio kiekviena pradinė plytelė bus nenaudinga (žaidimas baigtas), ir bus atskleistos paslėptos bombų plytelės (remiantis atitinkamais „tinklelio“sąrašo indeksais, tam tikrais indeksais) sąraše „būsena“bus priskirta vieno simbolio eilutei „b“).

Trečia, žaidimo ekrano ekranas bus atnaujinamas kiekvieną kartą, kai atnaujinama GUI, labai nedaug redaguojant „setSLASHresetGUI“metodą. Po to, kai bus sukonfigūruotas GUI tinklelis, įdėsime tris teiginius „jei-kitaip“, kur yra esamo ekrano mygtuko priskyrimas. Vienas iš trijų teiginių, jei bus kitaip, bus vykdomas remiantis šiais kintamaisiais: „GameOverDETECTOR“, „sunkumas“, „NumOfMinesLEFT“ir „NumOfStartingTilesLEFT“. Kaip jums gali kilti klausimas, kintamasis „GameOverDETECTOR“yra naujas kintamasis. Šis kintamasis bus sukurtas prieš pat vykdant „if-else“sakinius naudojant metodą „setSLASHresetGUI“. „GameOverDETECTOR“kintamasis bus lygus sveikasis skaičius, kuris randamas naudojant algoritmą, kuris nustato, kiek indeksų yra tinklelyje sąrašas buvo priskirtas sveikam skaičiui devyniasdešimt devyni (kaip mygtukai tampa nenaudingi). Remiantis tuo, kurios įvykdomos „if-else“sąlygos, bus įvykdytas atitinkamas ekrano perskirstymas.

7 veiksmas: paleidimo mygtuko veikimas

Paleidimo mygtuko veikimas
Paleidimo mygtuko veikimas

AIŠKINIMAS:

Šis žingsnis yra trumpiausias. Dauguma šio žingsnio darbų jau atlikta. Viskas, ką mums reikės padaryti, tai vykdyti „paleisti iš naujo“metodą kiekvieną kartą, kai vartotojas spustelėja paleidimo mygtuką.

Pirmiausia ir galiausiai „proceso“metodu atliksime „restart“metodą su teiginiu „if-else“. Jei eilutė "!" yra užregistruotas, tada vykdomas „paleidimo“metodas. Taip pat prieš nustatydami tinklelio turinį, „setSLASHresetGUI“metodo pabaigoje turėsime sukurti mygtuką, pavadintą „restart“. Šis paleidimo mygtukas apdoros eilutę „!“(komanda lambda: self.process ("!"))) ir vykdykite atitinkamą "restart" metodą pagal "process" metodą.

Rekomenduojamas: