Turinys:

Tinklo varžybos: „BBC Micro“mažo vėlavimo žaidimas: bitas: 10 žingsnių (su nuotraukomis)
Tinklo varžybos: „BBC Micro“mažo vėlavimo žaidimas: bitas: 10 žingsnių (su nuotraukomis)

Video: Tinklo varžybos: „BBC Micro“mažo vėlavimo žaidimas: bitas: 10 žingsnių (su nuotraukomis)

Video: Tinklo varžybos: „BBC Micro“mažo vėlavimo žaidimas: bitas: 10 žingsnių (su nuotraukomis)
Video: ЗАПРЕЩЁННЫЕ ТОВАРЫ с ALIEXPRESS 2023 ШТРАФ и ТЮРЬМА ЛЕГКО! 2024, Lapkritis
Anonim
Tinklo varžybos: mažos delsos žaidimas „BBC Micro: bit“
Tinklo varžybos: mažos delsos žaidimas „BBC Micro: bit“
Tinklo varžybos: mažos delsos žaidimas „BBC Micro: bit“
Tinklo varžybos: mažos delsos žaidimas „BBC Micro: bit“

Šioje pamokoje paaiškinsiu, kaip „BBC micro: bit“įdiegti pagrindinį kelių žaidėjų žaidimą su šiomis funkcijomis:

  • Paprasta sąsaja
  • Mažas vėlavimas tarp mygtukų paspaudimų ir ekrano atnaujinimų
  • Lankstus dalyvių skaičius
  • Lengvas žaidimo valdymas naudojant pagrindinį nuotolinį („root“) įrenginį

Žaidimas iš esmės yra politikos imitacija. Visi žaidėjai, išskyrus du žaidėjus, pradeda nepriskirti jokiai komandai. Vienas iš šių žaidėjų priskiriamas A komandai, o kitas - B komandai.

Žaidimo tikslas, kad kiekvienas žaidėjas būtų komandoje su dauguma žaidėjų tuo metu, kai visi yra atsivertę.

Aukščiau pateikta schema iliustruoja baigtinės būsenos mašiną, t. Y. Būsenų, kuriose gali būti įrenginys, specifikacijas ir perėjimus tarp šių būsenų.

Būsena gali būti laikoma dabartiniu duomenų rinkiniu, apibūdinančiu įrenginio atmintį nuo jo įjungimo. Remdamasis šiais duomenimis, įrenginys gali atlikti tam tikrus veiksmus arba kitaip reaguoti į vartotojo įvestį.

Perėjimas yra logiška sąlyga, dėl kurios, kai tai tiesa, prietaisas keičia savo būseną. Perėjimas gali būti iš vienos būsenos į bet kurią kitą. Valstybė gali turėti kelis perėjimus.

Aukščiau pateikta diagrama nurodo šias būsenas:

  • Nepaskirtas
  • Klausyk A.
  • Klausyk B.
  • A komanda
  • B komanda

Įrenginys, kuriame veikia žaidimo kodas, gali būti bet kurioje iš šių penkių būsenų, bet tik vienu metu ir tik šiomis penkiomis.

Visame vadove darysiu prielaidą, kad naudojate „Microsoft“„MakeCode“redaktorių, kurį galite rasti adresu

Visą žaidimo įgyvendinimą rasite čia:

makecode.microbit.org/_CvRMtheLbRR3 („microbit-demo-user“yra projekto pavadinimas)

Pagrindinio („root“) tinklo valdiklio įgyvendinimą rasite čia:

makecode.microbit.org/_1kKE6TRc9TgE („microbit-demo-root“yra projekto pavadinimas)

Aš paminėsiu šiuos pavyzdžius visoje savo pamokoje.

1 žingsnis: apsvarstykite didelį paveikslėlio dizainą

Prieš rašydami bet kokį kodą, turime pagalvoti, kaip norime, kad atrodytų mūsų galutinis produktas. kitaip tariant, kokie yra programos reikalavimai? Ką mūsų kodas turėtų nurodyti įrenginiui daryti, kai jis bus baigtas? Aš suskirstiau pagrindinės programos funkcionalumą į šešias kategorijas, į kiekvieną iš jų galima atsižvelgti skirtingu dizaino požiūriu.

  1. Norime valdyti įrenginio veiksmus pagal esamą būseną
  2. Norime, kad įrenginys reaguotų į vartotojo įvestį
  3. Galbūt norime rodyti animaciją ir grafiką naudodami 5 x 5 LED ekraną
  4. Mes norime inicijuoti duomenų reikšmes įrenginio atmintyje, kai įrenginys paleidžiamas
  5. Mes norime perduoti duomenis belaidžiu būdu, naudodami įrenginio radiją
  6. Mes norime klausytis ir gauti duomenis per prietaiso radiją ir atitinkamai juos apdoroti

