OSC2020 Online/Fukuoka で紹介したmicro:bit v2のプログラムと時間の都合で紹介出来なかったこと

##はじめに
先日開催された[Open Source Conference 2020 Online/Fukuoka](https://event.ospn.jp/osc2020-online-fukuoka/) にてmicro:bit v2を使って親子で一緒に遊べる簡単なプログラムをご紹介しました。時間の関係で紹介出来なかったものも含めて今回そのプログラムを記事にしたいと思います。

##追加された機能を使った簡単プログラム（これはOSCで発表できたもの）
micro:bit v2には、マイクとスピーカーとタッチセンサーが追加されています。
その追加された機能を説明するのに、

* マイクロビットの**ロゴを触った時**にサーボが動く
* **大きい音がした時**に、サーボが動く
* ゆさぶられた時に、**v２で新たに追加されたサウンドを奏でる**

…というプログラムにしました。ついでに

* Aボタンを押したらメロディが流れて
* Bボタンを押したらおみくじになるプログラムがこちらです↓↓↓

![888.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96556/441b0853-ccec-740e-7103-d5500172ac7b.png)

ブロックを全部見せると、こんな感じです↓↓↓
![スクリーンショット 2020-12-07 11.09.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96556/2a20d61f-905c-51b5-4d3d-85983096dd8e.png)

あと、**相性診断**というのを作りました。
これは**無線機能をシミュレーターでも試せる**ので、それを体験してもらいたくてご紹介したものです。

最初は連打した数を競う連打ゲームを作っていたのですが、
発表時間の４５分内にどうしても説明がおさまらず、好きな数字が同じなら二人の相性は良いであろう…という事で相性診断できるものに変更しました。

これが相性診断のブロックです↓↓↓
![０００.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96556/d38e4181-947d-cf74-c7b1-0bd7649e9925.png)


自分の好きな数字の数だけタッチセンサーに触れて打ち込みます。
間違って好きな数字を超えてしまったり、もう一度やりたい時は、二人ともAボタンを押してクリアしてください。
最後にBボタンを押して同じ数字だったら相性が良いということでハートマークが表示されます。（違ったら×が表示されます。）

こちらの動画で詳しくプログラムの作り方などを説明していますのでご覧ください。
[![](https://img.youtube.com/vi/KLvnROxcDnU/0.jpg)](https://www.youtube.com/watch?v=KLvnROxcDnU&feature=youtu.be&t=730)

「ブロック」のスライドボタンを「JavaScript」に変えるとソースが表示されます。


「おみくじ」

```javascript:omikuji.js
let おみくじ = 0
input.onButtonPressed(Button.A, function () {
    music.startMelody(music.builtInMelody(Melodies.Dadadadum), MelodyOptions.Once)
})
input.onLogoEvent(TouchButtonEvent.Pressed, function () {
    servos.P0.setAngle(0)
})
input.onGesture(Gesture.Shake, function () {
    soundExpression.twinkle.playUntilDone()
})
input.onSound(DetectedSound.Loud, function () {
    servos.P0.setAngle(180)
})
input.onButtonPressed(Button.B, function () {
    おみくじ = randint(0, 3)
    soundExpression.happy.playUntilDone()
    if (おみくじ == 0) {
        basic.showLeds(`
            . . # . .
            # # # # #
            . . # . .
            . # . # .
            # . . . #
            `)
        music.startMelody(music.builtInMelody(Melodies.PowerUp), MelodyOptions.Once)
    } else if (おみくじ == 1) {
        basic.showLeds(`
            . . # . .
            # # # # #
            # . # . #
            # # # # #
            . . # . .
            `)
        music.startMelody(music.builtInMelody(Melodies.JumpUp), MelodyOptions.Once)
    } else if (おみくじ == 2) {
        basic.showLeds(`
            . . # . .
            . . # . .
            # . # . #
            # . # . #
            # . # . #
            `)
        music.startMelody(music.builtInMelody(Melodies.JumpDown), MelodyOptions.Once)
    } else if (おみくじ == 3) {
        basic.showLeds(`
            # . . . #
            # # . # #
            # . # . #
            # # . # #
            # # # # #
            `)
        music.startMelody(music.builtInMelody(Melodies.PowerDown), MelodyOptions.Once)
    }
})
```


「相性診断」

```javascript:aishou.js
radio.onReceivedNumber(function (receivedNumber) {
    相手の数 = receivedNumber
})
input.onButtonPressed(Button.A, function () {
    自分の数 = 0
    相手の数 = 0
    basic.clearScreen()
})
input.onLogoEvent(TouchButtonEvent.Pressed, function () {
    自分の数 += 1
    radio.sendNumber(自分の数)
    basic.showNumber(自分の数)
})
input.onButtonPressed(Button.B, function () {
    if (自分の数 == 相手の数) {
        basic.showIcon(IconNames.Heart)
    } else {
        basic.showIcon(IconNames.No)
    }
})
let 相手の数 = 0
let 自分の数 = 0
radio.setGroup(1)
自分の数 = 0
basic.forever(function () {
	
})
```

新規で作ったプロジェクトのスライドボタンをJavaScriptにして上記のプログラムをコピー＆ペーストすると遊べますよ。但し「おみくじ」はservoを使いますので拡張機能の追加が必要です。



##連打ゲーム（これはOSCでご紹介できなかったもの）
先程ご紹介した相性診断のもとになったもので、無線機能を使って相手と比べてどのくらい沢山タッチセンサーを連打できるかをゲームです。（このプログラムは２つのmicro:bit v2を用意して同じプログラムを入れてください。）

例えば10秒とか時間を決めて、タイマーをセットし、スタートと同時にタッチセンサーを連打します。
時間がきたらタッチするのをやめてBボタンを押したら勝敗がわかります。
もう一度勝負したい時はAボタンを押してください。その時に自分が実際何回連打していたのか、数が表示された後にクリアされます。

こちらがブロックでの表示です。
![スクリーンショット 2020-12-07 11.56.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96556/e810846b-644f-d726-4353-65f63bdcfb21.png)

JavaScriptに変えるとこのようになります。

```javascript:rh.js
radio.onReceivedNumber(function (receivedNumber) {
    受け取った数 = receivedNumber
})
input.onButtonPressed(Button.A, function () {
    basic.showNumber(数)
    basic.pause(2000)
    数 = 0
    受け取った数 = 0
    basic.clearScreen()
})
input.onLogoEvent(TouchButtonEvent.Pressed, function () {
    数 += 1
    radio.sendNumber(数)
})
input.onButtonPressed(Button.B, function () {
    if (数 > 受け取った数) {
        basic.showString("You Win!")
        music.startMelody(music.builtInMelody(Melodies.Wedding), MelodyOptions.Once)
    } else if (数 < 受け取った数) {
        basic.showString("You Lose")
        music.startMelody(music.builtInMelody(Melodies.Funeral), MelodyOptions.Once)
    } else {
        basic.showString("Draw")
        music.startMelody(music.builtInMelody(Melodies.Entertainer), MelodyOptions.Once)
    }
})
let 受け取った数 = 0
let 数 = 0
radio.setGroup(1)
数 = 0
```


##あえて間違って工夫していくことで楽しくなる
このプログラムは、タッチセンサーの連打の数を競うもので、手順としては

1. **最初にタッチセンサーを連打する。**
2. **次にBボタンを押すと、勝敗が表示されてメロディが鳴る**
3. **次にAボタンを押すと、実際に連打した数を表示してクリアする**

…というのを知ってないと楽しめないし、間違ったやり方だと当然思った通りに動作しません。

なので**最初に楽しみ方を説明して知ってもらうこと**がとても重要になります。

でも説明するのって結構**面倒くさい**ですよね。なので説明しなくても最初にタッチセンサーを触りたくなるような**工夫をどんどん追加する**といいかな？って思うのです。

例えば
![スクリーンショット 2020-12-07 12.29.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96556/1a1e2d6e-aa99-9b8b-9c69-f7a06a02d8c7.png)

最初だけ**矢印を表示**させてタッチセンサーを使うのを促したらどうか？　とか

![スクリーンショット 2020-12-07 12.33.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96556/7e9ca471-2f85-c184-3411-a7c923794c5d.png)

点滅させるのに繰り返しているところ、**「くりかえし」**を使ってみたらどうか？　とか


**どうしたらゲームが相手に伝わって楽しくなる**のか、プログラムの改変が楽になるのか、途中で間違ってAボタンを押したらどうなるのか？
**あえて間違ってみて**、お子さんと一緒に考えて**機能追加**していくのも楽しいと思います！
ぜひやってみてください！

（おしまい）