Mundarija:

Minesweeper-Raspberry-Pi-Edition: 7 qadam (rasmlar bilan)
Minesweeper-Raspberry-Pi-Edition: 7 qadam (rasmlar bilan)

Video: Minesweeper-Raspberry-Pi-Edition: 7 qadam (rasmlar bilan)

Video: Minesweeper-Raspberry-Pi-Edition: 7 qadam (rasmlar bilan)
Video: windows 7 End 😭😭😭 2024, Noyabr
Anonim
Minesweeper-Raspberry-Pi-Edition
Minesweeper-Raspberry-Pi-Edition
Minesweeper-Raspberry-Pi-Edition
Minesweeper-Raspberry-Pi-Edition

Mening Luiziana Texnika Universitetidagi CSC 130 seriyasidagi yakuniy loyiham - Minesweeper Raspberry Pi Edition. Ushbu loyihada men Python dasturlash tilining Tkinter kutubxonasidan foydalanib, mina qidiruvchilarning klassik o'yinini qayta yaratishga harakat qildim. Mina tashuvchi o'yini qamrab olgan tarmoq - kengligi sakkizta, balandligi beshta kafel. Loyihani formatlash Python 2.7 o'rnatilgan Raspberry Pi -dan foydalanish uchun moslashtirilgan va takomillashtirilgan.

Minesweeper Raspberry Pi Edition yakuniy loyihasining kodi va rasmlarini quyidagi havola orqali yuklab olish mumkin:

Minesweeper-Raspberry-Pi-Edition

Ta'minotlar

x1 Raspberry Pi

Python 2.7 Raspberry Pi -ga o'rnatilgan

Microsoft Powerpoint (yoki tugmalar uchun rasm yaratish uchun boshqa dastur)

1 -qadam: Tugma tasvirlarini yarating

Tugma rasmlarini yarating
Tugma rasmlarini yarating

Tushuntirish:

GUIni tashkil etuvchi har bir tugmani yaratish kerak bo'ladi. Bu vazifani bajarish uchun men tugmachalarda ko'rsatish uchun kerakli tasvirlarni yaratish uchun Microsoft Powerpoint -dan foydalandim.

Birinchidan, men Microsoft Powerpoint yordamida mina tashuvchilar tarmog'ini (bo'sh, bob, nol, bir, ikki, uch, to'rt, besh, olti, etti va sakkiz) yaratish uchun zarur bo'lgan o'nta tugmachani yaratdim.

Ikkinchidan, men Microsoft Powerpoint yordamida menyu ekrani uchun zarur bo'lgan to'rtta tasvirni (menyuni ko'rsatish, oson qiyinchilik tugmasi, o'rta qiyinchilik tugmasi va qiyin tugma) yaratdim.

Uchinchidan, men Microsoft Powerpoint yordamida qayta boshlash tugmasi uchun zarur bo'lgan tasvirni va boshqa boshqa displey tugmalari uchun kerakli tasvirlarni ("o'yin tugadi", "siz yutasiz" va "qoidalar" displeyi) uchun kerakli tasvirlarni yaratdim.

To'rtinchidan, siz ekran o'lchamiga mos keladigan o'lchamdagi rasmlarni o'zgartirishingiz kerak bo'ladi. Rasberry Pi uchun men oyna uchun quyidagi o'lchamlardan foydalanardim (uzunlik va kenglikdagi piksellarga ishora qilib): 432x576.

2 -qadam: Dasturni formatlash

Formatlash dasturi
Formatlash dasturi

Tushuntirish:

Haqiqiy dasturlashdan oldin, biz kerakli kutubxonalarni import qilishimiz va dasturimizning asosiy qismini yozishimiz kerak.

Birinchidan, biz Tkinter kutubxonasidan * va tasodifiy kutubxonadan aralashtirishimiz kerak bo'ladi. Ikkinchidan, biz dasturning asosiy qismidagi kodda quyidagi bosqichlarni bajarishimiz kerak bo'ladi: oynani yaratish, sarlavha oynasini o'rnatish, GUIni yaratish va GUIni ko'rsatish va foydalanuvchining o'zaro ta'sirini kutish. Bu kod Tkinter kutubxonasiga nisbatan to'g'ri formatda yozilgan (to'g'ri formatlashni ko'rish uchun ko'rsatmalarda berilgan kodga qarang).

3 -qadam: GUI -ni yarating (Menyu va mina qidiruvchilar tarmog'i)

GUI yaratish (menyu va mina qidiruvchilar tarmog'i)
GUI yaratish (menyu va mina qidiruvchilar tarmog'i)
GUI yaratish (menyu va mina qidiruvchilar tarmog'i)
GUI yaratish (menyu va mina qidiruvchilar tarmog'i)
GUI yaratish (menyu va mina qidiruvchilar tarmog'i)
GUI yaratish (menyu va mina qidiruvchilar tarmog'i)
GUI yaratish (menyu va mina qidiruvchilar tarmog'i)
GUI yaratish (menyu va mina qidiruvchilar tarmog'i)

Tushuntirish:

Dasturni ishga tushirgandan so'ng, menyu ekrani ochiladi. Qiyinchilik tanlanganidan so'ng (menyu ekranidagi qiyinchilik tugmalaridan birini bosish orqali), GUI minaseperlar tarmog'i, displey va qayta ishga tushirish tugmasi yordamida yangilanadi. Siz GUI ustida ishlay boshlaganingiz uchun, biz faqat menyuni ishga tushirishimiz, menyuning qiyinchilik tugmachalarini ishga tushirishimiz va mina qidiruvchilar panjarasi yordamida GUIni o'yin ekraniga yangilashimiz kerak bo'ladi.

Birinchidan, MainGUI klassi konstruktoridagi "setupMenu" usulini chaqirib, dastur ishga tushganda menyu ekrani o'zini ko'rsatishi mumkin.

Ikkinchidan, biz menyuning har bir qiyinchilik tugmachasini "jarayon" usulini qo'shish orqali bosilganda, kodning qator satrlarini bajarishga majbur qila olamiz (shuningdek, tugma funktsiyasi parametrlari ichida lambda: self.process ("returnButtonName") buyrug'ini qo'shish kerak bo'ladi) har bir qiyinchilik tugmachasini yaratishda). "Jarayon" usulida uchta if-else iborasi yaratiladi va tugma nimaga tengligiga qarab boshqa kod va boshqa qator usullarini bajaradi (tugma oxirgi marta ro'yxatdan o'tgan tugma nomiga teng).

Uchinchidan, menyu ekrani yonida va agar foydalanuvchi qiyinchilik tugmalaridan birini bossa, dastur ma'lum bir qiymatni "qiyinchilik" o'zgaruvchisiga saqlaydi (qiyinchilik "oson", "o'rta" yoki "qattiq" ga teng) qaysi tugma bosilsa, tugma nomi oxirgi marta ro'yxatdan o'tgan bo'lsa, qaysi if-else buyrug'iga amal qilish kerakligini biladi. Bu "qiyinchilik" o'zgaruvchisini "MainGUI" klassi yaratilishidan oldin bo'sh qator sifatida o'rnatamiz.

To'rtinchidan, GUIni "setupMenu" usuli bilan qilingan tugmalardan tozalab, "clearMenu" usulini (bir nechta holatlarda button.destroy () funktsiyasidan foydalangan holda) va "jarayon" usulida "clearMenu" usulini chaqiring (ostida). qiyinchilik tugmachalarining har biri qiyinchilik o'zgaruvchisini belgilashdan keyin ro'yxatga olinadi).

Beshinchidan, "setSLASHresetGUI" usulini (tugmachalari "setupMenu" usuli bilan bir xil tarzda amalga oshiriladi) va "jarayon" usulida "setSLASHresetGUI" usulini chaqirish (har bir qiyinchilik tugmachasi ostidan keyin ro'yxatdan o'tib, GUIni yangilash). qiyinchilik o'zgaruvchini tayinlash va "clearMenu" usulini chaqirish).

Bundan tashqari, barcha tugmalar "setSLASHresetGUI" usulida tayinlanmasidan oldin, biz tarmoq ichidagi qatorlar va ustunlarni sozlashimiz kerak va barcha tugmalar "setSLASHresetGUI" usulida tayinlanganidan so'ng, biz barcha tarkibni panjara ichiga yig'ishimiz kerak. to'g'ri formatlashni ko'rish uchun ko'rsatmalarda berilgan kod).

4-qadam: O'yindagi ekrandagi tugmachalarni operatsion holatga keltiring

O'yindagi ekrandagi tugmachalarni operatsion holatga keltiring
O'yindagi ekrandagi tugmachalarni operatsion holatga keltiring
O'yindagi ekrandagi tugmachalarni operatsion holatga keltiring
O'yindagi ekrandagi tugmachalarni operatsion holatga keltiring
O'yindagi ekrandagi tugmachalarni operatsion holatga keltiring
O'yindagi ekrandagi tugmachalarni operatsion holatga keltiring
O'yindagi ekrandagi tugmachalarni operatsion holatga keltiring
O'yindagi ekrandagi tugmachalarni operatsion holatga keltiring

Tushuntirish:

Tugmalar bosilganda ba'zi kod satrlarini bajarishi uchun biz "jarayon" usulidagi usullarni bajarishimiz kerak bo'ladi. Bu vazifani bajarish uchun bizga bir nechta yangi usullar, o'zgaruvchilar va ro'yxatlar tuzish kerak bo'ladi.

Birinchidan, biz ikkita ro'yxatni tuzamiz. "Grid" deb nomlangan ro'yxat bo'ladi. Bu "panjara" ro'yxati faqat 9 va 0 butun sonlardan iborat bo'ladi. Bu ro'yxatda to'qqizta bomba, nol esa bomba bo'lmaganni ifodalaydi. Shunday qilib, dastur plitka bomba yoki yo'qligini aniqlaydi. Ikkinchi ro'yxat tuziladi va u "status" deb nomlanadi. Bu "status" ro'yxati faqat bitta belgi qatoridan iborat ("0", "1", "2", "3", "4", "5", "6", "7", "8", "b" "). Bu ro'yxatda har bir belgi satri ma'lum tasvirga mos keladi. Shunday qilib, dastur mina qidiruvchilar tarmog'idagi har bir tugmachada qanday tasvirni ko'rsatish kerakligini bilib oladi. Mina qidiruvchilar tarmog'idagi har bir tugmachaning har bir ro'yxatda mos keladigan indeksga ega bo'lishi uning tarmoqqa joylashishiga asoslanadi. Tegishli indeks quyidagi tartibda tayinlanadi (tugma raqami - 1). Masalan, har bir ro'yxatdagi tegishli indeks tugmasi indeks nolga teng. Nihoyat, bu ikkita ro'yxat "MainGUI" klassi bajarilishidan oldin bajariladi va "MainGUI" sinfidan tashqarida yaratiladi. "Grid" klassi bo'sh ro'yxat sifatida yaratiladi (grid = ) va "status" ro'yxati diapazon funktsiyasi yordamida yaratiladi ("status" ro'yxatiga "n" ning qirq bitta belgi qatorini qo'shish).

Ikkinchidan, biz uning atrofidagi minalar sonini aniqlaydigan va tugma bosilganda chaqiriladigan har xil usullarni yaratamiz (qaysi usulni bajarish kerakligi tugmachaning joylashuvi bilan belgilanadi). Bu usullar bizning mina analizatorlarimiz deb ataladi. Bu usullar "NumOfMines" deb nomlangan hisoblagichni ko'paytiradi va plitka atrofida qancha bomba borligini aniqlash uchun "grid" ro'yxatidagi ma'lum indekslardan foydalanadi. "NumOfMines" o'zgaruvchisida saqlanadigan satr "status" ro'yxatidagi bir xil mos keladigan indeksni almashtirish uchun ishlatiladi. Endi, dastur qanday indeksdan foydalanish kerakligini qanday biladi, degan savol tug'ilishi mumkin. Tugma "jarayon" usulida ro'yxatdan o'tkazilganda, "indeks" o'zgaruvchisi yaratiladi/ma'lum bir tamsayıga qayta tayinlanadi (tugma qaysi satrga yozilganiga qarab). Yaratilgan usullardan biri plitkaning joylashishini va uning atrofidagi plitkalarning indekslarini bilish uchun tayinlangan indeksdan foydalanadi (usul ichidagi algoritm buni aniqlab beradi). Bundan tashqari, "indeks" o'zgaruvchisini qayta tayinlash uchun avval uni sinfdan tashqarida o'rnatishimiz kerak bo'ladi. Shunday qilib, "MainGUI" klassi yaratilishidan oldin biz "indeks" o'zgaruvchisini nol tamsayı sifatida o'rnatamiz.

Uchinchidan, "operatsiya" usullari yaratiladi. Har safar tugma qayd qilinganida "operatsiya" usuli bajariladi. Bu "operatsiya" usullari "jarayon" usulida bajariladi. "Jarayon" usulida bir nechta if-else iboralari qaysi tugma bosilganligini aniqlaydi (tugma nimaga teng ekanligini hisobga olgan holda). Bu erda ma'lum "operatsiya" usuli chaqiriladi (if-else so'zlarida).

To'rtinchidan, biz tugmalar qanday ishlashini bilib olamiz. Yuqorida aytib o'tilganidek, if-else bir nechta bayonotlari "jarayon" usulida joylashgan va tugma nima bilan teng bo'lishidan qat'i nazar, qo'shimcha kodning boshqa usullari va satrlarini bajaradi (tugma oxirgi marta ro'yxatdan o'tgan narsaga teng). If-else iboralarida quyidagi tartibda bo'ladi: indeks global miqyosda tayinlanadi, "status" ro'yxatidagi tegishli indeks "b" qatoriga qayta tayinlanadi (agar "katak" ro'yxatining mos keladigan indeksi teng bo'lsa) To'qqiz son), mos keladigan "operatsiya" usuli bajariladi (agar "grid" ro'yxatining mos keladigan indeksi nolga teng bo'lsa), "status" ro'yxatidagi mos keladigan indeks o'zgaruvchiga teng qatorga qayta tayinlanadi. "NumOfMines" (agar "grid" ro'yxatining mos keladigan indeksi nolga teng bo'lsa) va GUI "setSLASHresetGUI" usulini chaqirish orqali yangilanadi.

5 -qadam: "setDifficulty" usuli va "qayta boshlash" usuli

Rasm
Rasm
Rasm
Rasm

Tushuntirish:

Keyinchalik, "setDifficulty" usulini yaratish kerak va o'yin ichidagi ekranning pastki qismida joylashgan qayta boshlash tugmasi ishga tushishi kerak ("qayta ishga tushirish" usulini yaratish orqali uni foydalanuvchi bosganida bajariladi).).

Birinchidan, "setDifficulty" usuli "jarayon" va "qayta ishga tushirish" usulidagi qiyinchilik tugmalarining if-else iboralarida qo'llanilishi kerak bo'ladi. Ushbu usulda bajariladigan kodlar va usullar satrlari juda oddiy. "SetDifficulty" usulida biz "grid" ro'yxatiga ma'lum miqdordagi nol (bomba bo'lmagan) va to'qqiz (bomba) qo'shamiz (har bir if-else iborasida ikkita diapazonli funktsiya orqali) va keyin biz "setDifficulty" usuli ichidagi "grid" ro'yxati (tasodifiy kutubxonaning aralashtirish funktsiyasi bilan) (if-else ko'rsatmalari bajarilgandan keyin). Nollarning to'qqizga nisbati "qiyinchilik" o'zgaruvchisi qaysi qatorga o'rnatilgani bilan aniqlanadi ("oson": 34-6, "o'rta": 28-12, "qattiq": 16-24).

Ikkinchidan, "qayta ishga tushirish" usulida biz "indeks" va "NumOfMinesLEFT" o'zgaruvchilarini butun dunyo bo'ylab nolga o'rnatamiz, "status" va "grid" ro'yxatlarini global miqyosda bo'shatamiz, diapazon funktsiyasi bilan "status" ro'yxatini tiklaymiz (qo'shish) "status" ro'yxatiga "n" ning qirq bitta belgi satrini kiriting) va "setDifficulty" usulini chaqiring.

6-qadam: O'yin tugaydigan stsenariylar

O'yin tugaydigan ssenariylar
O'yin tugaydigan ssenariylar
O'yin tugaydigan ssenariylar
O'yin tugaydigan ssenariylar
O'yin tugaydigan ssenariylar
O'yin tugaydigan ssenariylar
O'yin tugaydigan ssenariylar
O'yin tugaydigan ssenariylar

Tushuntirish:

Har bir minalashtiruvchi o'yinda ikkita o'yin tugaydigan ssenariy mavjud: g'alaba va mag'lubiyat. Ushbu dastur doirasida biz o'yinni tugatadigan ikkita ssenariyni ikkita yangi usul bilan amalga oshiramiz: "You_A_Winner_Son" usuli va "GameOver" usuli. GUI "jarayon" usulida yangilanmasidan oldin va ikkita o'yin tugaydigan stsenariy usuli bilan o'zgartirilgan indekslarga asoslanib, natijani to'g'ri ko'rsatish uchun ko'rsatish tugmasi o'zgartiriladi.

Birinchidan, foydalanuvchi oxirgi yashirin bombasiz plitani bosganida, "You_A_Winner_Son" usuli bajarilishi kerak. Biz bu vazifani "You_A_Winner_Son" usulini chaqirish orqali bajaramiz, chunki har safar plitka bosilganda va bomba bo'lmagan plitka topilsa ("jarayon" usulida bajariladigan "operatsiya" usullari doirasida). Agar yutuq shartlari bajarilsa, "you_A_Winner_Son" usulida if-else ikkita bayonoti bajariladi. Birinchi if-else bayonoti, agar o'yinchi g'olib bo'ladimi yoki yo'qmi, bu usul chaqirilganda bajariladi. "Qiyinchilik" o'zgaruvchisi nimaga tengligiga asoslanib, qancha mina/bomba yashiringanligini aniqlaydigan ma'lum algoritm. Bu algoritmda topilgan butun son "NumOfMinesLEFT" o'zgaruvchisida saqlanadi. So'ngra, if-else so'zining o'rtasida qolgan boshlang'ich plitalar sonini topish uchun boshqa algoritm bajariladi (bosilmagan plitkalar). Bu algoritmda topilgan butun son "NumOfStartingTilesLEFT" o'zgaruvchisida saqlanadi. Ikkinchi if-else iborasi, agar o'yinchi g'olib bo'ladimi yoki yo'qmi, har doim bajariladi. "Qiyinchilik" o'zgaruvchisi nimaga teng ekanligiga qarab, agar shartlari bajarilsa, if-else uchta bayonotidan bittasi bajarilishi mumkin. Shartlar "NumOfMinesLEFT" va "NumOfStartingTilesLEFT" ikkita o'zgaruvchisi nimaga teng bo'lishiga asoslanadi. Bu uchta if-else bayonotida har bir tugmani yaroqsiz holga keltiradigan algoritm bajariladi (o'yin tugadi).

Ikkinchidan, foydalanuvchi yashirin bomba plitalaridan birini bosganda, "GameOver" usuli bajarilishi kerak. Biz bu vazifani "GameOver" usulini chaqirish orqali bajaramiz, chunki har safar plitka bosilganda va bomba plitasi ("jarayon" usulida bajarilgan "operatsiya" usullari ichida). "GameOver" usuli chaqirilganda, har bir boshlang'ich plitani yaroqsiz holga keltiradigan algoritm bajariladi (o'yin tugadi) va yashirin bomba plitalari ochiladi ("gridlar ro'yxatidagi tegishli indekslar asosida, ba'zi indekslar"). "status" ro'yxatidagi "b" bitta belgidan iborat qatorga qayta tayinlanadi).

Uchinchidan, "setSLASHresetGUI" usuliga juda ozgina kichik o'zgartirishlar kiritish orqali GUI har safar yangilanib turganda, o'yin ichidagi ekranning ko'rinishi yangilanadi. GUI tarmog'i konfiguratsiya qilinganidan so'ng, biz uchta if-else iborasini joylashtiramiz, u erda joriy displey tugmachasi tayinlanadi. Agar uchta if-else bayonotidan biri bajarilsa, quyidagi o'zgaruvchilar nimaga teng: "GameOverDETECTOR", "qiyinchilik", "NumOfMinesLEFT" va "NumOfStartingTilesLEFT". Siz o'ylayotganingizdek, "GameOverDETECTOR" o'zgaruvchisi yangi. Bu o'zgaruvchi if-else iboralari "setSLASHresetGUI" usulida bajarilishidan oldin yaratiladi. "GameOverDETECTOR" o'zgaruvchisi "grid" ichida qancha indeksni topadigan algoritm yordamida topilgan butun songa teng bo'ladi. ro'yxat to'qson to'qqiztaga o'zgartirildi (tugmalar qanday yaroqsiz holga keltirildi). If-else bayonotining shartlari bajarilgandan so'ng, displeyga tegishli qayta tayinlash amalga oshiriladi.

7 -qadam: Qayta boshlash tugmachasini operatsion holatga keltirish

Qayta boshlash tugmachasini operatsion holatga keltirish
Qayta boshlash tugmachasini operatsion holatga keltirish

Tushuntirish:

Bu qadam eng qisqa bo'ladi. Ushbu qadam uchun ko'p ishlar allaqachon qilingan. Bizga hozir kerak bo'lgan narsa, har safar foydalanuvchi qayta ishga tushirish tugmasini bosganida "qayta ishga tushirish" usulini bajarishdir.

Birinchidan va nihoyat, biz "jarayon" usulida "qayta ishga tushirish" usulini if-else ifodasi bilan bajaramiz. Agar satr "!" ro'yxatga olingan bo'lsa, "qayta boshlash" usuli bajariladi. Shuningdek, biz "setSLASHresetGUI" usuli oxirida qayta ishga tushirish tugmachasini yaratishimiz kerak, bu tarmoq tarkibini yig'ishdan oldin. Qayta ishga tushirish tugmasi "!" Qatorini qayta ishlaydi. (buyruq lambda: self.process ("!")) va "jarayon" usulida tegishli "qayta ishga tushirish" usulini bajaring.

Tavsiya: