Përmbajtje:

Minesweeper-Raspberry-Pi-Edition: 7 hapa (me fotografi)
Minesweeper-Raspberry-Pi-Edition: 7 hapa (me fotografi)

Video: Minesweeper-Raspberry-Pi-Edition: 7 hapa (me fotografi)

Video: Minesweeper-Raspberry-Pi-Edition: 7 hapa (me fotografi)
Video: Вещи, которые мистеру Уэлчу больше не разрешается делать в сборнике для чтения RPG № 1-2450 2024, Korrik
Anonim
Minesweeper-Raspberry-Pi-Edition
Minesweeper-Raspberry-Pi-Edition
Minesweeper-Raspberry-Pi-Edition
Minesweeper-Raspberry-Pi-Edition

Projekti im përfundimtar për serinë CSC 130 në Universitetin Teknik të Luizianës është Edicioni Minesweeper Raspberry Pi Edition. Në këtë projekt, unë kërkova të rikrijoj lojën klasike të minave pastruese duke përdorur bibliotekën Tkinter të gjuhës programuese Python. Rrjeti që përfshin loja e minatorëve është tetë pllaka në gjerësi dhe pesë pllaka në lartësi. Formatimi i projektit është përshtatur dhe përsosur për përdorimin e një Raspberry Pi të instaluar me Python 2.7.

Kodi dhe imazhet për projektin përfundimtar të Minesweeper Raspberry Pi Edition mund të shkarkohen në lidhjen e mëposhtme:

Minesweeper-Raspberry-Pi-Edition

Furnizimet

x1 Mjedër Pi

Python 2.7 i instaluar në Raspberry Pi

Microsoft Powerpoint (ose një softuer tjetër për të krijuar imazhe për butonat)

Hapi 1: Krijoni Imazhe të Butonit

Krijoni imazhe me butona
Krijoni imazhe me butona

SHPJEGIM:

Çdo buton që përbën GUI do të duhet të krijohet. Për këtë detyrë, unë përdorja Microsoft Powerpoint për të bërë imazhet që më duheshin për të shfaqur në butona.

Së pari, krijova dhjetë butonat e pllakave të nevojshme për të bërë rrjetin e minave pastruese (bosh, bob, zero, një, dy, tre, katër, pesë, gjashtë, shtatë dhe tetë) duke përdorur Microsoft Powerpoint.

Së dyti, kam bërë katër imazhet e nevojshme për ekranin e menysë (shfaqja e menysë, butoni i lehtë i vështirësisë, butoni i vështirësisë së mesme dhe butoni i vështirësisë së fortë) duke përdorur Microsoft Powerpoint.

Së treti, unë krijova imazhin e nevojshëm për butonin e rinisjes dhe imazhet e nevojshme për butonat e tjerë të ndryshëm të ekranit (një ekran "lojë mbi", një ekran "ju fitoni" dhe një ekran "rregulla") duke përdorur Microsoft Powerpoint.

Së katërti, do t'ju duhet të ndryshoni madhësinë e imazheve tuaja që të përshtaten brenda ekranit tuaj. Për Rasberry Pi tim, kam përdorur dimensionet e mëposhtme për dritaren (duke iu referuar pikselave në gjatësi dhe gjerësi): 432x576.

Hapi 2: Formatimi i programit

Programi i formatit
Programi i formatit

SHPJEGIM:

Para se të bëhet ndonjë programim aktual, ne duhet të importojmë bibliotekat që na duhen dhe të shkruajmë pjesën kryesore të programit tonë.

Së pari, do të na duhet të importojmë * nga biblioteka Tkinter dhe të përziejmë nga biblioteka e rastësishme. Së dyti, do të na duhet të plotësojmë hapat e mëposhtëm në kod brenda pjesës kryesore të programit: krijoni dritaren, vendosni dritaren e titullit, krijoni GUI dhe shfaqni GUI dhe prisni ndërveprimin e përdoruesit. Ky kod është shkruar në formatimin e duhur në lidhje me bibliotekën Tkinter (shikoni kodin e dhënë në udhëzues për të parë formatimin e duhur).

Hapi 3: Krijoni GUI (Meny & Minesweeper Grid)

