micro:bit 判断力ゲーム : プログラム
この記事で説明すること
以下の記事で仕様を説明した判断力ゲームのプログラム方法について説明していきます。
考えていくこと
簡単なゲームではありますが、いざ自分で全て作るとなると中々どこから手をつけるべきか悩んでしまう部分もあるかと思います。この記事では以下のように順序立ててプログラムを作成していきます。
① 壁エリアの設置
② ライフエリアの設置
③ ゲームエリア:自機の設置
④ ボタン動作の設計
⑤ メインフロー設計
⑥ ゲームエリア:弾の生成・削除処理
⑦ ゲームエリア:弾の移動処理
⑧ ゲームエリア:弾と自機の接触判定処理
⑨ ライフエリア・ライフ処理
⑩ ゲームオーバー処理
⑪ スコア処理
⑫ 難易度調整
必要な知識として
このゲームのプログラミングでは「ゲーム」のパーツリストの中のスプライトという機能を使用します。このスプライトは要はLEDのコマのようなものなのですが、壁を作ったり、ボタンでコマを制御したり、接触したら消去したり…と様々な動作の実現が可能です。実際の動作は私の作成したプログラムを実際に動かしていきながら確認して下さい。
尚、micro:bit のLEDは以下のように座標管理されておりますので、スプライトを作成するときにはこちらを参考にして下さい。
プログラムしよう
①壁エリアの設置
ここではスプライトの機能を使って壁エリアの設計を行います。純粋な壁としての利用ですので、特別な制御は必要とせず、「最初だけに」の中に以下のようにプログラムして下さい。
この時点で、micro:bit のシミュレータ画面は以下のようになっているはずです。
② ライフエリアの設置
③ ゲームエリア:自機の設置
続けて壁エリアの設置と同様の方法でライフ、自機についても設置しましょう。変数名は何にしても良いですが、後で見返した際にもわかりやすい名前とすることをオススメします。ライフについては初期値を5として、スプライトと変数の両方を用意しておきます。その他に、弾自体が存在しているかを示す、flagという変数についてもここで記載しておきます。
④ ボタン動作の設計
ここではボタンが押された時の動作をプログラムしていきます。Aボタンを押されたら自機を1つ左に移動、Bボタンが押された自機を1つ右に移動するようプログラムを行って下さい。Bボタンの動作については壁が超えられないよう、自機(player)のスプライトの位置で右に移動させるかどうかの判定を行うことを忘れないようにしましょう。
A+Bボタンが押された時の動作はゲームの初期状態に戻す、ですので制御のパーツリストからリセットを選択してください。
ここまで作成するとAボタンとBボタンで自機が動かせるようになっていますので、少しゲームらしくなってきました。ここで一度、データをダウンロードして実際にmicro:bitを使って動作を確認してみて下さいね。
⑤ メインフロー設計
ここでゲームの設計をシンプルにするため、以下のアルゴリズムを元にプログラムを進めます。弾の生成・移動は以下のように4つフェーズで実行されていきます。各フェーズ間が高速に進行しないようフェーズ間にはwait動作(待ち時間)を1秒ずつ入れていきます。(太字)で書かれているものは関数名となります。
〇フェーズ1
・ATK1/ATK2/ATK3/ATK4の中で存在するスプライトを一つ下に移動(atk_move)
・ATK1/ATK2/ATK3/ATK4が存在する場合、自機との接触を判定(atk_check)
・ATK1/ATK2が存在する場合、ATK1/ATK2を削除(atk_delete_12)
・ATK1/ATK2をゲームエリア最上段に生成(atk_create_12)
〇フェーズ2
・ATK1/ATK2/ATK3/ATK4の中で存在するスプライトを一つ下に移動(atk_move)
〇フェーズ3
・ATK1/ATK2/ATK3/ATK4の中で存在するスプライトを一つ下に移動(atk_move)
・ATK1/ATK2/ATK3/ATK4が存在する場合、自機との接触を判定(atk_check)
・ATK3/ATK4が存在する場合、ATK3/ATK4を削除(atk_delete_34)
・ATK3/ATK4をゲームエリア最上段に生成(atk_create_34)
〇フェーズ4
・ATK1/ATK2/ATK3/ATK4の中で存在するスプライトを一つ下に移動(atk_move)
上記を micro:bitのプログラムにすると以下のようになります。一旦、関数は空の状態で仮作成し、以下のように置いておいて下さい。
動作と合わせてこちらで上手く作っていけると机上で検討してみましょう。上手くいくなーと思ったら次のページに進んで下さい。ここからは実際の関数の中身を作成していきます。
ディスカッション
コメント一覧
こんにちは。
いつも参考にさせて頂いております。
判断力ゲームの
関数 game over のアイコンを表示する部分が点数によっては2種類表示されてしまいます。
点数判定の「もし 〜 なら」の連続した判断ではなく、「もし 〜 なら 〜 でなければもし 〜 なら 〜 でなければ 〜」で判断するようにした方がよいのではないでしょうか?
よろしくご回答をお願い致します。
尾崎様
確認致しましたが、スコア表示の後のアイコン表示については尾崎様にコメント頂いた通り、現状のコードでは意図した動作になりませんので「もし 〜 なら 〜 でなければもし 〜 なら 〜 でなければ 〜」という、いずれか1つのみを選択するような判定文を用いるべきですね。
私の方では作成した後に十分にテストが出来ておりませんでした。ご指摘頂き有難うございます。
ブログの方には注釈を入れておきたいと思います。
今後とも宜しくお願い致します。