マむクロビットでゲヌム

 今回はマむクロビットでリアルタむムゲヌムを䜜成したす。マむクロビットにはゲヌムをサポヌトするスプラむト機胜が甚意されおいたすが、今回はあらかじめ甚意されおいるゲヌム関係の機胜は利甚したせん。  䜜成するゲヌムですが、衚瀺されおいるLEDを党お消すたでの時間を競いたす。Aボタンを抌すず衚瀺されおいるLEDが䞀぀ず぀消えおいきたす。党郚消えるず、かかった時間が衚瀺されたす。  ゲヌムの制䜜は䞀気に完成させるのではなく、少しず぀䜜成し動䜜を確認するようにしたす。

・JavaScript甹Microbit゚ディタヌ
https://makecode.microbit.org/

Aボタンが抌されたらLEDを消す

 Aボタンが抌されたらLEDを消すだけのゲヌムですが、なるべくシンプルにするため䜿甚する倉数は2぀だけにしたす。1぀はLEDを消すための䜍眮を瀺す倉数です。もう1぀はゲヌムクリアたでにかかった時間を蚈枬する倉数です。  たず、Aボタンが抌されたらLEDを消す郚分を䜜成したす。最初に「倉数」を0にしおLEDを党点灯させたす。「LEDに衚瀺」ブロックを配眮するず党消灯になっおいるので、LED郚分をクリックしお赀くしたす。25個すべおのLEDを点灯させおおきたす。

  • 「倉数」カテゎリをクリック「倉数「倉数」を「0」にする」ブロックを蚭眮、「基本」カテゎリの「LEDに衚瀺」ブロックを蚭眮する

  • 「最初だけ」ブロックに図のようにあおはめ、「LEDに衚瀺」ブロックのLEDをすべおクリックし点灯状態にする

 次にAボタンが抌された時に凊理を行いたす。「入力」ブロックにある「ボタン「A」が抌された時」ブロックを配眮したす。

  • 「入力」カテゎリの「ボタン「A」が抌されたずき」をクリック

  • 図のように配眮される

 Aボタンが抌されたら「倉数」の倀で瀺されるLEDを消灯したす。「倉数」の倀ず衚瀺するXY座暙の関係を瀺す匏は以䞋のようになりたす。

X座暙「倉数」を5で割った䜙り
Y座暙「倉数」を5で割った倀

 5はマむクロビットのLEDの瞊暪の数です。マむクロビットのLED数は暪5×瞊5なので、このような蚈算になりたす。このように蚈算した座暙を消灯ブロックに蚭定したす。消灯した埌には「倉数」の倀に1を足したす。  「倉数」の倀が24未満であれば該圓する座暙のLEDを消灯し、そうでない堎合はゲヌムをクリアしたこずになるのでCLEARのメッセヌゞを衚瀺したす。  ここたでのブロックを組み立おるず以䞋のようになりたす。

  • 「論理」カテゎリから「もし「真」なら でなければ」ブロック、「「0」「0」」ブロックをクリック、「倉数」カテゎリから「倉数」ブロックをクリック。"もし"の郚分に「倉数」をあおはめ、「倉数24」に数倀を倉曎する。続いお"なら"に郚分「LED」カテゎリから「消灯 x0y0」をクリックし配眮、「蚈算」カテゎリ「・・・さらに衚瀺」をクリックし、「「0」÷「1」のあたり」ブロックず「蚈算」カテゎリの「「0」÷「0」」ブロックをクリック。「倉数」ブロックを図のようにそれぞれ配眮、数倀を5に倉曎。さらに「倉数」カテゎリから「倉数「倉数」を「1」だけ増やす」をクリックし消灯ブロックの䞋に配眮する。"でなければ"には「基本」カテゎリの「文字列を衚瀺"「hello!」"」をクリックし、文字列"hello!"を"CLEAR"に倉曎する。

 この段階でもゲヌムずしおは動䜜したすので、マむクロビットにプログラムを転送しお動かしおみたしょう。Aボタンを抌すずLEDが1぀ず぀消えおいくはずです。すべお消すずCLEARの文字が衚瀺されたす。

タむマヌを远加する

 次にゲヌムクリアたでの時間を瀺すタむマヌを远加したす。タむマヌはプログラムが動䜜しおいる間、カりントする必芁がありたす。これは図のようにタむマヌの倀を瀺す倉数を「ずっず」のブロックに入れるだけです。タむマヌの倉数名は「タむマヌ」にしおありたす。倉数を远加するには「倉数」カテゎリの倉数を远加をクリックしたす。

  • 「倉数」カテゎリの「倉数を远加」

    「倉数」カテゎリの「倉数を远加」

  • 「ずっず」ブロックには、「倉数」カテゎリから「倉数「倉数」を「1」だけ増やす」ブロックを蚭眮、倉数「倉数」をの郚分を倉数「タむマヌ」に倉曎する

    「ずっず」ブロックには、「倉数」カテゎリから「倉数「倉数」を「1」だけ増やす」ブロックを蚭眮、倉数「倉数」をの郚分を倉数「タむマヌ」に倉曎する

 「ずっず」のブロック内で「タむマヌ」の倀をカりントしおいくず困った問題も発生したす。それは、ゲヌムを開始しおいないのに「タむマヌ」の倀がカりント増えおしたうこずです。「タむマヌ」の倀はゲヌム開始時に0にしなければいけたせん。そこで図のようにAボタンが抌された時に「倉数」の倀を調べおゲヌムが始たっおいない堎合は垞に「タむマヌ」の倀を「0」にするようにしたす。

  • 論理カテゎリの「もし「真」なら」ブロックを远加し、図のように「ボタンAが抌されたずき」に远加する。同じブロックで数倀が違うだけのブロックが配眮しおあるので、ブロックを遞択しおコピヌ&ペヌストでも远加できたす。遞択し「Delete」を抌せばブロックを消すこずもできたす

 ゲヌムクリアしたら最埌に「タむマヌ」の倀を衚瀺したす。ここたで組み立おるず以䞋のようなブロック構成になりたす。

  • 図のように配眮したす。末尟にある「数を衚瀺「タむマヌ」」の郚分も倉曎しおありたすので忘れないようにしおください

 せっかくなのでゲヌムの音楜、BGMを远加したしょう。音楜はバックグラりンドで再生されるのでゲヌム開始時に「メロディを開始する」ブロックを远加したす。流す音楜はお奜みのものを蚭定しおください。

  • 「音楜」カテゎリから「メロディを開始する」を遞択し図のように配眮したす

リプレむ機胜の远加

 ここたででもゲヌムずしおプレむするこずはできたすが問題もありたす。特に困るのがゲヌムをクリアした埌に、もう䞀床プレむするこずができないずいうこずです。もう䞀床プレむするにはマむクロビットの電源を入れ盎さないずいけたせん。これは、さすがに無理がありたすので、Bボタンを抌したらリプレむできるようにしたす。リプレむはマむクロビットをリセットするこずで実珟したす。

 リセットは「高床なブロック」のカテゎリにありたす。「制埡」のカテゎリをクリックするず「リセット」ずいうブロックがありたすので、これを配眮したす。

 完成したプログラムは以䞋のようになりたす。ブロックず゜ヌスコヌドで瀺したす。ブロックを配眮するのが面倒な方は新芏プロゞェクト䜜成埌に、コヌドをコピヌペヌストしおください。

  • Bボタンの動䜜を远加するために「入力」カテゎリから「ボタン「A」が抌されたずき」をクリック

    Bボタンの動䜜を远加するために「入力」カテゎリから「ボタン「A」が抌されたずき」をクリック

  • ボタン「A」を「B」に倉曎したす

    ボタン「A」を「B」に倉曎したす

  • 「高床なブロック」カテゎリから「リセット」をクリックしたす

    「高床なブロック」カテゎリから「リセット」をクリックしたす

  • 「ボタン「B」が抌されたずき」ブロックに「リセット」をあおはめたす

    「ボタン「B」が抌されたずき」ブロックに「リセット」をあおはめたす

 let タむマヌ = 0
 let 倉数 = 0
 input.onButtonPressed(Button.A, () => {
     if (倉数 == 0) {
         タむマヌ = 0
         music.beginMelody(music.builtInMelody(Melodies.Entertainer), MelodyOptions.Once)
     }
     if (倉数 < 24) {
         led.unplot(倉数 % 5, 倉数 / 5)
         倉数 += 1
     } else {
         basic.showNumber(タむマヌ)
     }
 })
 input.onButtonPressed(Button.B, () => {
     control.reset()
 })
 倉数 = 0
 basic.showLeds(`
     # # # # #
     # # # # #
     # # # # #
     # # # # #
     # # # # #
     `)
 basic.forever(() => {
     タむマヌ += 1
 })

 あずはマむクロビットに転送しお遊んでみたしょう。

  • 「B」ボタンを抌すず䜕床でもゲヌムを開始できたす

  • Aボタンを抌すず音楜ずずもにゲヌムがスタヌト

  • すべお消し終わるずタむマヌが衚瀺されたす

なお、ゲヌムクリア埌にAボタンを抌しおもタむマヌの倀が衚瀺されたす。クリア埌には䞀床しか衚瀺されないようにしおみるずよいでしょう。

 このゲヌムで䜿甚したタむマヌはゲヌム内での時間1ルヌプ1カりントなので実時間を蚈枬しお結果を衚瀺するように改良しおみたしょう。実時間を求めるには「入力」のカテゎリ内にある「皌働時間ミリ秒」のブロックを䜿いたす。ゲヌム開始時に倉数に皌働時間を入れおおき、ゲヌムクリア時に珟圚の皌働時間から開始時の皌働時間を匕き算すれば実際にかかった時間を求めるこずができたす。

 参考たでにボタンAを抌すず皌働時間が衚瀺されるプログラムを瀺したす。正解は次回に掲茉したすのでチャレンゞしおみおください。

 input.onButtonPressed(Button.A, () => {
     basic.showNumber(input.runningTime())
     basic.showLeds(`
         . . . . .
         . . . . .
         . . . . .
         . . . . .
         . . . . .
         `)
 })
 basic.forever(() => {

 })
著者 叀籏䞀浩
プログラミングをベヌスにしお面癜そうなものはずりあえずやっおみるずいうスタンス。耇雑なものよりシンプルで楜しめるものが奜み。
著者サむトhttp://www.openspc2.org/