Krijoni GUI (Meny & Minesweeper Grid)
Krijoni GUI (Meny & Minesweeper Grid)
Krijoni GUI (Meny & Minesweeper Grid)
Krijoni GUI (Meny & Minesweeper Grid)
Krijoni GUI (Meny & Minesweeper Grid)
Krijoni GUI (Meny & Minesweeper Grid)
Krijoni GUI (Meny & Minesweeper Grid)
Krijoni GUI (Meny & Minesweeper Grid)

SHPJEGIM:

Me fillimin e programit, ekrani i menusë do të hapet. Pasi të zgjidhet vështirësia (duke klikuar njërin nga butonat e vështirësisë në ekranin e menysë), GUI do të rifreskohet me rrjetin e minave, një ekran dhe një buton të rinisjes. Meqenëse sapo keni filluar të punoni në GUI, do të na duhet vetëm të fillojmë menunë, butonat e vështirësive të menusë të bëhen funksionale dhe të bëjmë që GUI të rifreskohet në ekranin e lojës me rrjetin e minave pastruese.

Së pari, ne mund të kemi ekranin e menysë vetë gjatë fillimit të programit duke thirrur metodën "setupMenu" brenda konstruktorit të klasës MainGUI.

Së dyti, secili nga butonat e vështirësisë së menusë mund të ekzekutojë linja të caktuara të kodit sa herë që klikohet duke shtuar një metodë "procesi" (gjithashtu do të duhet të shtojë komandën lambda: self.process ("returnButtonName") brenda parametrave të funksionit të butonit të përdorur në krijimin e çdo butoni të vështirësisë). Tre deklarata nëse-tjetër do të krijohen në metodën "proces" dhe do të ekzekutojnë metoda dhe linja të tjera të kodit shtesë në varësi të asaj që barazon butoni (butoni është i barabartë me cilindo emër të butonit që është regjistruar për herë të fundit).

Së treti, ndërsa ekrani i menusë është i ngritur dhe nëse përdoruesi klikon në njërën nga butonat e vështirësisë, atëherë programi do të kursejë një vlerë të caktuar në ndryshoren "vështirësi" (vështirësia është e barabartë me "të lehtë", "të mesëm" ose "të fortë" nga cili buton i vështirësisë klikohet). Ky klik i një butoni e di se cilën deklaratë nëse-tjetër duhet të ndiqet bazuar në emrin e butonit të regjistruar për herë të fundit (çfarë butoni është i barabartë). Për më tepër, për të caktuar sërish variablin "vështirësi" do të na duhet së pari të instantiojmë atë jashtë klasës. Pra ne do ta vendosim variablin "vështirësi" si një varg bosh para se të krijohet klasa "MainGUI".

Së katërti, pastroni GUI -in e butonave të bërë me metodën "setupMenu" duke bërë një metodë "clearMenu" (duke përdorur funksionin button.destroy () në raste të shumta) dhe duke thirrur metodën "clearMenu" në metodën "proces" (nën secili nga butonat e vështirësisë regjistrohet pas caktimit të ndryshores së vështirësisë).

Së pesti, rifreskoni GUI duke bërë një metodë "setSLASHresetGUI" (butonat bëhen në të njëjtën mënyrë si në metodën "setupMenu") dhe duke thirrur metodën "setSLASHresetGUI" në metodën "proces" (nën secilën nga butonat e vështirësisë regjistrohen pas vështirësi në caktimin e ndryshores dhe thirrjen e metodës "clearMenu").

Për më tepër, para se të caktohen të gjithë butonat brenda metodës "setSLASHresetGUI" ne duhet të konfigurojmë rreshtat dhe kolonat brenda rrjetit dhe pasi të jenë caktuar të gjithë butonat brenda metodës "setSLASHresetGUI" ne duhet të paketojmë të gjithë përmbajtjen brenda rrjetit (shikoni kodi i dhënë në udhëzuesin për të parë formatimin e duhur).

Hapi 4: Bëni funksionale butonat në ekranin e lojës

Bëni funksionale butonat në ekranin në lojë
Bëni funksionale butonat në ekranin në lojë
Bëni funksionale butonat në ekranin në lojë
Bëni funksionale butonat në ekranin në lojë
Bëni funksionale butonat në ekranin në lojë
Bëni funksionale butonat në ekranin në lojë
Bëni funksionale butonat në ekranin në lojë
Bëni funksionale butonat në ekranin në lojë

