マイクロビットの無線機能で早押しゲームを作ってみよう


2つのマイクロビットを用意して、無線機能で早押しゲームを作ってみよう。

早押しゲームは2このマイクロビットを使って、どちらが早くボタンBを押したか競います。


勝敗はボタンBを早く押せた方のマイクロビットの方にハートのアイコンを表示する事にします。


このゲームを作るにあたって重要になることが、2つのマイクロビットが同じタイミングでゲームを開始出来ることになりまして、スタンバイ状態に関する仕組みを考える必要があります。


始めにスタンバイの仕組みを考えてみます。

※これから作成するコードは、対戦者の両方のマイクロビットに同じ内容でフラッシングしても動作するように作成しています。



必要となる変数はお互いに準備出来たことを記録する私の状態相手の状態になります。

この2つの変数の値が共に 1 になった時にゲームを開始するようにします。


ボタンAを押した時に準備が出来たことを相手に伝える為に、



ボタンAを押した時に無線で 1 を送信しつつ、私の状態の値を 1 にします。

ボタンAの二度押し防止として、もしブロックで私の準備の値が 0 の時のみ相手に値を送信するようにします。



無線で値の受取りの方も準備しておきます。


これで、私の準備と相手の準備の変数の値を変更する仕組みが出来ました。



ずっとブロック内で、私の準備と相手の準備の値が共に 1 になった場合に、ディスプレイにready go!の文字列を表示して、! の表示が消えた時に早押しゲームを開始します。





ゲームの勝敗がわかるように最初だけブロックにアイコンが付いたの変数を追加します。

これは私か相手のどちらかボタンBを押した時に値を 1 にすることで、どちらか一方のマイクロビットのみハートを表示する仕組みで用います。


アイコンが付いたブロックの使い方ですが、



ボタンBを押した時に相手にボタンを押したことを伝える為に無線で 2 という値を送っています。

この 2 には特に意味はなく、先程のスタンバイ状態の時の値と被らなければ良いです。


このブロック内のもしブロックでアイコンが付いたの値を調べることで、既に相手がボタンBを押しているかをわかるようにしています。



無線の受信の方に相手がボタンBを押した時の対応を加えておきます。

これで早押しゲームのコードは終了です。




無線の値の送信の 1 や 2 の値のような意味のない数字の決め打ちマジックナンバーと呼ばれよろしくないこととされています。


マジックナンバーへの対応は



準備できた合図やボタンを押した合図といった変数を用意しておいて、各値に名前を付けます。


これらの変数を





のように無線の送受信でマジックナンバーに関する箇所を差し替えれば、コードの可読性が高まります。




MicroPythonのコード

from microbit import *
import radio

# 私の状態
my_ready = 0

# 相手の状態
your_ready = 0

# ゲームスタートの合図
game_start = 0

# どちらかのマイクロビットにアイコンが点いている
is_icon_on = 0

# マジックナンバー対策 micropythonの場合は変数一つで良い
radio_signal = 1

radio.config(group=1)
radio.on()

# Code in a 'while True:' loop repeats forever
while True:

    # ゲーム開始前
    if game_start == 0:    

        # 私が準備完了であることを相手に伝える
        if my_ready == 0:
            if button_a.is_pressed():
                radio.send(str(radio_signal))
                my_ready = 1

        # 相手が準備完了であることを受信する
        if your_ready == 0:
            message = radio.receive()
            if message != None:
                your_ready = 1

        # 私と相手の準備が整ったらゲームスタート
        if my_ready == 1 and your_ready == 1:
            display.scroll("ready go!")
            game_start = 1

    # ゲーム開始後
    else:
        # ボタンBを押した時
        if button_b.is_pressed():
            if is_icon_on == 0:
                radio.send(str(radio_signal))
                display.show(Image.HEART)
                is_icon_on = 1
        else:
            # 相手の方がボタンBを押すのが早かった時
            message = radio.receive()
            if message != None:
                is_icon_on = 1 
京都の東本願寺で開催されているプログラミング教室で講師をしています。
詳しくはTera schoolを御覧ください。
大阪府高槻市でプログラミング教室を開設しています。
同じカテゴリーの記事
マインクラフト用ビジュアルエディタを開発しています。

詳しくはinunosinsi/mcws_blockly - githubをご覧ください。