
Micro:bitでPythonをはじめる 3/ ジャンケンゲームの作成
こんにちはロック204チャンネルです。
今回は「micro:bitでpythonを始める3 ジャンケンゲームの作成」についてお送りします。
このプログラムではマイクロビットの加速度センサーを使用し、マイクロビットを揺さぶるとマイクロビットが ぐー ちょき ぱー に対応するG、C、Pの文字を表示するプログラムとなっています。
マイクロビットが出す手は乱数を使用します。
それでは、プログラムの実行状態を見て行きましょう。
janken1プログラムの実行
こちらがジャンケンゲーム1のコードになります。
それでは内容について解説をして行きます。

最初に主な命令について見ていきましょう。
マイクロビットを揺さぶると、反応するプログラムは、加速度センサーのジェスチャーを感知する命令を使用します。
ジェスチャーの項目の「ゆさぶられた」を選択するとスライドのようなプログラム例が表示されます。
if accelerometer.was_gestureの括弧中に’shake’と書けば、揺さぶられるとif文が成立した状態となりますので、この下に実行したい命令を書いていきます。
この例では「Image.CONFUSED」が表示されます。

次に、マイクロビットを揺さぶると乱数を発生させるようにします。
乱数は不規則な数を発生させる機能です。
パイソンエディターでは、「算術演算」の項目に乱数の書式があります。
この例でわかるように、乱数を使用するには最初にimport命令でrandomモジュールを取り込む必要があります。
書式はrandom.randint(1,6)のように書くと1から6の整数の乱数を不規則に発生させることができます。

このプログラムでは乱数を使用するので
3行のようにimport命令でrandomモジュールを取り込んでおきます。
またマイクロビットの出し手を記録する変数としてmicrobit_teを設定しておきます。

こちらが、ずっと実行されるwhileループとなっています。
8行はマイクロビットが揺さぶられたときは、9行以下の字下げされたブロックが実行されます。
揺さぶられると、Image.CONFUSEDが表示され
1秒プログラムを停止した後、1から3までの整数の乱数が変数microbit_teに保存されます。
次のスライドで12行以下のif文について見ていきましょう。

If文は条件が合致した場合、if文の下の字下げされた部分が実行されます。
最初のif microbit_te==1は、microbit_teの変数が1と等しい場合このように書きます。
もしmicrobit_teが1であった場合この条件式が成り立つと
ディスプレイにGの文字を表示します。
この時、microbit_teが2である場合は、次のlfの部分が成立しますのでCの文字をディスプレイに表示します。
microbit_teが3の場合であれば、if文とelifの部分の条件式は成り立たないので、elseの下に書かれた字下げされた部分の命令が実行されPが表示されます。

プログラムの流れを変える条件式と比較演算子について説明します。
条件式は例えば a大なりbのように書きます。
これは 値、比較演算子。値というように右辺と左辺を比較演算子で結合したものとなってきます。
この条件式が成り立つ場合が真、 trueと表現します。
そして条件式が成り立たない場合お偽、falseと表現をします。
次のスライドで この条件式の使いかたについて説明をして行きます。

比較演算子について 説明します。
右辺と左辺が等しい場合は イコールを二つ並べて書きます。 使いかたとしてはaイコール、イコールbのように書くとaとbは等しいということになります。
aはbより小さい場合は a小なりbと書きます。
aはbより大きい場合はa大なりb
aはb以下である場合は a小なりイコールbと書きます。
同様に aはb以上の場合は a大なりイコールbと書きます。
aとbは等しくない場合は aダッシュ イコールbと書きます。
条件式の 結果を見たい場合にわ print文を使用することができます。
例えばaイコール10、bイコール20として
print a小なりbを実行すると trueとなります。
反対にプリント a大なりbを実行するとfalseとなります。

次に論理演算子について説明します。
論理演算子andは、何々かつ何々と言った場合です。使いかたは aは10以上かつ50未満 というような場合です。
左の条件をAとして右の条件をBとすると、 左下の図のように Aの条件とBの条件が重なった部分がこのand条件となります。
or条件、これは「または」で表されるものです。 例えば Aは1または100であるといった条件の場合です。
下の図では真ん中の集合になります。
not条件これは、何々ではないという条件です。Aは100ではないと言ったような条件となります。
右下の図がこれにあたります。 集合Aの外側にあたる部分に該当します。

If文についてまとめてみました。
ifは2種類あって、右の if条件式コロン、字下げして「処理」ブロックの場合、この条件が成り立った場合、 字下げした部分のブロックを実行して、下のブロック外の処理に移ります。
この条件が成り立たなかった場合は「処理」ブロックを無視しifブロックの下に書かれたコードを実行します。
それに対してif else文では
if条件式が成り立った場合は、下の字下げした「処理1」ブロックを実行し、ifブロックの下に書いたコードを部分を実行します。
条件式が成り立たない場合は、字下げして「処理2」を実行した後、次の ifブロックの下に書いたコードを部分を実行します。

こちらはif, elif, elseの書き方です。
最初のif文で条件式1が成立すると、処理1が実行されて処理5に移行します。
条件式1が成り立たなかった場合は、elifの条件式2を判断します。
条件式2が成立すると、処理2が実行され、実行後は処理5に移ります。
条件式2が成立しない場合は、elif 条件式3の判断となります。
条件式3が成立した場合は、処理3が実行され、次に処理5が実行されます。
条件式3が成立しない場合は、elseの処理4が実行され、実行後は処理5が実行されるという結果となります。

ジャンケンゲーム2の説明をします。
最初にマイクロビットを揺さぶるとマイクロビットの出し手が表示されます。
そこであなたが勝った場合はaボタンを押します。
また負けた場合はbボタンを押します。
引き分けの場合は何も押さないで、またマイクロビットを揺さぶります。
勝ち負けの数を表示したい場合は、ロゴマークをタッチすると、例えば「2:1」のように表示されます。
それでは実行状況を見て行きましょう。
# janken1
from microbit import *
import random
microbit_te=1 #マイクロビットの手(1=グー 2=チョキ 3=パー)
# Code in a 'while True:' loop repeats forever
while True:
if accelerometer.was_gesture('shake'):
display.show(Image.CONFUSED)
sleep(1000)
microbit_te=random.randint(1, 3)
if microbit_te==1:
display.show('G')
elif microbit_te==2:
display.show('C')
else:
display.show('P')

janken2プログラムの実行
こちらがジャンケンゲーム2のコードとなります。
それでは以下のスライドで内容を説明して行きます。

マイクロビットでは、ロゴをタッチすると反応を感知するセンサーが使用できます。
こちらに示すのがタッチロゴの使用例です。
If pin_logo.is_touched():はロゴをタッチすると条件式が成立しtrueとなります。
この例では、ロゴがタッチされるとディスプレイにImage.HAPPYが表示されます。
このプログラムでは、勝ち負け数の表示を行うときにこのタッチロゴを使用します。

このプログラムでは、あなたの勝ち数を記録する変数kachi_suとあなたの負け数を記録するmake_suを追加しました。
プログラムの最初でこれらの変数を0に設定します。

Whileループの最初の部分についてはジャンケンゲーム1と同じになります。
プログラムの停止時間については3秒としています。

追加された部分について説明します。
20行ではaボタンが押された場合の命令です。
「kachi_su+=1」は現在のkachi_suに1を足すという意味となります。
そしてImage.HAPPYを1秒表示して、画面をクリアします。
同様に負けた時bボタンを押すと、make_suに1を加算します。
そしてImage.SADをディスプレイに表示し、1秒をプログラムを停止し、ディスプレイをクリアします。

こちらが勝ち数と負け数を表示するプログラムとなります。
ロゴがタッチされると勝ち数と負け数が表示されますが
ここでは、kachi_suの数字をstr()関数で文字化して「:」と合体させ、次にmake_suも文字化して、一つの文字列として表示します。
次に1秒プログラムを停止して、画面をクリアします。
以上でプログラムの説明を終わります。

# janken2 勝ち負けを記録
from microbit import *
import random
microbit_te=1 #マイクロビットの手(1=グー 2=チョキ 3=パー)
kachi_su=0 #あなたの勝ち数を記録
make_su=0 #あなたの負け数を記録
# Code in a 'while True:' loop repeats forever
while True:
if accelerometer.was_gesture('shake'):
display.show(Image.CONFUSED)
sleep(3000)
microbit_te=random.randint(1, 3)
if microbit_te==1:
display.show('G')
elif microbit_te==2:
display.show('C')
else:
display.show('P')
if button_a.was_pressed():#勝ったとき押す
kachi_su+=1
display.show(Image.HAPPY)
sleep(1000)
display.clear()
if button_b.was_pressed():#負けた時押す
make_su+=1
display.show(Image.SAD)
sleep(1000)
display.clear()
if pin_logo.is_touched():#勝ち数と負け数を表示
display.show(str(kachi_su)+":"+str(make_su))
sleep(1000)
display.clear()