Mündəricat:

Minesweeper-Raspberry-Pi-Edition: 7 addım (şəkillərlə)
Minesweeper-Raspberry-Pi-Edition: 7 addım (şəkillərlə)

Video: Minesweeper-Raspberry-Pi-Edition: 7 addım (şəkillərlə)

Video: Minesweeper-Raspberry-Pi-Edition: 7 addım (şəkillərlə)
Video: Разработка графического интерфейса Python с использованием PyQt5 2024, Noyabr
Anonim
Mayın Tarama-Moruq-Pi-Edition
Mayın Tarama-Moruq-Pi-Edition
Mayın Tarama-Moruq-Pi-Edition
Mayın Tarama-Moruq-Pi-Edition

Louisiana Texnologiya Universitetində CSC 130 seriyası üçün son layihəm Minesweeper Raspberry Pi Edition'dır. Bu layihədə Python proqramlaşdırma dilinin Tkinter kitabxanasından istifadə edərək klassik mayın gəmisi oyununu yenidən yaratmağa çalışdım. Mayın tarama gəmisinin oyunun əhatə etdiyi şəbəkə eni səkkiz və hündürlüyü beş plitədən ibarətdir. Layihənin formatlanması Python 2.7 ilə quraşdırılmış bir Raspberry Pi -nin istifadəsi üçün uyğunlaşdırılmış və təkmilləşdirilmişdir.

Minesweeper Raspberry Pi Edition son layihəsinin kodu və şəkilləri aşağıdakı linkdən yüklənə bilər:

Mayın Tarama-Moruq-Pi-Edition

Təchizat

x1 Raspberry Pi

Python 2.7 Raspberry Pi üzərində quraşdırılmışdır

Microsoft Powerpoint (və ya düymələr üçün şəkillər yaratmaq üçün başqa bir proqram)

Addım 1: Düymə Şəkilləri yaradın

Düymə Şəkilləri yaradın
Düymə Şəkilləri yaradın

İZAHI:

GUI təşkil edən hər bir düyməni yaratmaq lazımdır. Bu tapşırıq üçün düymələrdə göstərmək üçün lazım olan şəkilləri etmək üçün Microsoft Powerpoint -dən istifadə etdim.

Əvvəlcə, Microsoft Powerpoint -dən istifadə edərək mayın tarama gəmisi (boş, bob, sıfır, bir, iki, üç, dörd, beş, altı, yeddi və səkkiz) etmək üçün lazım olan on kafel düyməsini yaratdım.

İkincisi, Microsoft Powerpoint -dən istifadə edərək menyu ekranı üçün lazım olan dörd görüntünü (menyu ekranı, asan çətinlik düyməsi, orta çətinlik düyməsi və çətin çətinlik düyməsi) hazırladım.

Üçüncüsü, Microsoft Powerpoint -dən istifadə edərək yenidən başlatma düyməsi üçün lazım olan görüntüyü və digər fərqli ekran düymələri üçün lazım olan şəkilləri ("oyun bitdi" ekranı, "qazandınız" görüntüsü və "qaydalar" ekranı) yaratdım.

Dördüncüsü, şəkillərinizin ölçüsünü ekranınıza uyğun olaraq ölçüsünü dəyişdirməlisiniz. Rasberry Pi üçün, pəncərə üçün aşağıdakı ölçüləri istifadə etdim (uzunluq və eni piksellərə istinadən): 432x576.

Addım 2: Proqramı formatlaşdırın

Format Proqramı
Format Proqramı

İZAHI:

Hər hansı bir real proqramlaşdırma baş verməzdən əvvəl ehtiyacımız olan kitabxanaları idxal etməli və proqramımızın əsas hissəsini yazmalıyıq.

Birincisi, Tkinter kitabxanasından * və təsadüfi kitabxanadan qarışdırmaq lazımdır. İkincisi, proqramın əsas hissəsindəki kodda aşağıdakı addımları tamamlamalıyıq: pəncərəni yaradın, başlıq pəncərəsini təyin edin, GUI yaradın və GUI -ni göstərin və istifadəçi qarşılıqlı əlaqəsini gözləyin. Bu kod Tkinter kitabxanası ilə əlaqədar olaraq düzgün formatda yazılmışdır (düzgün formatlamanı görmək üçün təlimatda verilən koda baxın).

Addım 3: GUI (Menyu və Mayın Tarama Şəbəkəsi) yaradın

