マイクロビットの無線機能でじゃんけんを作ってみよう


2つのマイクロビットを用意して、無線機能でじゃんけんを作ってみよう。


じゃんけんを作るに当たって注意すべき点としまして、対戦者同士が同時に手を出すわけではないので、どちらか一方がグー、チョキ、パーのどれかを出したら、もう片方が何かの手を出すまで待つ仕組みが必要になります。


上記内容を踏まえた上で、じゃんけんのコードを考えてみます。

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


はじめに各手に対応した操作を決めます。

グーはボタンAを押した時。

チョキはボタンBを押した時。

パーはボタンAとボタンBを同時に押した時。

にします。


次に不具合が起こりにくくなるように、各手に対する定数も決めておきます。

グーは 1

チョキは 2

パーは 3


更に対戦者の両方が手を選択するまで待ち続ける仕組みとして、私と相手の手を記録しておく変数を設けます。


これらの内容を加味したコードが



になります。

最初にのブロック内で、無線のグループ設定をしておくことを忘れずに。




よく使うであろう勝ち負けに関する関数を用意しておきます。



手を選択するコードを作ります。



このようにボタンAを押したら、相手にグーを選択したことを伝えるコードと、私の選んだ手を記録する為の変数にグーの定数を登録します。

※ディスプレイに表示するアイコンはグーの形に近いものを選びました


何度も値を送信しないように、私の選んだ手に記録した場合は再度送信しないように、送信前に私の変数の値を確認して、未登録であれば送信するようにします。


グーと同様に、


※ディスプレイに表示するアイコンはチョキの形に近いものを選びました


※ディスプレイに表示するアイコンはパーの形に近いものを選びました


チョキとパーも作っておきます。




相手が選んだ手を受信出来るようにします。



受信した場合、相手の選択した手の記録用の変数に受信した内容を記録しておきます。




実際のじゃんけんの勝敗判定を作っていきます。



私がグーの場合を用意して、そのブロック内に相手がグーの場合、チョキの場合とパーの場合を用意して各々に適切な状態(勝ち負けのアイコン)の関数の呼び出しを加えます。


この処理を続けても良いのですが、この書き方だとずっとブロック内が肥大してしまうため、グーの勝敗判定を



のように関数化します。



関数化に伴い、ずっとブロック内のグーの場合の勝敗判定も先程作成しました関数呼び出しに置き換えます。


グーと同様に




チョキとパーの勝敗判定の関数も作成しておきます。



各々の勝敗判定の関数が出来ましたら、ずっとブロック内でこれらの関数を呼び出すようにしたら終了です。




MicroPythonのコード

ボタンA + ボタンBでパーを選択するところの判定が弱いのでコードを改修する必要あり

from microbit import *
import radio

## パラメータ ##
# グー
rock = 1

# チョキ
scissors = 2

# パー
paper = 3

# 私が選んだ手
my_choose = 0

# 相手が選んだ手
your_choose = 0

# じゃんけんで勝つ
def show_win_icon():
    display.show(Image.HAPPY)

# じゃんけんであいこ
def show_tie_icon():
    display.show(Image.ASLEEP)

# じゃんけんで負け
def show_lose_icon():
    display.show(Image.SAD)

display.scroll("janken!")

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

while True:
    # 出す手を選択
    if my_choose == 0:

        # パーを選択
        if button_a.is_pressed() and button_b.is_pressed():
            radio.send(str(paper))
            my_choose = paper
            display.show(Image.PITCHFORK)

        # グーを選択
        elif button_a.is_pressed():
            radio.send(str(rock))
            my_choose = rock
            display.show(Image.SQUARE_SMALL)

        # チョキを選択
        elif button_b.is_pressed():
            radio.send(str(scissors))
            my_choose = scissors
            display.show(Image.COW)
            
    # 相手の出した手を受け取る
    if your_choose == 0:
        message = radio.receive()
        if message != None:
            your_choose = int(message)
            display.show(your_choose)

    # 勝ち負けの判定
    if my_choose > 0 and your_choose > 0:

        # 私の選択がグーの場合
        if my_choose == rock:

            # 相手がグーであいこ
            if your_choose == rock:
                show_tie_icon()

            # 相手がチョキで勝ち
            elif your_choose == scissors:
                show_win_icon()

            # 相手がパーで負け
            else:
                show_lose_icon()

        # 私の選択がチョキの場合
        elif my_choose == scissors:

            # 相手がグーで負け
            if your_choose == rock:
                show_lose_icon()

            # 相手がチョキであいこ
            elif your_choose == scissors:
                show_tie_icon()

            # 相手がパーで勝ち
            else:
                show_win_icon()

        # 私の選択がパーの場合
        else:

            # 相手がグーで勝ち
            if your_choose == rock:
                show_win_icon()

            # 相手がチョキで負け
            elif your_choose == scissors:
                show_lose_icon()

            # 相手がパーであいこ
            else:
                show_tie_icon()
京都の東本願寺で開催されているプログラミング教室で講師をしています。
詳しくはTera schoolを御覧ください。
大阪府高槻市でプログラミング教室を開設しています。
同じカテゴリーの記事
マインクラフト用ビジュアルエディタを開発しています。

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