Leiskite man šiek tiek išsamiau papasakoti apie kiekvieną.

1. Norime valdyti įrenginio veiksmus pagal esamą būseną

Kaip ir dauguma kitų programų, kodo nurodymų vykdymas vyksta viena eilute. Norime, kad mūsų įrenginys vykdytų tam tikras instrukcijas, atsižvelgdamas į vidinę būseną, kaip parodyta diagramoje šios pamokos viršuje. Po kiekvieno kodo bloko, kuris tikrina, kaip turėtų veikti įrenginys, galėtume parašyti sąlyginę seriją, tačiau šis požiūris gali labai greitai sutrikti, todėl naudosime begalinę kilpą, kuri paprasčiausiai patikrina vieną kintamąjį ir remiasi tuo kintamuoju, vykdo konkretų nurodymų rinkinį arba nieko nedaro. Šis kintamasis bus identifikuojamas pagal priesagą „_state“tiek mūsų, tiek pagrindinėje programoje.

2. Norime, kad įrenginys reaguotų į vartotojo įvestį

Nepaisant įprasto kodo vykdymo, vykstančio nuosekliai, tai yra, viena eilute, mes turime, kad mūsų įrenginys reaguotų į mygtukų paspaudimus, o pagrindinė būsenos kilpa nustato, ką prietaisas turėtų daryti bet kuriuo momentu. Tuo tikslu įrenginys gali siųsti signalus į žemesnio lygio programinę įrangą, kuri sąveikauja su aparatine įranga, sukeldama tai, kas vadinama įvykiu. Galime parašyti kodą, kuris liepia įrenginiui ką nors padaryti, kai jis aptinka tam tikro tipo įvykį.

3. Mes norime rodyti animaciją ir grafiką naudodami 5 x 5 LED ekraną

Atrodo, kad tai padaryti paprasta, tačiau blokas parodo vaizdą, o paslėptas 400 ms delsimas. Kadangi norime, kad mūsų įrenginys ir toliau vykdytų būsenos ciklą su kuo mažesniu vėlavimu, turėsime redaguoti „JavaScript“kodą, kad sumažintume vėlavimą.

4. Mes norime inicijuoti duomenų reikšmes įrenginio atmintyje, kai įrenginys paleidžiamas

Kad mūsų įrenginys nieko nedarytų, programa turi įkelti savo duomenis į atmintį. Tai apima nuolatinius kintamuosius, pavadintus kodo įskaitomumu, kintamuosius, kuriuose yra vaizdų, kurie gali būti animacijos dalis, ir skaitiklius, kurių tinkamam veikimui reikia pradėti nuo 0. Galų gale gausime ilgą kintamųjų pavadinimų sąrašą ir jų naujai priskirtas reikšmes. Pasirinkdamas asmeninį stilių, pažymėsiu pastovias vertes, t. Y. Vertybes, kurių man niekada nereikės keisti, naudojant ALL_CAPS. Aš taip pat pridedu pagrindinių kintamųjų identifikatorius su kategorijos pavadinimu, kuris nurodo tam tikrą objektą ar tipą, kuriam priklauso identifikatorius. Taip bandoma palengvinti kodo sekimą. Niekada nenaudosiu kintamojo pavadinimo, pvz., „Elementas“arba „x“, dėl dviprasmybių, kylančių bandant iššifruoti kodą.

5. Mes norime perduoti duomenis belaidžiu ryšiu, naudodami prietaiso radiją

Tai iš tikrųjų yra gana paprasta užduotis naudojant „MakeCode“blokų kalbą. Tiesiog įkrovos metu visus įrenginius nustatome į tą pačią radijo grupę, o tada, kai norime siųsti signalą, galime perduoti vieną numerį į mums pateiktą bloką „Radijo siuntimo numeris“. Svarbu, kad siuntėjas ir gavėjas dirbtų toje pačioje radijo grupėje, nes jei ne, jie siunčia arba gauna skirtingais dažniais, o ryšys bus nesėkmingas.

6. Mes norime klausytis ir gauti duomenis per prietaiso radiją ir atitinkamai juos apdoroti

Atsižvelgdami į tuos pačius dalykus, kaip ir ankstesnis elementas, mes klausysimės gaunamų perdavimų taip pat, kaip ir vartotojo įvesties: su įvykių tvarkytoju. Parašysime kodo bloką, kuris išnagrinės visus gaunamus signalus ir patikrins, ar reikia imtis kokių nors veiksmų netrikdant pagrindinės būsenos kilpos.