GUI (Menyu və Mayın Tarama Şəbəkəsi) yaradın
GUI (Menyu və Mayın Tarama Şəbəkəsi) yaradın
GUI (Menyu və Mayın Tarama Şəbəkəsi) yaradın
GUI (Menyu və Mayın Tarama Şəbəkəsi) yaradın
GUI (Menyu və Mayın Tarama Şəbəkəsi) yaradın
GUI (Menyu və Mayın Tarama Şəbəkəsi) yaradın
GUI (Menyu və Mayın Tarama Şəbəkəsi) yaradın
GUI (Menyu və Mayın Tarama Şəbəkəsi) yaradın

İZAHI:

Proqram başladıqdan sonra menyu ekranı açılacaq. Çətinlik seçildikdən sonra (menyu ekranındakı çətinlik düymələrindən birini tıklayaraq), GUI mayın tarama gəmisi şəbəkəsi, göstərici və yenidən başlatma düyməsi ilə yenilənəcəkdir. GUI üzərində işləməyə yeni başladığınız üçün, yalnız menyunu işə salmalıyıq, menyu çətinlik düymələrini işə salmalıyıq və mayın tarama gəmisi ilə GUI -ni oyun ekranında yeniləməliyik.

Birincisi, MainGUI sinifinin konstruktorundakı "setupMenu" metodunu çağıraraq proqramın başlanğıcında menyu ekranının özünü göstərə bilərik.

İkincisi, istifadə olunan düymə funksiyasının parametrləri daxilində "proses" metodu əlavə etməklə (həmçinin lambda: self.process ("returnButtonName") əmrini əlavə etməklə hər dəfə tıklandıqda menyunun çətinlik düymələrinin hər birini müəyyən kod sətirlərində icra edə bilərik. hər çətinlik düyməsinin yaradılmasında). Üç "if-else" ifadəsi "proses" metodunda yaradılacaq və düymənin nəyə bərabər olduğuna bağlı olaraq müəyyən digər metod və xətləri yerinə yetirəcək (düymə sonuncu dəfə qeydiyyatdan keçmiş düymə adına bərabərdir).

Üçüncüsü, menyu ekranı yuxarıda və istifadəçi çətinlik düymələrindən birini tıklayırsa, proqram müəyyən bir dəyəri "çətinlik" dəyişəninə saxlayacaq (çətinlik "asan", "orta" və ya "sərt" əsaslılara bərabərdir) Hansı çətinlik düyməsinin tıklandığını). Bu düyməyə basmaq, hansı düymənin adının son qeydiyyatdan keçdiyinə (hansı düyməyə bərabərdir) əsaslanaraq hansı if-else ifadəsinin yerinə yetiriləcəyini bilir. "MainGUI" sinfi yaradılmadan əvvəl "çətinlik" dəyişənini boş bir simli olaraq təyin edəcəyik.

Dördüncüsü, "setupMenu" üsulu ilə edilən düymələrdən GUI -ni təmizləyin, bir "clearMenu" metodu (birdən çox halda button.destroy () funksiyasından istifadə edərək) və "proses" metodunda "clearMenu" metodunu çağırın (altında) çətinlik düymələrinin hər biri çətinlik dəyişəninin təyin edilməsindən sonra qeyd olunur).

Beşincisi, "setSLASHresetGUI" metodu (düymələr "setupMenu" metodunda olduğu kimi hazırlanır) və "proses" metodunda "setSLASHresetGUI" metodunu çağırmaqla (çətinlik düymələrinin hər birinin altında qeyd edildikdən sonra GUI -ni yeniləyin. çətinliyin dəyişən təyin edilməsi və "clearMenu" metodunun çağırılması).

Əlavə olaraq, bütün düymələr "setSLASHresetGUI" metodunda təyin edilməzdən əvvəl, şəbəkədəki sətirləri və sütunları konfiqurasiya etməliyik və bütün düymələr "setSLASHresetGUI" metodunda təyin edildikdən sonra bütün məzmunu ızgara içərisinə yığmalıyıq. düzgün formatlamanı görmək üçün təlimatda verilən kod).

Addım 4: Oyun İçindəki Ekrandakı Düymələri Əməliyyat Edin

Oyun İçindəki Ekrandakı Düymələri Əməliyyat Edin
Oyun İçindəki Ekrandakı Düymələri Əməliyyat Edin
Oyun İçindəki Ekrandakı Düymələri Əməliyyat Edin
Oyun İçindəki Ekrandakı Düymələri Əməliyyat Edin
Oyun İçindəki Ekrandakı Düymələri Əməliyyat Edin
Oyun İçindəki Ekrandakı Düymələri Əməliyyat Edin
Oyun İçindəki Ekrandakı Düymələri Əməliyyat Edin
Oyun İçindəki Ekrandakı Düymələri Əməliyyat Edin

