Mundarija:

Tarmoq raqobati: BBC Micro uchun kechiktirilgan o'yin: bit: 10 qadam (rasmlar bilan)
Tarmoq raqobati: BBC Micro uchun kechiktirilgan o'yin: bit: 10 qadam (rasmlar bilan)

Video: Tarmoq raqobati: BBC Micro uchun kechiktirilgan o'yin: bit: 10 qadam (rasmlar bilan)

Video: Tarmoq raqobati: BBC Micro uchun kechiktirilgan o'yin: bit: 10 qadam (rasmlar bilan)
Video: Загадка Титаника : Как они могли не заметить айсберг?! Самая подробная история! 2024, Noyabr
Anonim
Tarmoq raqobati: BBC Micro uchun past kechikish o'yini: bit
Tarmoq raqobati: BBC Micro uchun past kechikish o'yini: bit
Tarmoq raqobati: BBC Micro uchun past kechikish o'yini: bit
Tarmoq raqobati: BBC Micro uchun past kechikish o'yini: bit

Ushbu qo'llanmada men BBC micro: bit -da quyidagi ko'p funktsiyali asosiy o'yinni qanday amalga oshirishni tushuntiraman:

  • Oddiy interfeys
  • Tugma bosish va ekran yangilanishlari orasidagi kechikish
  • Qatnashuvchilarning moslashuvchan soni
  • Masofadan boshqarish pulti ("root") yordamida o'yinni oson boshqarish

O'yin, aslida, siyosatning simulyatsiyasi. Ikkala o'yinchidan tashqari, barcha o'yinchilar hech qanday jamoaga tayinlanmagan holda boshlanadi. Bu futbolchilardan biri "A" jamoasiga, ikkinchisi "B" jamoasiga tayinlangan.

O'yinning maqsadi - har bir o'yinchi ko'pchilik o'yinchilar bilan jamoada bo'lish.

Yuqoridagi diagrammada cheklangan holat mashinasi, ya'ni qurilma bo'lishi mumkin bo'lgan holatlar va bu holatlar orasidagi o'tishlar tasvirlangan.

Holat - bu qurilma yoqilgan paytdan boshlab uning xotirasini tavsiflovchi joriy ma'lumotlar to'plami. Ushbu ma'lumotlarga asoslanib, qurilma ma'lum harakatlarni bajarishi yoki foydalanuvchi kiritishiga boshqacha munosabatda bo'lishi mumkin.

O'tish - bu mantiqiy shart bo'lib, rost bo'lsa, qurilma holatini o'zgartiradi. O'tish bir davlatdan boshqa davlatga o'tishi mumkin. Shtatda bir nechta o'tish bo'lishi mumkin.

Yuqoridagi diagrammada quyidagi holatlar ko'rsatilgan:

  • Tayinlanmagan
  • A ni tinglang
  • B ni tinglang
  • A guruhi
  • B guruhi

O'yin kodini ishlatadigan qurilma bu beshta shtatning birida bo'lishi mumkin, lekin bittadan bittasi va faqat beshtasi.

Qo'llanma davomida siz Microsoft -ning MakeCode muharriridan foydalanayotganingizni taxmin qilaman, uni quyidagi manzilda topishingiz mumkin:

O'yinning to'liq bajarilishini bu erda topishingiz mumkin:

makecode.microbit.org/_CvRMtheLbRR3 ("microbit-demo-user"-loyihaning nomi)

Va asosiy ("ildiz") tarmoq boshqaruvchisining bajarilishini bu erda topishingiz mumkin:

makecode.microbit.org/_1kKE6TRc9TgE ("microbit-demo-root"-loyihaning nomi)

Men darslarim davomida bu misollarga murojaat qilaman.

1 -qadam: Katta rasm dizayni bo'yicha fikrlar

Har qanday kodni yozishdan oldin, biz oxirgi mahsulotimiz qanday ko'rinishga ega bo'lishi haqida o'ylashimiz kerak. boshqacha aytganda, ilovaga qanday talablar qo'yiladi? Bizning kodimiz qurilmani tugatgandan so'ng nima qilishini ko'rsatishi kerak? Men asosiy ilovaning funktsional imkoniyatlarini oltita toifaga ajratdim, ularning har birini boshqa dizayn nuqtai nazaridan ko'rib chiqish mumkin.

  1. Biz qurilmaning hozirgi holatiga qarab harakatlarini nazorat qilmoqchimiz
  2. Biz qurilma foydalanuvchi ma'lumotlariga javob berishini xohlaymiz
  3. Biz 5 x 5 LED displey yordamida animatsiya va grafikani ko'rsatishni xohlashimiz mumkin
  4. Qurilma ishga tushganda, biz qurilmalar xotirasidagi ma'lumotlar qiymatlarini ishga tushirishni xohlaymiz
  5. Qurilmaning radiosi yordamida ma'lumotlarni simsiz uzatishni xohlaymiz
  6. Biz qurilma radiosi orqali ma'lumotlarni tinglashni va qabul qilishni va shunga mos ravishda qayta ishlashni xohlaymiz

Menga har biri haqida batafsilroq ma'lumot berishga ruxsat bering.

1. Biz qurilmaning hozirgi holatiga qarab uning harakatlarini nazorat qilmoqchimiz

Boshqa dasturlar singari, kodda ko'rsatilgan ko'rsatmalarni bajarish bir vaqtning o'zida bir qatorda amalga oshiriladi. Biz ushbu qo'llanmaning yuqori qismidagi diagrammada ko'rsatilganidek, biz qurilmamizning ichki holatiga qarab ba'zi ko'rsatmalarni bajarishini xohlaymiz. Qurilmani tekshirishi kerak bo'lgan har bir kod blokidan keyin biz bir qator shartlarni yozishimiz mumkin edi, lekin bu yondashuv juda tez buzilib ketishi mumkin, shuning uchun biz faqat bitta o'zgaruvchini tekshiradigan va shu o'zgaruvchiga asoslangan cheksiz pastadirdan foydalanamiz., ma'lum bir ko'rsatmalar to'plamini bajaradi yoki umuman hech narsa qilmaydi. Bu o'zgaruvchi foydalanuvchi ilovasida ham, ildiz dasturimizda ham "_state" qo'shimchasi bilan aniqlanadi.

2. Qurilmaning foydalanuvchi kiritgan ma'lumotlarga munosabat bildirishini xohlaymiz

Kod ketma -ket ketma -ket, ya'ni bir vaqtning o'zida sodir bo'lishiga qaramay, bizning qurilmamiz tugmachalarni bosishga javob berishi kerak, bunda asosiy holat aylanishi har qanday vaqtda nima qilish kerakligini aniqlaydi. Shu maqsadda, qurilma apparat bilan o'zaro aloqada bo'ladigan past darajali dasturiy ta'minotga signallarni yuborish qobiliyatiga ega, bu hodisa deb ataladi. Biz qurilmaga ma'lum bir voqea turini aniqlaganida biror narsa qilishini aytadigan kod yozishimiz mumkin.

3. Biz 5 x 5 LED displey yordamida animatsiyalar va grafikalarni ko'rsatishni xohlaymiz

Buni amalga oshirish mexanizmi sodda ko'rinadi, lekin tasvirni ko'rsatadigan blok 400 msga yashirin kechikish qo'shadi. Biz qurilmamiz o'z holatini iloji boricha kechiktirmasdan bajarishda davom etishini xohlaganimiz uchun, kechikishni kamaytirish uchun javascript kodini o'zgartirishimiz kerak bo'ladi.

4. Qurilma ishga tushganda, biz qurilmalar xotirasidagi ma'lumotlar qiymatlarini ishga tushirishni xohlaymiz

Qurilmamiz biror narsa qilishdan oldin, ilova o'z ma'lumotlarini xotiraga yuklashi kerak. Bunga kodning o'qilishi uchun nomlangan doimiy o'zgaruvchilar, animatsiyaning bir qismi bo'lishi mumkin bo'lgan tasvirlar bo'lgan o'zgarmaydiganlar va to'g'ri ishlashi uchun 0 dan boshlash kerak bo'lgan hisoblagich o'zgaruvchilari kiradi. Biz o'zgarmaydigan nomlarning uzun ro'yxati va ularning yangi tayinlangan qiymatlari bilan yakunlanamiz. Shaxsiy uslubni tanlash sifatida men doimiy qiymatlarni, ya'ni ALL_CAPS yordamida hech qachon o'zgartirishim shart bo'lmagan qiymatlarni bildiraman. Shuningdek, men asosiy o'zgaruvchining identifikatorlarini turkum nomi bilan belgilayman, bu identifikator tushadigan ob'ekt yoki turga tegishli. Bu kodni bajarishni osonlashtirishga qaratilgan. Men hech qachon "element" yoki "x" kabi o'zgarmaydigan nomni ishlatmayman, chunki kodni tushunishga urinishda paydo bo'ladigan noaniqlik.

5. Biz qurilmaning radiosi yordamida ma'lumotlarni simsiz uzatishni xohlaymiz

MakeCode blokirovka qilish tilidan foydalanganda bu juda oddiy vazifadir. Biz yuklash vaqtida barcha qurilmalarni bitta radio guruhiga o'rnatamiz, keyin signal yubormoqchi bo'lsak, bizga bitta raqamni "Radio yuborish raqami" blokiga o'tkazishimiz mumkin. Yuboruvchi va qabul qiluvchining bitta radio guruhida ishlashi juda muhim, chunki bo'lmasa, ular turli chastotalarda yuboradi yoki qabul qiladi va aloqa muvaffaqiyatsiz bo'ladi.

6. Biz qurilma radiosi orqali ma'lumotlarni tinglashni va qabul qilishni va shunga mos ravishda qayta ishlashni xohlaymiz

Oldingi element bilan bir xil fikrlarni inobatga olgan holda, biz kiruvchi translyatsiyalarni xuddi foydalanuvchi kiritganidek tinglaymiz: voqealar boshqaruvchisi yordamida. Biz kiruvchi signallarni tekshiradigan va asosiy holat tsiklini bezovta qilmasdan biron bir harakat qilish kerakligini tekshiradigan kod blokini yozamiz.

Bundan tashqari, biz qurilmaga butun tarmoqni boshqarishga imkon beradigan, eng oddiy ildiz dasturining dizaynini qisqacha ko'rib chiqishimiz kerak. Men bunga ko'p vaqt sarflamayman, chunki bu yuqoridagi dizaynga qaraganda ancha sodda va ko'p qismi shunchaki takrorlash. Men ildiz zarining funksionalligini uch toifaga ajratdim.

  1. Biz signal tanlashni xohlaymiz
  2. Biz signalni uzatishni xohlaymiz

--

1. Biz signal tanlash imkoniyatiga ega bo'lishni xohlaymiz

Buni faqat mumkin bo'lgan signallar orqali takrorlash mumkin. Faqat uchtasi bor ekan, bu yondashuv etarli bo'ladi. Shu bilan birga, biz tanlagan signalni doimiy ravishda qayta ko'rsatadigan, foydalanuvchiga tugmachani bosish va LED displeyida tanlangan signalning juda kam kechikish bilan ko'rinishini ko'rish imkonini beradigan tsiklga ega bo'lishimiz mumkin.

2. Biz signalni uzatishni xohlaymiz

Ikkita tugma bo'lgani uchun biz birini tanlash uchun, ikkinchisini tasdiqlash uchun belgilashimiz mumkin. Foydalanuvchi ilovasi kabi biz ham signalni tarmoq orqali raqam sifatida yuboramiz. Boshqa hech qanday ma'lumot talab qilinmaydi.

Keyingi bo'limda oddiy signal protokoli haqida ko'proq gaplashaman.

2 -qadam: Signal protokoli: tarmoq aloqasi uchun oddiy til

Quyidagi signallarni qurilmalar bir -biri bilan gaplashish uchun ishlatishi mumkin bo'lgan barcha so'zlar majmui deb hisoblash mumkin. Tarmoq juda sodda bo'lgani uchun, aytadigan ko'p narsa yo'q va shuning uchun biz bu uchta signalni oddiy tamsayı qiymatlari bilan ifodalashimiz mumkin.

0. Qayta tiklash

  • Koddagi identifikator: SIG-R
  • Butun qiymat: 0
  • Maqsad: Qator ichidagi barcha qurilmalarga nima qilayotganlarini tashlab yuboringlar va ular xuddi ishga tushgandek harakat qiling. Agar bu signal tarmoqdagi har bir qurilmaga yetsa, butun tarmoq qayta tiklanadi va foydalanuvchilar yangi o'yinni boshlashlari mumkin. Bu signal faqat ildiz qurilmasi orqali uzatilishi mumkin.

1. Konversiya A

  • Koddagi identifikator: SIG-A
  • Butun qiymat: 1
  • Maqsad: LISTEN_A holatidagi har qanday qurilmaga aylantirish signalini qabul qilib, TEAM_A holatiga o'tishni ayting.

2. Konvertatsiya qilish B

  1. Koddagi identifikator: SIG-B
  2. Butun qiymat: 2
  3. Maqsad: LISTEN_B holatidagi har qanday qurilmaga aylantirish signalini qabul qilib, TEAM_B holatiga o'tishni ayting.

3 -qadam: Biz qurilmaning hozirgi holatiga qarab harakatlarini nazorat qilmoqchimiz

Biz qurilmaning hozirgi holatiga qarab harakatlarini nazorat qilmoqchimiz
Biz qurilmaning hozirgi holatiga qarab harakatlarini nazorat qilmoqchimiz
Biz qurilmaning hozirgi holatiga qarab harakatlarini nazorat qilmoqchimiz
Biz qurilmaning hozirgi holatiga qarab harakatlarini nazorat qilmoqchimiz
Biz qurilmaning hozirgi holatiga qarab harakatlarini nazorat qilmoqchimiz
Biz qurilmaning hozirgi holatiga qarab harakatlarini nazorat qilmoqchimiz

Nihoyat, biz kod yozishni boshlashimiz mumkin.

Birinchidan, Make Code -da yangi loyihani oching

  • Yangi funktsiyani yarating. Men "loop" deb nomladim, chunki bu dasturning asosiy aylanishi
  • Cheksiz takrorlanadigan loop blokini qo'shing. Men "true" dan foydalandim, chunki haqiqiy haqiqiy hech qachon noto'g'ri bo'lmaydi, shuning uchun dasturni boshqarish oqimi hech qachon pastadirdan chiqmaydi.
  • Qurilmaning beshta mumkin bo'lgan holatida ekanligini tekshirish uchun etarli if-else bloklarini qo'shing
  • Joriy qurilma holatini ushlab turish uchun o'zgaruvchini yarating
  • Mumkin bo'lgan beshta holatning har birini ko'rsatish uchun o'zgaruvchilar yarating

    Eslatma: Bu o'zgaruvchilar hali tayinlangan qiymatlarga ega emas. Biz bunga erishamiz. Bu erda biz kodni toza, o'qilishi oson yozishimiz muhimroq

  • If-else bloklaridagi har bir shartni hozirgi holatni mumkin bo'lgan holatlardan biriga solishtirish uchun o'zgartiring
  • If-else bloklarining pastki qismida millisekundlar soniga pauza qo'shing va bu raqamni ushlab turish uchun o'zgarmaydigan yarating. Biz uni keyinroq ishga tushiramiz. O'zgaruvchining tavsiflovchi ismga ega ekanligiga ishonch hosil qiling, masalan, Shomil yoki yurak urishi. Bu qurilmaning asosiy halqasi bo'lgani uchun, bu pauza qurilmaning asosiy tsiklini bajarish tezligini aniqlaydi, shuning uchun bu juda muhim qiymat va nomsiz sehrli son bo'lish juda muhim.

Eslatma: Uchinchi rasmdagi kulrang bloklar haqida qayg'urmang. Men ularga keyinroq murojaat qilaman.

4 -qadam: Biz foydalanuvchilarning kirishiga munosabat bildirmoqchimiz

Biz foydalanuvchi kiritishiga munosabat bildirmoqchimiz
Biz foydalanuvchi kiritishiga munosabat bildirmoqchimiz
Biz foydalanuvchi kiritishiga munosabat bildirmoqchimiz
Biz foydalanuvchi kiritishiga munosabat bildirmoqchimiz

Endi biz qurilmaga tugma bosishni qanday boshqarishni aytmoqchimiz. Birinchi fikr "kirish tugmasi bosilganda" kirish toifasidagi bloklardan foydalanish bo'lishi mumkin, lekin biz bundan ko'ra aniqroq boshqaruvni xohlaymiz. Biz kengaytirilgan bo'lim ostidagi boshqaruv toifasidagi "(X) dan (Y) qiymatli voqea" blokidan foydalanamiz, chunki biz bu qo'llanmada ilg'ormiz.

  • To'rtta "voqeadan …" bloklarini yarating.

    • Ulardan ikkitasi "MICROBIT_ID_BUTTON_A" voqea manbasini tekshirishi kerak.
    • Ulardan ikkitasi "MICROBIT_ID_BUTTON_B" voqea manbasini tekshirishi kerak.
    • Har bir tugma uchun mo'ljallangan ikkita hodisadan:

      • "MICROBIT_BUTTON_EVT_UP" turidagi hodisani tekshirish kerak.
      • "MICROBIT_BUTTON_EVT_DOWN" turidagi hodisani tekshirish kerak.
    • Eslatma: Barcha katta harflardagi bu variantlar pastki darajadagi micro: bit kodlarida ishlatiladigan teglardir. Ular shunchaki to'ldiruvchi bo'lib, keyinchalik kod bajariladigan ikkilikka tuzilganda tamsayılar bilan almashtiriladi. Odamlarga qaysi tamsayı qo'yish kerakligini qidirishdan ko'ra, bu teglardan foydalanish osonroq, lekin ikkalasi ham xuddi shunday ishlaydi.
  • Men uslub bo'yicha, har bir "voqeadan …" blokli qo'ng'iroqni ko'tarilgan hodisani tasvirlaydigan funktsiyani tanlashni tanladim. Menimcha, bu o'qishni yaxshilaydi. Agar kimdir buni xohlasa, ular voqeani boshqarish kodini "voqeadan …" blokiga qo'yishi mumkin.

    Eslatma: Qurilmaning hodisaga javobini ko'rib chiqadigan kodlar bloki intuitiv ravishda "hodisalarni boshqaruvchi" deb nomlanadi

  • Har bir voqea ishlov beruvchisiga boshqaruv holatini qurilmaning holatiga qarab ajratish uchun ishlatilgan xuddi shunday if-else tuzilishini asosiy holatdagi tuzilmani qo'shing.
  • Bizning diagrammada ko'rsatilganidek, qurilmaning holatini o'zgartiradigan topshiriq bloklarini qo'shing

    • Biz bilamizki, qurilma YO'LSIZ holatda bo'lsa, qurilma LISTEN_A holatiga o'tish bilan bosilgan A tugmachasiga va LISTEN_B holatiga o'tish bilan B tugmachasiga javob berishi kerak.
    • Shuningdek, biz bilamizki, LISTEN_A yoki LISTEN_B holatida, qurilma "A" tugmachasi va "B" tugmasi qo'yib yuborilgan holatga o'tishi kerak.
    • Nihoyat, biz bilamizki, qurilma TEAM_A yoki TEAM_B holatida bo'lsa, qurilma SIG_A va SIG_B translyatsiyasi orqali bosilgan A tugmachasiga va B tugmachasiga javob berishi kerak.

      Hozirgi vaqtda signal uzatish tafsilotlarini to'ldirish shart emas. Bunga keyinroq erishamiz. Eng muhimi shundaki, biz bu funktsiyalarga biz yozadigan kodni ishlatishni buyuramiz, bu harakatlar blokiga, shu vaqtda nima qilish kerakligini tasvirlaydigan, radioSignalSIG_A nomini berish

5 -qadam: Qurilma ishga tushganda, biz qurilmalar xotirasida ma'lumotlar qiymatini boshlashni xohlaymiz

Qurilma ishga tushganda, biz qurilmalar xotirasida ma'lumotlar qiymatini ishga tushirishni xohlaymiz
Qurilma ishga tushganda, biz qurilmalar xotirasida ma'lumotlar qiymatini ishga tushirishni xohlaymiz
Qurilma ishga tushganda, biz qurilmalar xotirasida ma'lumotlar qiymatini ishga tushirishni xohlaymiz
Qurilma ishga tushganda, biz qurilmalar xotirasida ma'lumotlar qiymatini ishga tushirishni xohlaymiz
Qurilma ishga tushganda, biz qurilmalar xotirasida ma'lumotlar qiymatini ishga tushirishni xohlaymiz
Qurilma ishga tushganda, biz qurilmalar xotirasida ma'lumotlar qiymatini ishga tushirishni xohlaymiz

Bu erda biz juda ko'p o'zgaruvchilardan foydalanganmiz (ma'lumotlar uchun nomlar), lekin biz bu nomlarga hech qanday qiymat bermaganmiz. Biz qurilma ishga tushganda, bu o'zgaruvchilarning barcha qiymatlarini xotiraga yuklashini xohlaymiz, shuning uchun biz bu o'zgaruvchilarning boshlanishini "ishga tushirish" blokiga joylashtiramiz.

Bu biz boshlashimiz kerak bo'lgan qadriyatlar:

  • Signal konstantalari, signal protokoli bo'yicha. Qiymatlar bo'lishi kerak:

    • SIG_R = 0
    • SIG_A = 1
    • SIG_B = 2
    • Eslatma: Men bu konstantalarga "EnumSignals" prefiksini qo'ydim, chunki bu o'zgaruvchilar xuddi Signals deb nomlangan sanab o'tilgan turga kirgandek harakat qilishlari kerak edi. Shunday qilib, bu o'zgaruvchilar boshqa dasturlash tillarida qo'llanilishi mumkin. Ro'yxatga olingan turlarning ta'rifi va izohi mening darsligim doirasidan tashqarida. Agar xohlasa, uni Googlega yuborish mumkin. Bu prefikslar stilistik tanlovdir va dasturning to'g'ri ishlashi uchun umuman zarur emas.
  • Shtat konstantalari, agar ular qiymatga ega bo'lsa, o'zboshimchalik bilan bo'lishi mumkin. Men 0 dan oshib ketadigan butun sonlarni ishlatish uchun uslubni tanladim, masalan:

    • YO'LSIZ = 0
    • LISTEN_A = 1
    • LISTEN_B = 2
    • TEAM_A = 3
    • TEAM_B = 4
    • Eslatma: Men ham bu o'zgaruvchilar uchun prefikslar haqida bir xil uslubda qaror qabul qildim. Bundan tashqari, men bu topshiriqlar, qadriyatlar va tartib haqida hamma narsa o'zboshimchalik bilan bajarilganligini eslatib o'taman. Bu qiymatlar qurilmadan qurilmaga to'g'ri kelishi muhim emas, chunki ular faqat tarmoq ichida aloqa uchun emas, balki faqat ichkarida ishlatiladi. Muhimi shundaki, o'zgaruvchilar qiymatga ega va ularni bir -biri bilan solishtirib, ularning ekvivalent yoki yo'qligini bilish mumkin.
  • O'qish uchun BOOT_STATE deb nomlangan doimiy va UNASSIGNED -ga sozlang. Bu shuni anglatadiki, biz o'zboshimchalik holatiga emas, balki yuklash holatiga qaytaramiz, chunki qurilma qayta o'rnatish signalini oladi, biz buni keyinroq amalga oshiramiz.
  • Animatsiya konstantalari, keyingi bosqichda foydalanuvchi kiritishi orqali juda past kechikishdagi uzilishlarga imkon beruvchi animatsiyalarni yaratish uchun ishlatiladi. Biz hozirgacha ulardan foydalanmaganmiz, lekin ular albatta keyingi bo'limda tushuntiriladi va ishlatiladi. Ba'zilarining ma'nosi nomlari tufayli intuitiv bo'lishi kerak.

    • TICKS_PER_FRAME_LOADING_ANIMATION = 50
    • MS_PER_DEVICE_TICK = 10
    • MS_PER_FRAME_BROADCAST_ANIMATION = 500
    • MICROSECONDS_PER_MILLISECOND = 1000
    • NUMBER_OF_FRAMES_IN_LOADING_ANIMATION = 4
  • Animatsiya uchun yana bir o'zgaruvchi, bu safar aniq bo'lmagan hisoblagich. Ko'pgina hisoblagichlar singari, biz uni 0 ga boshlaymiz

    iTickLoadingAnimation = 0

  • Animatsiya ramkalarini ushlab turish uchun ikkita o'zgaruvchini yarating. Men "yuklash animatsiyasi" deb ataydigan birinchi rasmda to'rtta tasvir bo'lishi kerak (siz buni oxirgi doimiy ishga tushirish paytida taxmin qilgan bo'lishingiz mumkin), ikkinchisida men "translyatsiya animatsiyasi" deb atayman, unda uchta tasvir bo'lishi kerak. Men o'zgaruvchilarni animatsiya ramkalariga mos ravishda nomlashni tavsiya qilaman, masalan. ringAnimation0, ringAnimation1…

    Men qilgan tasvir qiymatlarini yarating yoki ko'proq original va sovuq tasvirlarni yarating

  • Oxir -oqibat, biz "radio guruhi (X)" blokidan foydalanib, qurilmaning radio guruhini 0 ga o'rnatishimiz kerak
  • Ixtiyoriy ravishda, ketma -ket chiqishga "Boshlanish tugallandi" xabarini yozing, shunda foydalanuvchiga hamma narsa bemalol o'tdi.
  • Endi biz qurilmani o'rnatishni tugatganimizdan so'ng, biz o'z holatimiz loop funktsiyasini chaqira olamiz.

6 -qadam: 5 x 5 LED displey yordamida animatsiya va grafikani ko'rsatmoqchimiz

Biz 5 x 5 LED displey yordamida animatsiya va grafikani ko'rsatmoqchimiz
Biz 5 x 5 LED displey yordamida animatsiya va grafikani ko'rsatmoqchimiz
Biz 5 x 5 LED displey yordamida animatsiya va grafikani ko'rsatmoqchimiz
Biz 5 x 5 LED displey yordamida animatsiya va grafikani ko'rsatmoqchimiz
Biz 5 x 5 LED displey yordamida animatsiya va grafikani ko'rsatmoqchimiz
Biz 5 x 5 LED displey yordamida animatsiya va grafikani ko'rsatmoqchimiz

Va endi butunlay boshqacha.

Biz bir nechta animatsiya va bir nechta belgilarni ko'rsatmoqchimiz, lekin biz asosiy holat tsiklini to'xtatishni xohlamaymiz. Afsuski, tasvir va matn satrlarini ko'rsatadigan bloklar sukut bo'yicha 400 ms kechikishga ega. Buni kodning javascript tasvirini tahrir qilmasdan o'zgartirishning iloji yo'q. Shunday qilib, biz nima qilamiz.

  • Har bir tasvir uchun funktsiyani yarating. Bu har safar javascriptni tahrir qilish o'rniga tasvirni ko'rsatish uchun bitta blokdan foydalanishga imkon beradi. Ushbu maxsus dasturda hech qanday tasvir bir necha marta ishlatilmaydi, lekin menimcha, bu uslub kodni o'qishni osonlashtiradi.
  • Har bir yangi funksiyada "X tasvirini (X) ofset 0 da" blokini qo'shing, unga mos keladigan tasvir o'zgaruvchisi nomi (X) o'rnini bosadi.
  • Asosiy holat tsikliga qo'shing. "Belgilangan satr (X)" bloklari har bir blokda, BOShQASIZ holatni boshqaradigan blokdan tashqari. Qurilmaning har xil holatini ko'rsatish uchun unga belgi qo'shing. Mana nima qildim:

    • LISTEN_A: "a"
    • LISTEN_B: "b"
    • TEAM_A: "A"
    • TEAM_B: "B"

      UNASSIGNED holati uchun yuklash animatsiyasini yangilaydigan funktsiyaga qo'ng'iroq qiling. Bu funksiya tafsilotlarini quyida to'ldiramiz

  • JavaScript rejimiga o'ting.
  • X.showImage (0) va basic.showString (X) ga har bir qo'ng'iroqni toping.
  • Har birini X.showImage (0, 0) yoki basic.showString (X, 0) ga o'zgartiring.

    • Bu qo'shimcha dalil qo'shilsa, harakatdan keyingi kechikish 0 ga o'rnatiladi. Odatiy bo'lib, bu chetda qoladi va har bir blok bajarilgandan so'ng, qurilma 400 ms to'xtaydi.
    • Endi biz o'z rasmlarimizni animatsion bloklarimizda ko'rsatish uchun deyarli kechiktirmaydigan mexanizmga egamiz

Birinchidan, biz nisbatan oddiy translyatsiya animatsiyasi funktsiyasini quramiz. Bu oddiyroq, chunki biz foydalanuvchining funksiya tugamaguncha hech narsa qila olishini xohlamaymiz, shuning uchun ularni efirga uzatishni to'xtatish uchun. Buni amalga oshirish uchun, biz funktsiyani bajargunga qadar, nazorat oqimini blokda ushlab turishimiz mumkin, bu odatiy xatti -harakatlar.

  • Animatsiyani ko'rsatadigan funktsiyani yarating.
  • Bu blok ichida ko'rsatiladigan tartibda animatsiyaning har bir ramkasiga bittadan uchta funktsional qo'ng'iroq qo'shing
  • Har bir qo'ng'iroqdan keyin tasvirni ko'rsatish funktsiyasiga "kutish (biz) (X)" blokini qo'shing.

    Eslatma: Kengaytirilgan boshqaruv bo'limidagi bu blok "pauza (ms)" dan ham oshib ketadi, chunki u belgilangan vaqt o'tguncha protsessorni to'liq muzlatib qo'yadi. To'xtatish bloki ishlatilganda, qurilma boshqa vazifalarni sahna ortida bajarishi mumkin. Kutish bloki bilan bu mumkin emas

  • [X] ni (MS_PER_FRAME_BROADCAST_ANIMATION x MICROSECONDS_PER_MILLISECOND) bilan almashtiring
  • Endi animatsiya to'g'ri ishlashi kerak

Ikkinchidan, biz yuklash animatsiyasini ko'rsatish mexanizmini quramiz. Buning asosiy maqsadi LED displeyini MS_PER_DEVICE_TICK o'zgaruvchisida aniqlangan vaqt oralig'ida yangilashdir. Bu qiymat, qurilma belgisining uzunligi - holat tsiklining har bir iteratsiyasini tugatgandan so'ng, qurilma to'xtatib turadigan millisekundlar soni. Bu qiymat etarlicha kichik bo'lgani uchun, biz displeyni har bir takrorlash paytida bir marta yangilay olamiz va foydalanuvchiga animatsiya muammosiz ketayotgani ko'rinadi va holat o'zgarganda, foydalanuvchi kiritishi o'rtasida juda oz kechikish bo'ladi. displey yangilanmoqda. ITickLoadingAnimation o'zgaruvchisida bajariladigan shomillarni sanab, biz animatsiyaning tegishli ramkasini ko'rsatishimiz mumkin.

  • Yuklanadigan animatsiyani yangilaydigan funktsiyani yarating
  • Shomil taymerining maksimal qiymatiga yetganligini tekshirish uchun shart qo'shing. Shart hisoblagichining qiymati yuklash animatsiyasidagi ramkalar sonidan kattaroq bo'lsa, har bir kadrni ko'rsatish uchun bu shart to'g'ri bo'ladi.

    Agar shart to'g'ri bo'lsa, iTickLoadingAnimation -ni 0 ga qaytaring

  • If-else shartlari blokini qo'shing. Bu animatsiyaning qaysi ramkasini ko'rsatish kerakligini aniqlaydi.

    Animatsiyaning har bir ramkasi uchun, agar belgi hisoblagichi har bir animatsiyadagi belgi sonidan ko'p bo'lsa, animatsiyaning ramka raqamiga ko'paytiriladi (1dan boshlanadi), keyin bu kadrni ko'rsating, aks holda keyingi ramka mos kelishini tekshiring. ko'rsatilishi

  • Blokning pastki qismida iTickLoadingAnimation -ni oshiring
  • Endi animatsiya to'g'ri ishlashi kerak

Eslatma: Mening misolimda ko'rinadigan barcha kulrang bloklar blokning javascript tasvirini tahrir qilganda hosil bo'ladi. Bu shuni anglatadiki, blok javascript kodini ifodalaydi, uni standart bloklar to'plami yordamida ko'rsatish mumkin emas va ularni matn shaklida tahrir qilish kerak.

7 -qadam: Qurilmaning radiosi yordamida ma'lumotlarni simsiz uzatishni xohlaymiz

Qurilmaning radiosi yordamida ma'lumotlarni simsiz uzatishni xohlaymiz
Qurilmaning radiosi yordamida ma'lumotlarni simsiz uzatishni xohlaymiz

Bu qadam avvalgisiga qaraganda ancha qisqa. Aslida, bu butun darslikdagi eng qisqa qadamdir.

Eslatib o'tamiz, biz qurilmaning foydalanuvchi kiritishiga javobini dasturlashtirganimizda, menda ekran tasvirida ikkita bo'lim bor edi, bu bo'limda tushuntirilmagan. Bu radio orqali signal yuboradigan funktsiyalarga qo'ng'iroqlar edi. Aniqroq aytganda:

  • A tugmasi bosildi:

    • Agar qurilma TEAM_A holatida bo'lsa:

      Eshittirish signali SIG_A

  • B tugmasi bosildi:

    • Agar qurilma TEAM_B holatida bo'lsa

      Eshittirish signali SIG_B

Agar ular mavjud bo'lmasa, bu funktsiyalarni yarating.

Har bir funktsiyada:

  • Animatsiya funksiyasini chaqiring. Bu MS_PER_FRAME_BROADCAST_ANIMATION * 3 = 1,5 sekund ichida bo'ladigan boshqa ishni bajarishga to'sqinlik qiladi. Animatsiyada uchta kadr borligi uchun doimiy uchtaga ko'paytiriladi. Bu o'zboshimchalik va agar estetik yangilanish etarlicha katta bo'lsa, uni qo'shish mumkin. Ushbu animatsiyaning ikkinchi maqsadi - foydalanuvchining translyatsiya funktsiyasini spam qilishiga yo'l qo'ymaslik.
  • "Radio yuborish raqami (X)" blokini qo'shing, bu erda funktsiya nomida ko'rsatilgan doimiy signal

Bu faqat radio orqali efirga uzatilishi kerak.

8 -qadam: Biz qurilma radiosi orqali ma'lumotlarni tinglashni va olishni xohlaymiz va shunga mos ravishda qayta ishlaymiz

Biz qurilma radiosi orqali ma'lumotlarni tinglashni va olishni xohlaymiz va shunga mos ravishda qayta ishlaymiz
Biz qurilma radiosi orqali ma'lumotlarni tinglashni va olishni xohlaymiz va shunga mos ravishda qayta ishlaymiz
Biz qurilma radiosi orqali ma'lumotlarni tinglashni va olishni xohlaymiz va shunga mos ravishda qayta ishlaymiz
Biz qurilma radiosi orqali ma'lumotlarni tinglashni va olishni xohlaymiz va shunga mos ravishda qayta ishlaymiz

Bu asosiy dasturni yaratishning oxirgi bosqichi.

Biz qurilmaga kiruvchi radio signallarni qanday ishlashni aytamiz. Birinchidan, bizning qurilmamiz qabul qilingan signalni nomlaydi. Keyin, bu signalning qiymatiga asoslanib, agar mavjud bo'lsa, qanday harakat qilish kerakligini hal qiladi.

Birinchisi:

  1. "Radio qabul qilingan (X)" blokidan boshlanadigan kodlar blokini yarating.
  2. Ixtiyoriy ravishda, qabul qilingan qiymatni tavsiflovchi nomli boshqa o'zgaruvchiga tayinlang.
  3. Signalni qayta ishlaydigan funktsiyani chaqiring

Ikkinchidan, signalni qayta ishlash funktsiyasida:

  1. Signalning qiymatiga qarab tarmoqni boshqaradigan if-else iboralar blokini yarating.
  2. Agar signal SIG_R bo'lsa

    Qurilmaning holatini BOOT_STATE ga o'rnating (shuning uchun biz bu konstantani avvalroq yaratganmiz)

  3. Agar signal SIG_A bo'lsa va hozirgi holat LISTEN_A bo'lsa

    Qurilmaning holatini TEAM_A ga o'rnating

  4. Agar signal SIG_B bo'lsa va hozirgi holat LISTEN_B bo'lsa

    Qurilmaning holatini TEAM_B ga o'rnating

Bo'ldi shu. Ariza tugadi.

9 -qadam: Ildiz qurilmasi: Biz signal tanlash imkoniyatiga ega bo'lishni xohlaymiz

Ildiz qurilmasi: Biz signal tanlash imkoniyatiga ega bo'lishni xohlaymiz
Ildiz qurilmasi: Biz signal tanlash imkoniyatiga ega bo'lishni xohlaymiz

Endi biz "root" qurilmasi, ya'ni tarmoqni boshqaradigan qurilma uchun oddiy dastur yozamiz.

Ushbu qurilma ikkita funktsiyani bajarishi kerak:

  • Biz foydalanuvchiga signallarimizdan birini tanlashiga ruxsat bermoqchimiz
  • Biz foydalanuvchiga signalni uzatishga ruxsat bermoqchimiz

Ushbu ilovaning tavsifi avvalgisining kichik qismi bo'lganligi sababli, men umumiy nuqtai nazarni beraman, lekin men avvalgidek tafsilotlarga bormayman. Yuqoridagi rasmda ushbu dastur uchun to'liq kod mavjud.

Foydalanuvchiga signal tanlashiga ruxsat berish uchun:

  1. "Ishga tushirish" blokida 5 o'zgaruvchini ishga tushiring:

    1. Uchta signal (0, 1, 2)
    2. Signallar soni (3)
    3. Tanlangan signalni ushlab turish uchun o'zgaruvchi (dastlab birinchi signalga o'rnatilgan, 0)
  2. A tugmachasini bosing:

    1. Tanlangan signalni oshiring
    2. Tanlangan signal signallar sonidan kattami yoki tengligini tekshiring

      Agar shunday bo'lsa, tanlangan signalni 0 ga o'rnating

  3. Ishga tushirish blokidan so'ng, tanlangan signal qiymatini kechiktirmasdan ko'rsatadigan "abadiy" tsiklni ishga tushiring

Foydalanuvchiga signal uzatishga ruxsat berish uchun

  1. "Ishga tushirish" blokida radio guruhini 0 ga o'rnating
  2. B tugmachasini bosing:

    Tanlangan signalni "radio yuborish raqami (X)" bloki yordamida tarqatish

Bo'ldi shu. Ildiz tugunini qo'llash juda oddiy.

10 -qadam: Biz tugatdik

Biz tugatdik
Biz tugatdik

Yuqorida dastur bilan ishlaydigan qurilmalar tasviri. O'ngdagi ikkitasi asosiy "foydalanuvchi" ilovasini, chapda esa "root" ilovasini ishga tushiradi.

Men bu o'yinni CS Connections 2018da, o'rta va o'rta maktab o'qituvchilari uchun bir haftalik yozgi konferentsiyada, informatika ta'limi bo'yicha namoyish qildim. O'qituvchilarga 40 ga yaqin qurilmani berdim va qoidalarni tushuntirdim. Ko'pchilik o'yinni ko'ngilochar, ko'pchilik esa qanday o'ynashni tushunmaguncha chalkash deb topdi. Namoyish qisqa edi, lekin biz o'yin juda xilma -xil odamlar orasida qiziqarli bo'lganini topdik.

CS Connections 2018 haqida ko'proq ma'lumotni bu erda topishingiz mumkin.

Tavsiya: