見出し画像

ラズベリーパイ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ヶ月目


いいなと思ったら応援しよう!