İZAHI:

Düymələrin tıklandığında müəyyən kod sətirlərini icra etməsi üçün "proses" metodu daxilində üsulları icra etməli olacağıq. Bu vəzifə üçün bir çox yeni metod, dəyişən və siyahı hazırlamalı olacağıq.

Əvvəlcə iki siyahı hazırlayacağıq. "Şəbəkə" adlı bir siyahı olacaq. Bu "ızgara" siyahısı yalnız 9 və 0 tam ədədlərindən ibarət olacaq. Bu siyahıda doqquz bomba, sıfırlar isə bombasızları təmsil edəcək. Bir kafelin bomba olub olmadığını proqram bu şəkildə ayıracaq. İkinci bir siyahı hazırlanacaq və ona "status" adı veriləcək. Bu "status" siyahısı yalnız bir simli sətirdən ibarətdir ("0", "1", "2", "3", "4", "5", "6", "7", "8", "b" "). Bu siyahıda hər bir simli sim müəyyən bir görüntüyə uyğun gəlir. Proqram, mayın tarama gəmisindəki hər düymədə hansı görüntünün göstəriləcəyini belə biləcək. Mayın tarama gəmisindəki hər bir düymənin, ızgarada yerləşdirilməsinə əsaslanaraq hər siyahıda müvafiq indeksi olacaq. Müvafiq indeks aşağıdakı prosedurla təyin ediləcək (düymə nömrəsi - 1). Məsələn, düymənin hər bir siyahıdakı indeksi sıfırdır. Nəhayət, bu iki siyahı "MainGUI" sinfi icra edilməzdən əvvəl icra ediləcək və "MainGUI" sinifinin xaricində yaradılacaq. "Şəbəkə" sinfi boş bir siyahı (grid = ) və "status" siyahısı bir sıra funksiyası ilə yaradılacaq ("status" siyahısına "n" qırx tək simli simli əlavə olunur).

İkincisi, ətrafdakı minaların sayını aşkar edə biləcək və bir düymə tıklandığında çağırıla biləcək müxtəlif üsullar edəcəyik (hansı metodun icra olunacağına düymənin yerləşdirilməsi ilə qərar veriləcək). Bu üsullara mina analizatorlarımız deyiləcək. Bu üsullar "NumOfMines" adlı bir sayğacı artıracaq və kafelin ətrafında neçə bomba olduğunu müəyyən etmək üçün "grid" siyahısında müəyyən indekslərdən istifadə edəcək. "NumOfMines" dəyişənində saxlanılacaq sətir, "status" siyahısındakı eyni uyğun indeksi əvəz etmək üçün istifadə ediləcək. İndi proqramın hansı indeksdən istifadə edəcəyini necə biləcəyi ilə maraqlana bilərsiniz. Bir düymə "proses" metodunda qeydiyyata alındıqda, dəyişən bir "indeks" yaradılacaq/müəyyən bir tam ədədə yenidən təyin ediləcək (düymənin hansı simli qeyd etdiyinə əsasən). Yaradılan metodlardan biri, kafelin yerləşdirilməsini və onu əhatə edən plitələrin indekslərini bilmək üçün təyin olunmuş indeksdən istifadə edəcək (metoddakı alqoritm bunu anlayacaq). Əlavə olaraq, "index" dəyişənini yenidən təyin etmək üçün əvvəlcə onu sinifdən kənarda düzəltməliyik. Beləliklə, "MainGUI" sinfi yaradılmadan əvvəl "index" dəyişənini sıfır tamsayı olaraq təyin edəcəyik.

Üçüncüsü, "əməliyyat" üsulları yaradılacaq. Hər dəfə bir düymə qeydə alındıqda "əməliyyat" üsulu icra olunacaq. Bu "əməliyyat" üsulları "proses" metodunda icra ediləcək. "Proses" metodunda, birdən çox if-else ifadəsi hansı düymənin tıklandığını təyin edəcək (düymənin nəyə bərabər olduğuna əsaslanaraq). Bu, müəyyən bir "əməliyyat" metodunun çağırılacağı yerdir (if-else ifadələrində).

Dördüncüsü, düymələrin necə işlədiyini öyrənəcəyik. Daha əvvəl də qeyd edildiyi kimi, birdən çox if-else ifadəsi "proses" metodunda yerləşir və düymənin nəyə bərabər olduğuna bağlı olaraq müəyyən digər metod və xətləri yerinə yetirir (düymə son qeydə alınmış simlə bərabərdir). Bu if-else ifadələrində aşağıdakılar sırayla baş verəcək: indeks qlobal olaraq təyin ediləcək, "status" siyahısındakı müvafiq indeks "b" sətrinə yenidən təyin ediləcək ("grid" siyahısının müvafiq indeksi bərabərdirsə) tam ədəd), müvafiq "əməliyyat" metodu icra ediləcək ("grid" siyahısının müvafiq indeksi sıfır tam ədədinə bərabərdirsə), "status" siyahısındakı müvafiq indeks dəyişənə bərabər olan bir sətrə təyin ediləcək. "NumOfMines" ("grid" siyahısının müvafiq indeksi sıfır tam ədədinə bərabərdirsə) və GUI "setSLASHresetGUI" metodunu çağıraraq yenilənəcəkdir.

Addım 5: "setDifficulty" Metodu və "Restart" Metodu

Şəkil
Şəkil
Şəkil
Şəkil

İZAHI:

Bundan sonra, "setDifficulty" metodu yaradılmalı və oyun içi ekranın altındakı yenidən başlatma düyməsi işə düşməlidir (istifadəçi tərəfindən tıklandığında icra etmək üçün "yenidən başlat" metodu yaradaraq).).

Birincisi, "proses" metodundakı çətinlik düymələrinin if-else ifadələrində və "yenidən başlat" metodunda "setDifficulty" metodunun tətbiq edilməsi lazımdır. Bu metodda icra olunan kod xətləri və metodlar olduqca sadədir. "SetDifficulty" metodunda, "grid" siyahısına müəyyən miqdarda sıfır (bombasız) və doqquz (bomba) əlavə edəcəyik (hər if-else ifadəsindəki iki sıra funksiyası vasitəsilə) və sonra "grid" siyahısı (təsadüfi kitabxananın qarışdırma funksiyası ilə) "setDifficulty" metodu daxilində (if-else ifadələri icra edildikdən sonra). Sıfırların doqquzlara nisbəti "çətinlik" dəyişəninin hansı simli təyin olunduğuna görə təyin olunacaq ("asan": 34-6, "orta": 28-12, "sərt": 16-24).

İkincisi, "yenidən başlat" metodunda "index" və "NumOfMinesLEFT" dəyişənlərini qlobal olaraq sıfıra qoyacağıq, həm "status", həm də "grid" siyahılarını qlobal olaraq boşaldırıq, "status" siyahısını bir sıra funksiyası ilə sıfırlayacağıq (əlavə edərək) "status" siyahısına "n" nin qırx tək simli) və "setDifficulty" metoduna müraciət edin.

Addım 6: Oyunun Sonu Ssenariləri

Oyunun Sonu Ssenariləri
Oyunun Sonu Ssenariləri
Oyunun Sonu Ssenariləri
Oyunun Sonu Ssenariləri
Oyunun Sonu Ssenariləri
Oyunun Sonu Ssenariləri
Oyunun Sonu Ssenariləri
Oyunun Sonu Ssenariləri

İZAHI:

Hər bir mayın tarama gəmisində iki oyun bitən ssenari var: qələbə və məğlubiyyət. Bu proqram çərçivəsində bu iki oyun sonu ssenarisini iki yeni üsulla həyata keçirəcəyik: "You_A_Winner_Son" metodu və "GameOver" metodu. GUI "proses" metodu daxilində yenilənmədən və iki oyun bitən ssenari üsulu ilə dəyişdirilən indekslərə əsaslanaraq, nəticəni düzgün şəkildə əks etdirmək üçün ekran düyməsi dəyişdiriləcək.

Birincisi, istifadəçi sonuncu gizli bombasız kafelə kliklədikdə "You_A_Winner_Son" metodu icra edilməlidir. Bir kafel hər dəfə tıklandıqda və kafelin bomba olmayan bir kafel olduğu aşkar edildikdə ("proses" üsulunda icra edilən "əməliyyat" üsulları daxilində) "You_A_Winner_Son" metodunu çağıraraq bu vəzifəni yerinə yetirəcəyik. Qazanan şərtlər yerinə yetirilərsə, "You_A_Winner_Son" metodu daxilində iki if-else ifadəsi icra olunacaq. İlk if-else ifadəsi, oyunçunun bu üsula çağırıldığında qalib olub-olmamasından asılı olmayaraq həmişə yerinə yetiriləcəkdir. "Çətinlik" dəyişəninin nəyə bərabər olduğuna əsaslanaraq, neçə mina/bombanın gizli qalacağını təyin edəcək müəyyən bir alqoritm. Bu alqoritm tərəfindən tapılan tam ədəd "NumOfMinesLEFT" dəyişənində qeyd olunacaq. Sonra, iki if-else ifadəsi arasında qalan başlanğıc plitələrin sayını (tıklanmamış plitələr) tapmaq üçün başqa bir alqoritm icra olunacaq. Bu alqoritm tərəfindən tapılan tam ədəd "NumOfStartingTilesLEFT" dəyişənində qeyd olunacaq. İkinci if-else ifadəsi, oyunçunun bu üsula çağırıldığında qalib olub-olmamasından asılı olmayaraq həmişə yerinə yetiriləcəkdir. "Çətinlik" dəyişəninin nəyə bərabər olduğuna əsaslanaraq, şərtləri yerinə yetirildikdə üç if-else ifadəsindən biri icra oluna bilər. Şərtlər "NumOfMinesLEFT" və "NumOfStartingTilesLEFT" iki dəyişənin nəyə bərabər olduğuna əsaslanacaq. Bu üç if-else ifadəsində, hər düyməni yararsız hala gətirəcək bir alqoritm icra olunacaq (oyun bitdi).

İkincisi, istifadəçi gizli bomba plitələrindən birini tıkladıqda "GameOver" metodu icra edilməlidir. Bir kafelə hər dəfə vurulduqda və kafelin bomba kafel olduğu aşkar edildikdə ("proses" üsulunda icra edilən "əməliyyat" üsulları daxilində) "GameOver" metodunu çağıraraq bu vəzifəni yerinə yetirəcəyik. "GameOver" metodu çağırıldıqda, hər bir başlanğıc kafelini yararsız hala gətirəcək (oyun bitdi) və gizli bomba plitələrinin ortaya çıxacağı bir alqoritm icra olunacaq ("grid siyahısı" ndakı müvafiq indekslər əsasında müəyyən indekslər) "status" siyahısında "b" tək simvollu sətirə yenidən təyin ediləcək).

Üçüncüsü, GUI hər dəfə "setSLASHresetGUI" metoduna kiçik düzəlişlər etməklə yenilənəndə oyun içi ekranın görüntüsü yenilənəcək. GUI ızgarası konfiqurasiya edildikdən sonra, cari ekran düyməsi təyinatının yerləşdirildiyi üç if-else ifadəsini yerləşdirəcəyik. Üç if-else ifadəsindən biri, aşağıdakı dəyişənlərin nəyə bərabər olduğuna əsaslanaraq icra ediləcək: "GameOverDETECTOR", "çətinlik," NumOfMinesLEFT "və" NumOfStartingTilesLEFT ". Maraqlandığınız kimi," GameOverDETECTOR "dəyişəni yeni Bu dəyişən, if-else ifadələrinin "setSLASHresetGUI" metodu daxilində icra edilməsindən dərhal əvvəl yaradılacaq. "GameOverDETECTOR" dəyişəni "grid" daxilində neçə indeks tapan bir alqoritm istifadə edərək tapılan tam ədədə bərabər olacaq. siyahı doqquz doqquzluğa təyin edildi (düymələr necə yararsız hala gətirildi). If-else ifadəsinin şərtləri yerinə yetirildiyinə əsaslanaraq, ekrana uyğun bir yenidən təyinat baş verəcək.

Addım 7: Yenidən Başlat düyməsini işlək vəziyyətə gətirmək

Yenidən başlatma düyməsini işlək hala gətirmək
Yenidən başlatma düyməsini işlək hala gətirmək

İZAHI:

Bu addım ən qısa olacaq. Bu addım üçün işlərin çoxu artıq görülüb. İndi etməyimiz lazım olan hər şey, istifadəçi tərəfindən yenidən başlat düyməsini hər dəfə tıkladığınızda "yenidən başlat" metodunu yerinə yetirməkdir.

İlk və son olaraq, "proses" metodunda "yenidən başlat" metodunu if-else ifadəsi ilə icra edəcəyik. Əgər simli "!" qeydiyyatdan keçdikdən sonra "yenidən başladın" metodu yerinə yetiriləcəkdir. Şəbəkənin məzmunu bir yerə yığılmadan əvvəl "setSLASHresetGUI" metodunun sonunda yenidən başlatma adlı bir düymə yaratmalı olacağıq. Bu yenidən başlatma düyməsi "!" Sətrini işləyəcək. (əmr lambda: self.process ("!")) və "proses" metodu daxilində müvafiq "yenidən başlat" metodunu icra edin.

Tövsiyə: