ラズベリーパイpico爆弾ゲーム作ってみた
準備するもの
Raspberry Pi Pico H
Pico Display Pack
USBケーブル(Type-A to micro-B)
参考(セットアップ・環境構築は下記を参考にしてください。)
【レビュー】Raspberry Pi Picoは何ができる?ピコとラズパイ 5つの違いを初心者向けに徹底解説(そぞらさん)
Raspberry Pi Pico向けの極小ディスプレイ「Pico Display Pack」を使ってみた!
コード (MicroPython)
import time # 時間関連のモジュールをインポート
import random # 乱数生成のモジュールをインポート
from picographics import PicoGraphics, DISPLAY_PICO_DISPLAY, PEN_P8 # PicoGraphicsライブラリからクラスと定数をインポート
import machine # machineモジュールをインポート
display = PicoGraphics(display=DISPLAY_PICO_DISPLAY, pen_type=PEN_P8, rotate=0) # PicoGraphicsのインスタンスを作成
display.set_backlight(1.0) # バックライトの輝度を設定
WIDTH, HEIGHT = display.get_bounds() # ディスプレイの幅と高さを取得
# 色を定義
WHITE = display.create_pen(255, 255, 255) # 白色のペンを作成
BLACK = display.create_pen(0, 0, 0) # 黒色のペンを作成
RED = display.create_pen(255, 0, 0) # 赤色のペンを作成
ORANGE = display.create_pen(255, 165, 0) # オレンジ色のペンを作成
GREEN = display.create_pen(0, 255, 0) # 緑色のペンを作成
# ボタンのピンを定義
button_a = machine.Pin(12, machine.Pin.IN, machine.Pin.PULL_UP) # ボタンAのピンを設定
button_b = machine.Pin(13, machine.Pin.IN, machine.Pin.PULL_UP) # ボタンBのピンを設定
button_x = machine.Pin(14, machine.Pin.IN, machine.Pin.PULL_UP) # ボタンXのピンを設定
button_y = machine.Pin(15, machine.Pin.IN, machine.Pin.PULL_UP) # ボタンYのピンを設定
# 爆弾を描画する関数
def draw_bomb(x, y, color, size=30): # 爆弾の描画関数を定義
display.set_pen(color) # - 指定された色のペンを設定
display.circle(x, y, size) # - 指定された座標と大きさで円を描画
display.set_pen(WHITE) # - 白色のペンを設定
display.line(x, y - size, x, y - size - 15) # - 爆弾の導火線を描画
# 爆発エフェクトの関数
def explosion(): # 爆発エフェクトの関数を定義
for _ in range(3): # - 3回繰り返し
display.set_pen(RED) # -- 赤色のペンを設定
display.clear() # -- 画面をクリア
display.update() # -- 画面を更新
time.sleep(0.5) # -- 0.5秒待機
display.set_pen(ORANGE) # -- オレンジ色のペンを設定
display.clear() # -- 画面をクリア
display.update() # -- 画面を更新
time.sleep(0.5) # -- 0.5秒待機
display.set_pen(RED) # - 赤色のペンを設定
display.text("THE END", WIDTH // 2 - 40, HEIGHT // 2 - 20, 0, 6) # - "THE END"のテキストを描画
display.update() # - 画面を更新
time.sleep(2) # - 2秒待機
# ゲームループ
while True: # 無限ループ
# 画面をクリア
display.set_pen(WHITE) # - 白色のペンを設定
display.clear() # - 画面をクリア
# 爆弾を描画
draw_bomb(WIDTH // 4, HEIGHT // 4, BLACK) # - 左上の爆弾を描画
draw_bomb(WIDTH * 3 // 4, HEIGHT // 4, BLACK) # - 右上の爆弾を描画
draw_bomb(WIDTH // 4, HEIGHT * 3 // 4, BLACK) # - 左下の爆弾を描画
draw_bomb(WIDTH * 3 // 4, HEIGHT * 3 // 4, BLACK) # - 右下の爆弾を描画
# ランダムに不発弾を選択
dud_bomb = random.randint(0, 3) # - 0から3の間のランダムな整数を選択
# 安全な位置を初期化
safe_positions = [False, False, False, False] # - 安全な位置のリストを初期化
# ボタンが押されるのを待つ
while True: # - ボタンが押されるまでループ
if button_a.value() == 0: # -- ボタンAが押された場合
if dud_bomb == 0: # --- 不発弾が0の場合
explosion() # ---- 爆発エフェクトを表示
break # ---- ループを抜ける
else: # --- 不発弾が0以外の場合
safe_positions[0] = True # ---- 安全な位置を更新
display.set_pen(GREEN) # ---- 緑色のペンを設定
display.text("SAFE", WIDTH // 2 - 30, HEIGHT // 2 - 15, 0, 4) # ---- "SAFE"のテキストを描画
display.update() # ---- 画面を更新
time.sleep(1) # ---- 1秒待機
display.set_pen(WHITE) # ---- 白色のペンを設定
display.text("SAFE", WIDTH // 2 - 30, HEIGHT // 2 - 15, 0, 4) # ---- "SAFE"のテキストを消去
elif button_b.value() == 0: # -- ボタンBが押された場合
if dud_bomb == 1: # --- 不発弾が1の場合
explosion() # ---- 爆発エフェクトを表示
break # ---- ループを抜ける
else: # --- 不発弾が1以外の場合
safe_positions[1] = True # ---- 安全な位置を更新
display.set_pen(GREEN) # ---- 緑色のペンを設定
display.text("SAFE", WIDTH // 2 - 30, HEIGHT // 2 - 15, 0, 4) # ---- "SAFE"のテキストを描画
display.update() # ---- 画面を更新
time.sleep(1) # ---- 1秒待機
display.set_pen(WHITE) # ---- 白色のペンを設定
display.text("SAFE", WIDTH // 2 - 30, HEIGHT // 2 - 15, 0, 4) # ---- "SAFE"のテキストを消去
elif button_x.value() == 0: # -- ボタンXが押された場合
if dud_bomb == 2: # --- 不発弾が2の場合
explosion() # ---- 爆発エフェクトを表示
break # ---- ループを抜ける
else: # --- 不発弾が2以外の場合
safe_positions[2] = True # ---- 安全な位置を更新
display.set_pen(GREEN) # ---- 緑色のペンを設定
display.text("SAFE", WIDTH // 2 - 30, HEIGHT // 2 - 15, 0, 4) # ---- "SAFE"のテキストを描画
display.update() # ---- 画面を更新
time.sleep(1) # ---- 1秒待機
display.set_pen(WHITE) # ---- 白色のペンを設定
display.text("SAFE", WIDTH // 2 - 30, HEIGHT // 2 - 15, 0, 4) # ---- "SAFE"のテキストを消去
elif button_y.value() == 0: # -- ボタンYが押された場合
if dud_bomb == 3: # --- 不発弾が3の場合
explosion() # ---- 爆発エフェクトを表示
break # ---- ループを抜ける
else: # --- 不発弾が3以外の場合
safe_positions[3] = True # ---- 安全な位置を更新
display.set_pen(GREEN) # ---- 緑色のペンを設定
display.text("SAFE", WIDTH // 2 - 30, HEIGHT // 2 - 15, 0, 4) # ---- "SAFE"のテキストを描画
display.update() # ---- 画面を更新
time.sleep(1) # ---- 1秒待機
display.set_pen(WHITE) # ---- 白色のペンを設定
display.text("SAFE", WIDTH // 2 - 30, HEIGHT // 2 - 15, 0, 4) # ---- "SAFE"のテキストを消去
display.update() # -- 画面を更新
if all(safe_positions): # -- すべての位置が安全な場合
break # --- ループを抜ける
time.sleep(3) # - 3秒待機
実際の動画はこちら
「爆弾ゲーム!」を使えば、合コンは大盛り上がり。君はモテモテだ!!
我が家では、家事をどちらがやるかを決める際に使ったり…
意外とハマります・・・
ではまた会いましょう!おもしろ創造品をアップしていきます。
Xのフォローをお願います!
R太郎(@masukusoro)
・素人→ポルシェ系生成AIエンジニア
・プログラミング歴1ヶ月目