Be to, turėtume trumpai apsvarstyti kur kas paprastesnės šakninės programos, programos, kuri leis įrenginiui valdyti visą tinklą, dizainą. Aš tam neskiriu daug laiko, nes jis yra daug paprastesnis nei aukščiau pateiktas dizainas, o didžioji jo dalis yra tiesiog kartojimas. Aš suskirstiau šaknies deice funkcionalumą į tris kategorijas.

  1. Mes norime, kad galėtume pasirinkti signalą
  2. Mes norime perduoti signalą

-

1. Mes norime, kad galėtume pasirinkti signalą

Tai galima padaryti tiesiog paspaudus mygtuką, kuris pakartoja galimus signalus. Kadangi jų yra tik trys, šio metodo pakaks. Tuo pačiu metu mes galime turėti ciklą, kuris nuolat iš naujo rodo pasirinktą signalą, leidžiantį vartotojui paspausti mygtuką ir pamatyti, kad pasirinktas signalas rodomas LED ekrane labai nedaug.

2. Mes norime, kad galėtume perduoti signalą

Kadangi yra du mygtukai, vieną galime pasirinkti pasirinkimui, o kitą patvirtinti. Kaip ir vartotojo programa, mes tiesiog siunčiame signalą tinklu kaip skaičių. Kitos informacijos nereikia.

Daugiau apie paprastą signalo protokolą kalbėsiu kitame skyriuje.

2 žingsnis: Signalo protokolas: paprasta tinklo komunikacijos kalba

Toliau pateikiami signalai gali būti laikomi visų galimų žodžių rinkiniu, kuriuo prietaisai gali kalbėtis tarpusavyje. Kadangi tinklas yra toks paprastas, nėra daug ką pasakyti, todėl šiuos tris signalus galime pavaizduoti paprastomis sveikų skaičių reikšmėmis.

0. Atstatyti

  • Identifikatorius kode: SIG-R
  • Sveikasis skaičius: 0
  • Tikslas: liepkite visiems veikimo zonoje esantiems įrenginiams atsisakyti to, ką jie daro, ir elgtis taip, lyg jie būtų tik paleisti. Jei šis signalas pasiekia kiekvieną tinklo įrenginį, visas tinklas bus atstatytas ir vartotojai galės pradėti naują žaidimą. Šį signalą gali transliuoti tik šakninis įrenginys.

1. Konversija A

  • Identifikatorius kode: SIG-A
  • Sveikasis skaičius: 1
  • Tikslas: liepkite bet kuriam įrenginiui, kuris yra LISTEN_A būsenoje, kai tik jie gauna konversijos signalą, perjungti į būseną TEAM_A.

2. Konversija B

  1. Identifikatorius kode: SIG-B
  2. Sveikasis skaičius: 2
  3. Tikslas: liepkite bet kuriam įrenginiui, kurio būsena yra LISTEN_B, kai tik jie gauna konversijos signalą, perjungti į būseną TEAM_B.

3 veiksmas: norime valdyti įrenginio veiksmus pagal jo dabartinę būseną

Mes norime valdyti įrenginio veiksmus pagal esamą būseną
Mes norime valdyti įrenginio veiksmus pagal esamą būseną
Norime valdyti įrenginio veiksmus pagal esamą būseną
Norime valdyti įrenginio veiksmus pagal esamą būseną
Mes norime valdyti įrenginio veiksmus pagal esamą būseną
Mes norime valdyti įrenginio veiksmus pagal esamą būseną

Pagaliau galime pradėti rašyti kodą.

Pirmiausia atidarykite naują projektą „Make Code“

  • Sukurkite naują funkciją. Aš paskambinau „mine loop“, nes tai yra pagrindinė programos kilpa
  • Pridėkite ciklo bloką, kuris kartosis neribotą laiką. Aš naudoju (tiesa), nes pažodinė tiesa niekada nebus klaidinga, todėl programos valdymo srautas niekada neišeis iš ciklo
  • Pridėkite pakankamai „if-else“blokų, kad patikrintumėte, ar įrenginys yra bet kurioje iš penkių galimų būsenų
  • Sukurkite kintamąjį, kad išlaikytumėte dabartinę įrenginio būseną
  • Sukurkite kintamuosius, vaizduojančius kiekvieną iš penkių galimų būsenų

    Pastaba: Gerai, kad šiems kintamiesiems dar nėra priskirtų verčių. Mes prie to prieisime. Šiuo metu svarbiau, kad rašytume švarų, lengvai skaitomą kodą

  • Pakeiskite kiekvieną „if-else“bloko sąlygą, kad palygintumėte dabartinę būseną su viena iš galimų būsenų
  • „If-else“blokų apačioje pridėkite pauzę tam tikram milisekundžių skaičiui ir sukurkite kintamąjį šiam skaičiui išlaikyti. Mes jį inicijuosime vėliau. Įsitikinkite, kad kintamasis turi aprašomąjį pavadinimą, pvz., Erkę ar širdies plakimą. Kadangi tai yra pagrindinė įrenginio kilpa, ši pauzė lems greitį, kuriuo įrenginys vykdo pagrindinę kilpą, todėl ji yra labai svarbi vertė ir yra per svarbi, kad būtų stebuklingas skaičius be pavadinimo.

