micro:bit – papier, kamień, nożyce – bezprzewodowo

Gra w papier, kamień, nożyce jest grą znaną przez chyba wszystkie dzieci. Dlatego nie dziwne, że jest to jeden z przykładów zaproponowany do realizacji z dziećmi.  Szukając pomysłu na zaprezentowanie możliwości micro:bit wpadłem na pomysł zrobienia tej gry, ale dla dwóch micro:bitów. Miały wykorzystywać wbudowane radio, by razem rozpocząć grę i uzgodnić wynik.

 

Realizacja okazała się dość prosta i szybka. Całość programu mieści się na jednym ekranie i co ważne – na obu microbitach jest ten sam kod. Dzięki temu można sprawdzić działanie w emulatorze. Widać, że zielony micro:bit wygrał tę rundę:

Dla niecierpliwych: zajrzyj na opublikowany projekt https://makecode.microbit.org/85196-50462-84745-75287 i ściągnij plik HEX. Wgraj go na dwa microbity i gotowe. Gdy potrząśniesz jednym microbitem oba zaczną losować jedną z alternatyw i uzgodnią rezultat.

Jak to działa – krok po kroku

Zmienna wynikStarcia przechowuje wynik pojedynku. Wartości 1,2,3 oznaczają wygraną, przegraną i remis. 0 oznacza, że pojedynek się toczy. Na początku wartość ustawiamy na -1 by nie został pokazany żaden rezultat, microbit czeka na początek.

Druga rzecz na początek – możliwe, że już korzystałeś z Bluetooth’a w Twoim micro:bicie. Może łączyłeś go z telefonem, albo z tabletem. Jednak BT nie jest jedynym protokołem radiowym jakie zna micro:bit. Drugim jest uproszczony protokół stosowany przez Nordic, producenta układu użytego w micro:bicie. Są w nim kanały (256) i każde urządzenie pracujące na danym kanale otrzymuje każdy wysłaną informację na tym kanale. Skorzystamy z tego sposobu transmisji, by micro:bity wymieniały się informacjami.

Na początku programu ustawiamy kanał przez klocek radio set group. Druga operacja to ustawienie wartości początkowej wynikStarcia na -1.

Na potrząśnięcie micro:bitem, gdy wynikStarcia jest inny niż zero (jak jest zero to znaczy że już trwa losowanie) losujemy liczbę z przedziału 0-2 (0 – papier, 1 – kamień, 2 – nożyce) i zapisujemy w zmiennej rzut. Wysyłamy nasz wynik do wszystkich micro:bitów na wybranym kanale (radio send number) i wywołujemy animację w oczekiwaniu na wynik z drugiego micro:bita. Animacja miga diodami (funkcja animacja) pokazuje wynik.

Oczywiście nasz program będzie działał dobrze dla dwóch micro:bitów, jeśli wgrasz program na trzy, to nie będzie działał jak należy, bo nie zrozumieją dobrze swoich komunikatów.

Na obu micro:bitach działa ten sam program – pierwszy microbit wylosował swój wynik i wysłał go do drugiego. Przenosimy się więc na drugi, omówimy co się dzieje gdy otrzyma rzut z pierwszego.

Kluczem jest blok on radio received – po odebraniu wysłanej liczby sprawdzana ona jest w kolejno trzech blokach if.

Pierwszy wykonuje się gdy liczba otrzymana jest mniejsza od 4 – czyli ta liczba jest reprezentuje wynik rzutu. Skoro dostaliśmy wynik rzutu, to znaczy, że musimy sami rzucić, dlatego wywołujemy losuj oraz animację.

Po losuj mamy już swój wynik rzutu, więc następny blok sprawdza wynik starcia. Nasz blok dzieli się na trzy części. Sprawdzane kolejno gdy otrzymaliśmy wynik 0, 1 lub 2. W zależności od tego co nasza funkcja losuj zapisała w zmiennej rzut, wywołujemy funkcję losewin lub tie. Co robią te funkcje?

Wyświetlają komunikat (krzyżyk  – przegrana, OK – wygrana, kaczuszka – remis) oraz odsyłają przez radio nr 11,10 lub 12. Teraz nasz pierwszy micro:bit wie jaki jest wynik. Do akcji wkracza trzeci blok if w bloku on radio receive. Rezultat starcia jest liczba większą niż 4, więc pierwsze dwa bloki if nie zadziałają, dopiero trzeci:

Zamienia on otrzymaną liczbę na właściwy wynik starcia. Dzięki temu w głównej pętli forever będziemy mogli wyświetlić rezultat zgodny z tym co wyświetla pierwszy micro:bit. Czyli jeżeli pierwszy microbit przegrał, wyświetla krzyżyk (wynikStarcia ustawiony na 2), odsyła liczbę 11, więc microbit który odebrał 11, ustawia swój wynikStarcia na 1, czyli zwycięstwo.

Z grubsza to tyle – i jak widać działa :)