SHPJEGIM:

Për t'i bërë butonat të ekzekutojnë rreshta të caktuar të kodit kur klikohen, do të na duhet të ekzekutojmë metoda brenda metodës "proces". Për këtë detyrë, do të na duhet të bëjmë metoda, variabla dhe lista të reja.

Së pari, ne do të bëjmë dy lista. Do të ketë një listë të quajtur "rrjet". Kjo listë "rrjeti" do të përbëhet vetëm nga numrat e plotë 9 dhe 0. Në këtë listë, nëntë do të përfaqësojnë bomba, dhe zero do të përfaqësojnë jo-bomba. Kështu do të dallojë programi nëse një pllakë është një bombë apo jo. Do të bëhet një listë e dytë dhe do të quhet "status". Kjo listë "statusi" përbëhet nga vetëm një varg karakteresh ("0", "1", "2", "3", "4", "5", "6", "7", "8", "b "). Në këtë listë, secili varg karakteresh do të korrespondojë me një imazh të caktuar. Kështu programi do të dijë se çfarë imazhi të shfaqet në secilën buton në rrjetin e minave pastruese. Çdo buton në rrjetin e minave pastruese do të ketë një indeks përkatës në secilën listë bazuar në vendosjen e tij në rrjet. Indeksi përkatës do të caktohet sipas procedurës së mëposhtme (numri i butonit - 1). Për shembull, indeksi përkatës i njërit në secilën listë është indeksi zero. Së fundmi, këto dy lista do të ekzekutohen para se të ekzekutohet klasa "MainGUI" dhe do të krijohen jashtë klasës "MainGUI". Klasa "grid" do të krijohet si një listë e zbrazët (grid = ) dhe lista "status" do të krijohet nga një funksion varg (duke shtuar dyzet vargje të karakterit të vetëm të "n" në listën "status").

Së dyti, ne do të bëjmë metoda të ndryshme që mund të zbulojnë numrin e minierave që e rrethojnë dhe që mund të thirren kur të klikohet një buton (vendimi se cila metodë që duhet ekzekutuar do të përcaktohet nga vendosja e butonit). Këto metoda do të quhen analizuesit tanë të minierave. Këto metoda do të rrisin një numërues të quajtur "NumOfMines" dhe do të përdorin indekse të caktuara brenda listës "grid" për të përcaktuar se sa bomba rrethojnë pllakën. Vargu që do të ruhet brenda ndryshores "NumOfMines" do të përdoret për të zëvendësuar të njëjtin indeks përkatës në listën "status". Tani, mund të pyesni veten se si programi do të dijë se cilin indeks të përdorë. Kur një buton regjistrohet në metodën "proces", atëherë një "indeks" i ndryshueshëm do të krijohet/caktohet në një numër të plotë të caktuar (bazuar në atë varg që regjistron butoni). Një nga metodat e krijuara do të përdorë indeksin e caktuar për të ditur vendosjen e pllakës dhe indekset e pllakave që e rrethojnë atë (algoritmi brenda metodës do ta kuptojë këtë). Për më tepër, për të caktuar sërish variablin "indeks" ne do të duhet që së pari ta instinktojmë atë jashtë klasës. Pra, ne do të paravendosim ndryshoren "index" si zero të plotë para se të krijohet klasa "MainGUI".

Së treti, do të krijohen metoda "operacioni". Një metodë "operacion" do të ekzekutohet sa herë që regjistrohet një buton. Këto metoda "operacion" do të ekzekutohen në metodën "proces". Në metodën "proces", deklarata të shumta nëse-tjetër do të përcaktojnë se cili buton është klikuar (bazuar në atë që barazon butoni). Këtu do të thirret një metodë e caktuar "operacioni" (në deklaratat nëse-tjetër).

Së katërti, ne do të hyjmë në faktin se si butonat bëhen funksionalë. Siç u tha më parë, deklarata të shumta nëse tjetër ndodhen në metodën "proces" dhe ekzekutojnë metoda dhe linja të tjera të kodit shtesë në varësi të asaj që barazon butoni (butoni është i barabartë me çfarëdo vargu që ishte regjistruar për herë të fundit). Brenda këtyre deklaratave nëse-ndryshe, në vijim do të ndodhë: indeksi do të caktohet në nivel global, ai indeks përkatës në listën e "statusit" do të caktohet në vargun "b" (nëse indeksi përkatës i listës "rrjet" është i barabartë numri i plotë nëntë), do të ekzekutohet një metodë përkatëse e "operacionit" (nëse indeksi përkatës i listës "rrjet" është i barabartë me zero të plotë), ai indeks përkatës në listën "status" do të caktohet në një varg që është i barabartë me ndryshoren "NumOfMines" (nëse indeksi përkatës i listës "grid" është i barabartë me zero të plotë), dhe GUI do të rifreskohet duke thirrur metodën "setSLASHresetGUI".

Hapi 5: Metoda "setDifficarity" & Metoda "restart"

Imazhi
Imazhi
Imazhi
Imazhi

SHPJEGIM:

Tjetra, do të duhet të krijohet një metodë "setDifficulty" dhe butoni i rinisjes i vendosur në fund të ekranit të lojës do të duhet të bëhet funksional (duke krijuar një metodë "restart" që ajo të ekzekutohet kur klikohet nga përdoruesi)

Së pari, metoda "setDifficulty" do të duhet të zbatohet në pohimet nëse-tjetër të butonave të vështirësisë në metodën "proces" dhe në metodën "rinis". Linjat e kodit dhe metodat e ekzekutuara në këtë metodë janë mjaft të thjeshta. Në metodën "setDifficility", ne do t'i shtojmë një sasi zero (jo-bomba) dhe nëntë (bomba) listës "grid" (përmes dy funksioneve të rangut brenda secilës deklaratë if-else), dhe më pas do ta përziejmë lista "grid" (me funksionin e përzierjes së bibliotekës së rastit) brenda metodës "setDifficulty" (pasi të jenë ekzekutuar deklaratat if-else). Raporti i zerove me nëntë do të përcaktohet nga vargu në të cilin variabla "vështirësi" është vendosur ("e lehtë": 34-6, "e mesme": 28-12, "e fortë": 16-24).

Së dyti, në metodën "restart", ne do t'i vendosim variablat "index" dhe "NumOfMinesLEFT" në zero në nivel global, do të zbrazim listat "status" dhe "grid" në nivel global, do të rivendosim listën "status" me një funksion varg (duke shtuar dyzet vargje të karakterit të vetëm të "n" në listën "status"), dhe thërrasin në metodën "setDifficulty".

Hapi 6: Skenarët e Përfundimit të Lojërave

Skenarët e Përfundimit të Lojërave
Skenarët e Përfundimit të Lojërave
Skenarët e Përfundimit të Lojërave
Skenarët e Përfundimit të Lojërave
Skenarët e Përfundimit të Lojërave
Skenarët e Përfundimit të Lojërave
Skenarët e Përfundimit të Lojërave
Skenarët e Përfundimit të Lojërave

SHPJEGIM:

Çdo lojë minieweeper ka dy skenarë të përfundimit të lojës: fitore dhe humbje. Brenda këtij programi, ne do të zbatojmë këto dy skenarë të përfundimit të lojës me dy metoda të reja: një metodë "You_A_Winner_Son" dhe një metodë "GameOver". Para se GUI të rifreskohet brenda metodës "proces" dhe bazuar në indekset e ndryshuara nga dy metodat e skenarit të përfundimit të lojës, butoni i ekranit do të ndryshojë për të përfaqësuar siç duhet rezultatin.

Së pari, kur përdoruesi klikon në pllakën e fundit të fshehur jo-bombë, atëherë metoda "You_A_Winner_Son" duhet të ekzekutohet. Ne do ta përfundojmë këtë detyrë duke thirrur në metodën "You_A_Winner_Son" sa herë që një pllakë klikohet dhe pllaka zbulohet të jetë një pllakë jo-bombë (brenda metodave "operacion" të ekzekutuara në metodën "proces"). Nëse plotësohen kushtet fituese, atëherë dy deklarata nëse-tjetër brenda metodës "You_A_Winner_Son" do të ekzekutohen. Deklarata e parë nëse-tjetër do të ekzekutohet gjithmonë pavarësisht nëse lojtari fitoi apo jo kur kjo metodë është thirrur. Bazuar në atë që është e barabartë me ndryshoren "vështirësi", një algoritëm i caktuar që do të përcaktojë se sa mina/bomba kanë mbetur të fshehura. Numri i plotë që gjendet nga ky algoritëm do të ruhet në ndryshoren "NumOfMinesLEFT". Tjetra, në mes të dy deklaratës nëse-tjetër do të ekzekutohet një algoritëm tjetër për të gjetur numrin e pllakave fillestare të mbetura (pllaka të paklikuara). Numri i plotë që gjendet nga ky algoritëm do të ruhet në ndryshoren "NumOfStartingTilesLEFT". Deklarata e dytë nëse-tjetër do të ekzekutohet gjithmonë pavarësisht nëse lojtari fitoi apo jo kur kjo metodë është thirrur. Bazuar në atë që është e barabartë me ndryshoren "vështirësi", një nga tre deklaratat if-else mund të ekzekutohet nëse plotësohen kushtet e tyre. Kushtet do të bazohen në atë që janë të barabarta me dy variablat "NumOfMinesLEFT" dhe "NumOfStartingTilesLEFT". Brenda këtyre tre deklaratave nëse-tjetër, do të ekzekutohet një algoritëm që do ta bëjë çdo buton të padobishëm (loja ka mbaruar).

Së dyti, kur përdoruesi klikon në njërën prej pllakave të fshehura të bombës, atëherë metoda "GameOver" duhet të ekzekutohet. Ne do ta përfundojmë këtë detyrë duke thirrur në metodën "GameOver" sa herë që një pllakë klikohet dhe pllaka zbulohet të jetë një pllakë bombë (brenda metodave "operacion" të ekzekutuara në metodën "proces"). Kur të thirret metoda "GameOver", do të ekzekutohet një algoritëm që do ta bëjë çdo pllakë fillestare të padobishme (loja ka mbaruar) dhe pllakat e fshehura të bombës do të zbulohen (bazuar në indekset përkatës brenda listës së rrjetit, indekse të caktuara) në listën "statusi" do të caktohet në vargun me një karakter "b").

Së treti, shfaqja e ekranit të lojës do të azhurnohet sa herë që GUI rifreskohet duke bërë shumë pak modifikime të vogla në metodën "setSLASHresetGUI". Pasi të konfigurohet rrjeti i GUI, ne do të vendosim tre deklarata nëse-tjetër ku vendoset caktimi aktual i butonit të ekranit. Një nga tre deklaratat if-else do të ekzekutohet bazuar në atë që janë të barabarta me variablat e mëposhtëm: "GameOverDETECTOR", "vështirësi", "NumOfMinesLEFT" dhe "NumOfStartingTilesLEFT". Siç mund të pyesni veten, ndryshorja "GameOverDETECTOR" është një e re variabël. Kjo ndryshore do të krijohet menjëherë para se deklaratat if-else të ekzekutohen brenda metodës "setSLASHresetGUI". Ndryshorja "GameOverDETECTOR" do të jetë e barabartë me numrin e plotë që gjendet duke përdorur një algoritëm që gjen sa indekse brenda "rrjetit" lista është caktuar për numrin e plotë nëntëdhjetë e nëntë (si butonat bëhen të padobishëm). Bazuar në të cilat kushtet e deklaratës nëse-tjetër plotësohen, do të ndodhë një ri-caktim përkatës në ekran.

Hapi 7: Vënia në funksion e butonit të Rinisjes

Funksionimi i butonit të Rinisjes
Funksionimi i butonit të Rinisjes

SHPJEGIM:

Ky hap ndodh të jetë më i shkurtër. Pjesa më e madhe e punës për këtë hap është bërë tashmë. E tëra çfarë do të na duhet të bëjmë tani është të ekzekutojmë metodën "restart" sa herë që butoni i rinisjes klikohet nga përdoruesi.

Së pari dhe së fundmi, ne do të ekzekutojmë metodën "rinis" në metodën "proces" me një deklaratë nëse-tjetër. Nëse vargu "!" është regjistruar, atëherë metoda "restart" do të ekzekutohet. Ne gjithashtu do të duhet të krijojmë një buton të quajtur restart në fund të metodës "setSLASHresetGUI" para se përmbajtja e rrjetit të paketohet së bashku. Ky buton i rifillimit do të përpunojë vargun "!" (komandoni lambda: self.process ("!")) dhe ekzekutoni metodën përkatëse të "rinisjes" brenda metodës "proces".

Recommended: