4.2.5 ブロック回避

4.2.5.1 概要

Img

このプロジェクトでは、プレイヤーがMicro:bitゲームパッドを使用してLEDインジケーターを左右に動かし、上から落ちてくるブロックを回避するブロック回避ゲームをプレイします。3つの状態があります: a) 起動時の動的なアイコン、b) ゲームプレイ中のリアルタイム回避アクション、c) 衝突後の最終スコア。

プレイヤーは回避するたびに(ブロックが下部に到達したとき)1ポイントを獲得し、ブロックと衝突するとゲームオーバーになります。最終スコアはスクロール効果で表示されます。

A+Bを同時に押すことでゲームを開始またはリセットできます。このシンプルなゲームプレイメカニズムは、リアルタイムの応答性と戦略的な予測を組み合わせています。

Img

4.2.5.2 必要な部品

Img

Img

Img

micro:bit V2 ボード (自己調達) ×1

micro:bit スマートゲームパッド (組み立て済み) ×1

単4電池 (自己調達) ×4

4.2.5.3 コードフロー

Img

4.2.5.4 テストコード

⚠️ コード内の初期閾値300は、必要に応じて変更できます。値が高いほど、ブロックの落下が遅くなります。

完全なコード:

Img

Img

簡単な説明:

① プレイヤーの初期列、行、ブロックの速度など、関連する変数を初期化し、プレイヤーの位置を初期列に設定します。

on_start関数を呼び出します。

Img

② この関数では、ゲーム開始時にブロックが0〜4のランダムな列に表示されます。

Img

③ 「A+Bが押されており、ゲームが開始されていない」かどうかを判断します。はいの場合、起動が初期状態としてマークされている場合、まず起動状態をマークし、短い遅延の後にもう一度ボタンが押されているかを確認します。押されている場合は、ゲームをリセットし(reset_game関数を呼び出す)、時間を記録します。そうでない場合は、起動マークをキャンセルします。

Img

④ 以下の関数はゲームを初期状態にリセットします。状態を「gaming」(game_state=1)に設定し、プレイヤーを初期位置に配置します。ブロックはランダムな列(0〜4)と0行目に表示され、スコアはゼロになります。最後に、A/Bの押下はトリガーされていないとマークされ、マトリックスはクリアされます。

Img

⑤ ゲームの状態が0-初期状態(電源投入後にゲームが開始されていない)の場合、表示されるアイコンが点滅します。

Img

2-ゲームオーバーの場合、スコアはフラッシュカウント(flash_count)に応じて制御されます。カウントが3未満の場合、「スコア表示 → 短い遅延 → ディスプレイクリア → 短い遅延 → カウント+1」を繰り返します。カウントが3に達すると、常にスコアを表示し、遅延を延長します。

Img

1-ゲーム中の状態では、押下マークをトリガーせずにCを押すと、プレイヤーの列が-1になり、ボタンCがトリガーされたとマークされます(アンチジッターのために遅延があります)。押下マークをトリガーせずにEを押し、プレイヤーの列が4未満の場合、列が+1になり、Eがトリガーされます(遅延があります)。アクションが実行されない場合、対応するボタンのトリガーマークはリセットされます。

Img

⑧ 現在の時間と前回のブロック移動時間の差を計算します。この差がブロック速度の閾値を超えている場合、ブロック移動時間を更新し、ブロックの行を+1します。行が4を超えた場合(境界に到達した場合)、ブロックをランダムな列にリセットし、行をゼロにし、スコアを+1します。

衝突検出およびゲームグラフィックレンダリング関数を呼び出して、ブロックの自動進行、境界リセット、スコアの蓄積、およびリアルタイムのゲーム状態更新を実現します。

衝突検出およびゲームグラフィックレンダリング関数を呼び出して、ブロックの自動進行、境界リセット、スコアの蓄積、およびリアルタイムのゲーム状態更新を実現します。

Img

⑨ ゲームオーバーかどうかを判断します。まず「ブロックの列がプレイヤーの列と一致するか」と「ブロックの行がプレイヤーの行と一致するか」を確認します。両方の条件が満たされた場合(つまり、ブロックがプレイヤーと重なっている場合)、ゲームを状態2(ゲームオーバー)に設定し、ディスプレイをクリアしてフラッシュカウントをリセットします。

「衝突でゲームオーバー。」

Img

⑩ ゲームの視覚効果をレンダリングします。まずディスプレイをクリアし、次にプレイヤーの固定行と現在の列の位置に明るさ255(プレイヤー)の点をプロットします。ゲームが開始されている場合(game_state=1)、ブロックの行と列に明るさ85(ブロック)の点をプロットします。これにより、明るさによってブロックとプレイヤーを区別できます。

Img

4.2.5.5 テスト結果

Img

コードを書き込んだ後、micro:bitボードをゲームパッドのスロットに挿入し(電池が取り付けられていることを確認)、「ON」に切り替えます。

電源投入後、0-初期状態になり、マトリックスは2つの四角いアイコンを点滅させます。

AとBを押し(少なくとも1秒間)、ゲームを開始します(1-ゲーム中の状態)。ブロックがランダムな列に落下します。C/Eを押して左右に移動できます。ブロックを回避するたびに、スコアが+1されます。

衝突でゲームオーバーになり(2-ゲームオーバー)、最終スコアがマトリックスに表示されます。もう一度プレイしたい場合は、AとBをもう一度押します。ゲームを終了するには電源をオフにします(DIPスイッチを「OFF」に切り替えます)。

Img

ヒント: ボードが応答しない場合は、micro:bitボードの背面にあるリセットボタンを押してください。

Img