Pastaba: nesijaudinkite dėl pilkų blokų trečiame paveikslėlyje. Aš prie jų eisiu vėliau.

4 žingsnis: norime reaguoti į vartotojo įvestį

Norime reaguoti į vartotojo įvestį
Norime reaguoti į vartotojo įvestį
Mes norime reaguoti į vartotojo įvestį
Mes norime reaguoti į vartotojo įvestį

Dabar norime pasakyti įrenginiui, kaip valdyti mygtukų paspaudimus. Pirma mintis gali būti tiesiog įvesties kategorijoje naudoti blokus „Kai mygtukas yra paspaustas“, tačiau mes norėtume daugiau detalių valdymo. Mes naudosime „on event from (X) with value (Y)“bloką iš valdymo kategorijos išplėstiniame skyriuje, nes šioje pamokoje esame pažengę.

  • Sukurkite keturis blokus „apie įvykį iš…“.

    • Du iš jų turėtų patikrinti įvykio šaltinį „MICROBIT_ID_BUTTON_A“
    • Du iš jų turėtų patikrinti įvykio šaltinį „MICROBIT_ID_BUTTON_B“
    • Iš dviejų įvykių, taikomų pagal kiekvieną mygtuką:

      • Reikėtų patikrinti „MICROBIT_BUTTON_EVT_UP“tipo įvykį
      • Reikėtų patikrinti „MICROBIT_BUTTON_EVT_DOWN“tipo įvykį
    • Pastaba: šios didžiosiomis raidėmis pateiktos parinktys yra etiketės, naudojamos žemesnio lygio mikro: bitų kode. Jie yra tiesiog vietos rezervavimo ženklai, kurie vėliau pakeičiami sveikais skaičiais, kai kodas surenkamas į vykdomąjį dvejetainį failą. Žmonėms lengviau naudoti šias etiketes nei ieškoti, kurį sveikąjį skaičių įdėti, nors abu veiks vienodai.
  • Stiliaus reikalais pasirinkau, kad kiekvienas „on event from…“blokas iškviestų funkciją, apibūdinančią iškeltą įvykį. Nors tai nėra būtinai būtina, mano nuomone, tai pagerina skaitomumą. Jei kas nors to nori, jie gali įterpti įvykių apdorojimo kodą į bloką „on event from…“.

    Pastaba: kodo blokas, kuris tvarko įrenginio atsaką į įvykį, intuityviai vadinamas „įvykių tvarkytoju“

  • Kiekviename įvykių tvarkytuvėje pridėkite tą pačią „jei-kitaip“struktūrą, naudojamą valdymo srautui padalyti pagal įrenginio būseną, kaip ir pagrindinės būsenos ciklo struktūrą.
  • Pridėkite priskyrimo blokus, kurie keičia tą įrenginio būseną, kaip nurodyta mūsų būsenos diagramoje

    • Mes žinome, kad kai įrenginys yra būsenoje UNASSIGNED, įrenginys turėtų reaguoti į mygtuką A, kurį paspaudžia perėjimas į būseną LISTEN_A, ir į mygtuką B, kurį paspaudžia perėjimas į būseną LISTEN_B
    • Mes taip pat žinome, kad kai įrenginys yra LISTEN_A arba LISTEN_B būsenoje, įrenginys turėtų reaguoti į atitinkamai atleistą mygtuką A ir mygtuką B, atitinkamai grįždamas į būseną UNASSIGNED.
    • Galiausiai, mes žinome, kad kai įrenginys yra TEAM_A arba TEAM_B būsenoje, įrenginys turėtų reaguoti į paspaustą mygtuką A ir mygtuką B, atitinkamai transliuojant SIG_A ir transliuojant SIG_B.

      Šiuo metu nebūtina užpildyti transliavimo signalų informacijos. Prie to pasieksime vėliau. Svarbu tai, kad mes nurodome šioms funkcijoms naudoti kodą, kurį mes parašysime, suteikdami tam veiksmų blokui pavadinimą, pvz., „BroadcastSignalSIG_A“, kuriame aprašoma, ką reikia daryti tuo metu

5 veiksmas: norime inicijuoti duomenų reikšmes įrenginių atmintyje, kai įrenginys įkeliamas

Mes norime inicijuoti duomenų vertes įrenginių atmintyje, kai įrenginys paleidžiamas
Mes norime inicijuoti duomenų vertes įrenginių atmintyje, kai įrenginys paleidžiamas
Mes norime inicijuoti duomenų vertes įrenginių atmintyje, kai įrenginys paleidžiamas
Mes norime inicijuoti duomenų vertes įrenginių atmintyje, kai įrenginys paleidžiamas
Mes norime inicijuoti duomenų vertes įrenginių atmintyje, kai įrenginys paleidžiamas
Mes norime inicijuoti duomenų vertes įrenginių atmintyje, kai įrenginys paleidžiamas

Šiuo metu mes naudojome daug kintamųjų (duomenų pavadinimų), tačiau iš tikrųjų tiems vardams neskyrėme reikšmių. Mes norime, kad įrenginys įkrautų visų šių kintamųjų reikšmes į atmintį, kai jis paleidžiamas, todėl šių kintamųjų inicializaciją dedame į „įjungimo“bloką.

Šios vertės turime inicijuoti:

  • Signalo konstantos pagal signalo protokolą. Vertės TURI būti:

    • SIG_R = 0
    • SIG_A = 1
    • SIG_B = 2
    • Pastaba: prieš šias konstantas pridėjau „EnumSignals“, norėdamas pažymėti, kad šie kintamieji turi elgtis taip, tarsi jie būtų išvardyto tipo, vadinamo signalais, dalis. Taip šie kintamieji gali būti įdiegti kitomis programavimo kalbomis. Išvardytų tipų apibrėžimas ir paaiškinimas nepatenka į mano vadovo sritį. Galima panardinti į „Google“, jei jie to nori. Šie priešdėliai yra tiesiog stilistiniai pasirinkimai ir visai nėra būtini tinkamam programos veikimui.
  • Būsenos konstantos, kurios gali būti savavališkos, jei jos turi vertę. Aš padariau stiliaus pasirinkimą tiesiog naudoti sveikus skaičius didėjančiu nuo 0, pavyzdžiui:

    • NEPASKIRTAS = 0
    • LISTEN_A = 1
    • LISTEN_B = 2
    • TEAM_A = 3
    • TEAM_B = 4
    • Pastaba: Aš priėmiau tą patį stiliaus sprendimą ir dėl šių kintamųjų priešdėlių. Be to, paminėsiu, kad viskas, kas susiję su šiomis užduotimis, vertybėmis ir tvarka, yra visiškai savavališka. Net nesvarbu, kad šios vertės yra vienodos įvairiuose įrenginiuose, nes jos naudojamos tik viduje, o ne komunikacijai tinkle. Svarbu tik tai, kad kintamieji turi vertę ir kad juos galima palyginti vienas su kitu, kad pamatytumėte, ar jie yra lygiaverčiai, ar ne.
  • Kad būtų lengviau skaityti, konstanta vadinama BOOT_STATE ir nustatykite ją UNASSIGNED. Tai daro tai, kad mes atstatome į įkrovos būseną, o ne į savavališkesnę būseną, aiškiau, kai įrenginys gauna atstatymo signalą, kurį įgyvendinsime vėliau.
  • Animacijos konstantos, naudojamos atliekant šį veiksmą, norint sukurti animaciją, leidžiančią labai mažai uždelsti pertraukti vartotojo įvestį. Mes iki šiol jų nenaudojome, tačiau jie tikrai bus paaiškinti ir panaudoti kitame skyriuje. Kai kurių iš jų reikšmė turėtų būti intuityvi dėl jų pavadinimų.

    • 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
  • Kitas animacijos kintamasis, šį kartą skaitiklis, kuris tikrai nėra pastovus. Kaip ir dauguma skaitiklių, mes inicijuojame jį į 0

    iTickLoadingAnimation = 0

  • Sukurkite dvi kintamųjų serijas animacijos rėmeliams laikyti. Pirmasis, kurį aš vadinu „įkėlimo animacija“, turėtų turėti keturis vaizdus (kuriuos galbūt atspėjote paskutinį nuolatinį inicijavimą), o antrasis, kurį aš vadinu „transliacijos animacija“, kuriame turėtų būti trys vaizdai. Aš rekomenduoju įvardinti kintamuosius, kad jie atitiktų animacijos rėmus, pvz. ringAnimation0, ringAnimation1…

    Sukurkite tas pačias vaizdo vertybes kaip ir aš arba sukurkite originalesnius ir vėsesnius vaizdus

  • Paskutinis, bet ne mažiau svarbus dalykas - įrenginio radijo grupę turime nustatyti į 0, naudodami „radijo ryšio grupės (X)“bloką
  • Pasirinktinai į serijos išvestį parašykite pranešimą „Inicijavimas baigtas“, kad vartotojui pasakytumėte, jog viskas pavyko.
  • Dabar, kai baigsime įrenginio sąranką, galime iškviesti būsenos ciklo funkciją.

6 veiksmas: norime rodyti animacijas ir grafiką naudodami 5 x 5 LED ekraną

Norime rodyti animacijas ir grafiką naudodami 5 x 5 LED ekraną
Norime rodyti animacijas ir grafiką naudodami 5 x 5 LED ekraną
Mes norime rodyti animacijas ir grafiką naudodami 5 x 5 LED ekraną
Mes norime rodyti animacijas ir grafiką naudodami 5 x 5 LED ekraną
Mes norime rodyti animacijas ir grafiką naudodami 5 x 5 LED ekraną
Mes norime rodyti animacijas ir grafiką naudodami 5 x 5 LED ekraną

O dabar apie kažką visiškai kitokio.

Norime parodyti keletą animacijų ir keletą simbolių, tačiau nenorime nutraukti pagrindinės būsenos ciklo. Deja, blokų, kuriuose rodomi vaizdai ir teksto eilutės, numatytasis atidėjimas yra 400 ms. Negalima to pakeisti nepakeitus kodo „JavaScript“. Taigi, štai ką mes darysime.

  • Sukurkite funkciją kiekvienam vaizdui. Tai leis vienam vaizdui rodyti naudoti vieną bloką, o ne kiekvieną kartą redaguoti „JavaScript“. Šioje konkrečioje programoje nė vienas vaizdas nėra naudojamas daugiau nei vieną kartą, tačiau vis tiek manau, kad šis stilius palengvina kodo skaitymą.
  • Prie kiekvienos naujos funkcijos pridėkite bloką „rodyti vaizdą (X) 0 poslinkyje“ir pakeiskite atitinkamą vaizdo kintamojo pavadinimą (X)
  • Pridėkite pagrindinėje būsenos kilpoje. „Rodyti eilutę (X)“blokus kiekviename bloke, išskyrus tą, kuris tvarko būseną NEPASKIRTAS. Pridėkite simbolį, kurį prietaisas gali rodyti, kad nurodytų skirtingas jo būsenas. Štai ką aš padariau:

    • LISTEN_A: „a“
    • LISTEN_B: „b“
    • TEAM_A: „A“
    • TEAM_B: „B“

      Jei būsena NEPASKIRTA, skambinkite funkcijai, kuri atnaujins įkėlimo animaciją. Žemiau užpildysime išsamią šios funkcijos informaciją

  • Perjunkite į „javascript“režimą.
  • Raskite kiekvieną skambutį į X.showImage (0) ir basic.showString (X)
  • Pakeiskite kiekvieną į X.showImage (0, 0) arba basic.showString (X, 0)

    • Pridėjus šį papildomą argumentą, vėlavimas po veiksmo bus nustatytas į 0. Pagal numatytuosius nustatymus tai neįtraukiama, o įrenginys pristabdys 400 ms po kiekvieno iš šių blokų vykdymo.
    • Dabar mes turime beveik vėlavimo mechanizmą, kad mūsų vaizdai būtų rodomi animacijos blokuose, kuriuos dabar galime sukurti

Pirma, mes sukursime palyginti paprastą transliacijos animacijos funkciją. Tai paprasčiau, nes nenorime, kad vartotojas galėtų ką nors padaryti, kol funkcija nebus baigta, kad neleistų jiems transliuoti funkcijos šlamšto. Norėdami tai padaryti, mes galime tiesiog apriboti valdymo srautą iki bloko, kol funkcija bus baigta, o tai yra standartinis elgesys.

  • Sukurkite funkciją, kuri parodys transliacijos animaciją.
  • To bloko viduje pridėkite tris funkcijų iškvietimus, po vieną prie kiekvieno animacijos kadro, tokia tvarka, kokia jie turėtų būti rodomi
  • Po kiekvieno skambučio prie vaizdo rodymo funkcijos pridėkite bloką „laukti (mums) (X)“.

    Pastaba: Šis blokas iš išplėstinio valdymo skyriaus bus dar didesnis nei "pauzė (ms)", nes jis visiškai užšaldys procesorių, kol pasibaigs nurodytas laikas. Kai naudojamas pauzės blokas, gali būti, kad įrenginys atliks kitas užduotis už kadro. Tai neįmanoma naudojant laukimo bloką

  • Pakeisti (X) į (MS_PER_FRAME_BROADCAST_ANIMATION x MICROSECONDS_PER_MILLISECOND)
  • Animacija dabar turėtų tinkamai veikti

Antra, mes sukursime įkėlimo animacijos rodymo mechanizmą. Idėja yra atnaujinti LED ekraną tam tikru intervalu, kurį mes apibrėžiame kintamajame MS_PER_DEVICE_TICK. Ši reikšmė, įrenginio varnelės ilgis, yra milisekundžių skaičius, kurį prietaisas pristabdo, atlikęs kiekvieną būsenos ciklo iteraciją. Kadangi ši vertė yra pakankamai maža, mes galime atnaujinti ekraną vieną kartą per kiekvieną ekrano ciklo kartojimą ir vartotojui pasirodys, kad animacija vyksta sklandžiai, o būsenai pasikeitus, tarp vartotojo įvesties bus labai mažai delsos ekranas atnaujinamas. Skaičiuodami erkutes, kurias darome naudodami kintamąjį „iTickLoadingAnimation“, galime parodyti atitinkamą animacijos rėmelį.

  • Sukurkite funkciją, kuri atnaujins įkėlimo animaciją
  • Pridėkite sąlygą, kad patikrintumėte, ar erkių skaitiklis pasiekė didžiausią vertę. Ši sąlyga bus teisinga, jei erkių skaitiklio reikšmė yra didesnė nei kadrų skaičius įkėlimo animacijoje, padaugintas iš varnelių, rodančių kiekvieną kadrą, skaičiaus

    Jei sąlyga yra teisinga, iš naujo nustatykite „iTickLoadingAnimation“į 0

  • Pridėkite „if-else“sąlygų bloką. Jie nustatys, kurį animacijos rėmelį rodyti.

    Jei kiekvieno animacijos kadro metu erkių skaitiklis yra mažesnis už kiekvienos animacijos erkių skaičių, padaugintą iš animacijos kadrų skaičiaus (pradedant nuo 1), tada rodykite tą kadrą, kitaip patikrinkite, ar kitas kadras yra tas, būti rodomas

  • Bloko apačioje padidinkite „iTickLoadingAnimation“
  • Animacija dabar turėtų tinkamai veikti

Pastaba: visi mano pavyzdyje esantys pilki blokai sugeneruojami redaguojant bloko „JavaScript“vaizdą. Tai tiesiog reiškia, kad blokas reiškia „JavaScript“kodą, kurio negalima pavaizduoti naudojant standartinį blokų rinkinį ir kuris turi būti redaguojamas teksto forma.

7 žingsnis: Mes norime perduoti duomenis belaidžiu būdu, naudodami įrenginio radiją

Mes norime perduoti duomenis belaidžiu būdu, naudodami įrenginio radiją
Mes norime perduoti duomenis belaidžiu būdu, naudodami įrenginio radiją

Šis žingsnis yra daug trumpesnis nei ankstesnis. Tiesą sakant, tai tikriausiai yra trumpiausias žingsnis visoje šioje pamokoje.

Prisiminkite, kad kai užprogramavome įrenginio atsaką į vartotojo įvestį, ekrano kopijoje turėjau du blokus, kurie nebuvo paaiškinti tame skyriuje. Tai buvo skambučiai į funkcijas, kurios siunčia signalus per radiją. Konkrečiau:

  • Paspaudus mygtuką A:

    • Jei įrenginys yra TEAM_A būsenoje:

      Transliacijos signalas SIG_A

  • Paspaudus mygtuką B:

    • Jei įrenginys yra TEAM_B būsenos

      Transliacijos signalas SIG_B

Sukurkite šias funkcijas, jei jų dar nėra.

Kiekvienoje funkcijoje:

  • Paskambinkite transliacijos animacijos funkcijai. Taip bus užkirstas kelias bet kam kitam, kol jis nebus baigtas, o tai bus po MS_PER_FRAME_BROADCAST_ANIMATION * 3 = 1,5 sekundės. Konstanta padauginama iš trijų, nes animacijoje yra trys kadrai. Tai yra savavališka ir gali būti pridėta daugiau, jei estetinis atnaujinimas yra pakankamai puikus. Antrasis šios animacijos tikslas yra neleisti vartotojui šlamšti transliacijos funkcijos.
  • Pridėkite bloką „radijo siuntimo numeris (X)“, kur yra funkcijos pavadinime nurodyta signalo konstanta

Tai viskas, ką reikia transliuoti per radiją.

8 veiksmas: norime klausytis ir gauti duomenis per įrenginio radiją ir atitinkamai juos apdoroti

Mes norime klausytis ir gauti duomenis per įrenginio radiją ir atitinkamai juos apdoroti
Mes norime klausytis ir gauti duomenis per įrenginio radiją ir atitinkamai juos apdoroti
Mes norime klausytis ir gauti duomenis per įrenginio radiją ir atitinkamai juos apdoroti
Mes norime klausytis ir gauti duomenis per įrenginio radiją ir atitinkamai juos apdoroti

Tai yra paskutinis žingsnis kuriant pagrindinę programą.

Mes pasakysime įrenginiui, kaip apdoroti gaunamus radijo signalus. Pirma, mūsų įrenginys pavadins gautą signalą. Tada, remdamasi to signalo verte, jis nuspręs, kokių veiksmų imtis, jei tokių bus.

Pirmas:

  1. Sukurkite kodo bloką, prasidedantį „per radiją priimtu (X)“bloku.
  2. Pasirinktinai priskirkite tą gautą vertę kitam kintamajam su labiau apibūdinančiu pavadinimu.
  3. Iškvieskite funkciją, kuri apdoros signalą

Antra, atliekant signalų apdorojimo funkciją:

  1. Sukurkite „if-else“teiginių bloką, kuris šakoja srautą pagal signalo vertę.
  2. Jei signalas buvo SIG_R

    Nustatykite įrenginio būseną į BOOT_STATE (todėl šią konstantą sukūrėme anksčiau)

  3. Jei signalas buvo SIG_A ir dabartinė būsena yra LISTEN_A

    Nustatykite įrenginio būseną į TEAM_A

  4. Jei signalas buvo SIG_B ir dabartinė būsena yra LISTEN_B

    Nustatykite įrenginio būseną į TEAM_B

Viskas. Paraiška baigta.

9 veiksmas: šakninis įrenginys: norime sugebėti pasirinkti signalą

Šakninis įrenginys: norime sugebėti pasirinkti signalą
Šakninis įrenginys: norime sugebėti pasirinkti signalą

Dabar mes parašysime paprastą „root“įrenginio programą, tai yra, įrenginį, kuris valdys tinklą.

Šis įrenginys turės atlikti dvi funkcijas:

  • Norime leisti vartotojui pasirinkti vieną iš mūsų signalų
  • Norime leisti vartotojui transliuoti signalą

Kadangi šios programos specifikacija yra ankstesnės dalies pogrupis, pateiksiu apžvalgą, tačiau nesileisiu į tokią išsamią informaciją, kokią turėjau anksčiau. Aukščiau esančiame paveikslėlyje yra visas šios programos kodas.

Norėdami leisti vartotojui pasirinkti signalą:

  1. Inicijuokite 5 kintamuosius „paleidimo“bloke:

    1. Trys signalai (0, 1, 2)
    2. Signalų skaičius (3)
    3. Kintamasis, skirtas laikyti šiuo metu pasirinktą signalą (iš pradžių nustatytas pirmasis signalas, 0)
  2. Paspauskite A mygtuką:

    1. Padidinkite pasirinktą signalą
    2. Patikrinkite, ar pasirinktas signalas yra didesnis arba lygus signalų skaičiui

      Jei taip, nustatykite pasirinktą signalą į 0

  3. Po įjungimo bloko paleiskite „amžiną“ciklą, kuris nedelsdamas rodo dabartinę pasirinktą signalo vertę

Kad vartotojas galėtų transliuoti signalą

  1. Nustatykite radijo grupę į 0 „įjungimo“bloke
  2. Paspauskite B mygtuką:

    Transliuokite pasirinktą signalą naudodami „radijo siuntimo numerio (X)“bloką

Viskas. Šakninio mazgo taikymas yra labai paprastas.

10 žingsnis: mes baigėme

Mes baigėme
Mes baigėme

Aukščiau yra įrenginių, kuriuose veikia programa, vaizdas. Du dešinėje veikia pagrindinė „vartotojo“programa, o kairėje - „root“programa.

Šį žaidimą pademonstravau savaitės trukmės vasaros konferencijoje „CS Connections 2018“, skirtoje vidurinių ir aukštųjų mokyklų mokytojams apie informatikos ugdymą. Išdaviau mokytojams apie 40 prietaisų ir paaiškinau taisykles. Daugumai žaidimas atrodė linksmas, o daugeliui tai pasirodė painu, kol nesuvokė, kaip žaisti. Demonstracija buvo trumpa, tačiau manėme, kad žaidimas buvo malonus tarp gana įvairios minios.

Daugiau informacijos apie „CS Connections 2018“rasite čia.

Rekomenduojamas: