Mundarija:
- Ta'minotlar
- 1 -qadam: Tugma tasvirlarini yarating
- 2 -qadam: Dasturni formatlash
- 3 -qadam: GUI -ni yarating (Menyu va mina qidiruvchilar tarmog'i)
- 4-qadam: O'yindagi ekrandagi tugmachalarni operatsion holatga keltiring
- 5 -qadam: "setDifficulty" usuli va "qayta boshlash" usuli
- 6-qadam: O'yin tugaydigan stsenariylar
- 7 -qadam: Qayta boshlash tugmachasini operatsion holatga keltirish
Video: Minesweeper-Raspberry-Pi-Edition: 7 qadam (rasmlar bilan)
2024 Muallif: John Day | [email protected]. Oxirgi o'zgartirilgan: 2024-01-30 13:23
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
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
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)
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
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
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
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
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:
Batareya bilan ishlaydigan ofis. Quyosh panellari va shamol turbinasi: Sharq/G'arbni avtomatik almashtirish bilan quyosh tizimi: 11 qadam (rasmlar bilan)
Batareya bilan ishlaydigan ofis. Quyosh tizimi Sharq/G'arbning avtomatik panellari va shamol turbinasi bilan almashinuvi bilan: Loyiha: 200 kvadrat metrli ofis batareyali bo'lishi kerak. Ofis, shuningdek, ushbu tizim uchun zarur bo'lgan barcha tekshirgichlar, batareyalar va komponentlarni o'z ichiga olishi kerak. Quyosh va shamol energiyasi batareyalarni zaryad qiladi. Faqat kichik muammo bor
NaTaLia ob -havo stantsiyasi: Arduino quyosh energiyasi bilan ishlaydigan ob -havo stantsiyasi to'g'ri yo'l bilan amalga oshirildi: 8 qadam (rasmlar bilan)
NaTaLia ob -havo stantsiyasi: Arduino quyosh energiyasi bilan ishlaydigan ob -havo stantsiyasi to'g'ri yo'lga qo'yildi: 1 yil davomida 2 xil joyda muvaffaqiyatli ishlaganimdan so'ng, men quyosh energiyasi bilan ishlaydigan ob -havo stantsiyasining loyiha rejalari bilan bo'lishaman va uning qanday qilib uzoq vaqt yashay oladigan tizimga aylanganini tushuntiraman. quyosh energiyasidan o'tgan davrlar. Agar ergashsangiz
Twinky bilan eng zo'r Arduino robot bilan tanishing: 7 qadam (rasmlar bilan)
Twinky bilan eng zo'r Arduino roboti bilan tanishing: Salom, men sizga "Jibo" ni o'zim qanday yaratganimni o'rgataman. lekin "Twinky" deb nomlangan, men buni ochib bermoqchiman … Bu nusxa emas! Men ikkiyuzlamachilik bilan qurardim va shundan keyingina shunga o'xshash narsaning mavjudligini tushundim: bu erda
OpenLH: Biologiya bilan ijodiy tajriba o'tkazish uchun ochiq suyuqlik bilan ishlash tizimi: 9 qadam (rasmlar bilan)
OpenLH: Biologiya bilan ijodiy eksperimentlar uchun ochiq suyuqlik bilan ishlash tizimi: Biz bu ishni moddiy, ko'milgan va mujassamlangan o'zaro ta'sir xalqaro konferentsiyasida (TEI 2019) taqdim etganimizdan faxrlanamiz. Tempe, Arizona, AQSh | 17-20 mart. Hamma yig'ish fayllari va qo'llanmalar bu erda mavjud. Oxirgi kod versiyasi
Vaqt o'tishi bilan rasmlar uchun kamera osonlashtirildi: 22 qadam (rasmlar bilan)
Vaqt o'tishi bilan suratga olish uchun kamera osonlashtirildi. Men boshqa ko'rsatmalarni vaqtni tez suratga olish filmlarini suratga olishni tekshirib ko'rdim. U kino qismini juda yaxshi yoritgan. U filmlar yaratish uchun yuklab olishingiz mumkin bo'lgan bepul dasturiy ta'minot haqida gapirib berdi. Men o'z -o'zimga aytdim, men o'ylaymanki, agar men qila olsam