簡単なゲーム

【Pygame Zero】簡単なゲーム19:ライトで透明なboonを探せ

ratch2025

こんにちは!
「Pythonしよう!楽しく学べるプログラミング教室」の
ラッチ先生です

ラッチ先生
ラッチ先生
スック
スック

スックです。よろしくね!

今回のプロジェクトは、こちら!

BGM提供: DOVA-SYNDROME
https://dova-s.jp/
・ 「不気味な洋館」 written by のる

効果音提供:効果音ラボ
https://soundeffect-lab.info/
・ 「ピアノの単音」: 演出
・ 「小鼓(こつづみ)」: 演出

ラッチ先生
ラッチ先生

基礎プログラムと 画像を入れた
「簡単なゲーム19: かくれんぼ!」zipフォルダを
ダウンロードしてください

pythonしよう!簡単なゲーム19:ライトとboonを表示するを解説
pythonしよう!簡単なゲーム19:かくれんぼzipの中身
スック
スック

このゲームで使用している音声ファイルは、
以下のサイトからお借りしています。

各自でダウンロードして、該当するフォルダに入れてください!

BGM提供: DOVA-SYNDROME
https://dova-s.jp/
・ 「不気味な洋館」 written by のる

効果音提供:効果音ラボ
https://soundeffect-lab.info/
・ 「ピアノの単音」: 演出
・ 「小鼓(こつづみ)」: 演出

pythonしよう!簡単なゲーム19:かくれんぼzipの中身
スポンサーリンク

ライトを マウスで 動かす

3秒ごと ランダムな場所で出現する

ライトに触れたら 出現する

結果発表

pythonしよう!簡単なゲーム19:結果発表の解説

プログラムを 実行してみよう




ラッチ先生
ラッチ先生

今回の「かくれんぼ!」では、
・ライトと boonボーンの当たり判定
・ boonボーンが出現する場所を ランダムに決める
プログラムがあります。

そこで、2つのモジュールを 用意しました

pythonしよう!簡単なゲーム19:pgzhelperモジュールの解説
pythonしよう!簡単なゲーム19:randomモジュールの解説
スック
スック

モジュールとは、
関数やプログラムが書かれているファイルのことだよ

ラッチ先生
ラッチ先生

Actorアクター()クラスが入っている変数 boonボーン には、
boonボーンを動かす属性(データ)やメソッド(命令)が あります。

pythonしよう!簡単なゲーム19:変数boonの解説
スック
スック

ライトも 同じだよ

そして、属性(データ)やメソッド(命令)は、
『 . (ドット)』を付ければ、使えるよ




ラッチ先生
ラッチ先生

今回のプログラミングのポイントが こちらです

スック
スック

set_alpha( )メソッドを使って、boonを見えるようにするよ




ラッチ先生
ラッチ先生

変数resultリザルト を 作成して
結果発表するまでは、ライトをマウスで動かすようにします

Python
bg_image = "bg"
result = None #1 変数resultを宣言 初期値:None

def on_mouse_move(pos): #2 on_mouse_move関数を 定義する
    if not result:     #3 もし 変数resultに データが入っていなければ
        light.pos = pos #4 ライトの座標に 引数pos:マウスの座標を 代入する

def update():
Q
on_mouse_move関数 とは?
pythonしよう!簡単なゲーム19:on_mouse_move関数の解説
スック
スック

ライトが 動き出したね




ラッチ先生
ラッチ先生

次に、
boonボーンをランダムに動かすboonボーン_moveムーヴ関数を作成しましょう

pythonしよう!簡単なゲーム19:schedule()メソッドの解説
Python
result = None

def boon_move(): #1 boon_move関数を 定義する
    if not result: #2 変数resultに データが入っていなければ
        x = random.randint(50, WIDTH-50) #3 変数xに 50~750からランダムに選んだ数値を 代入する
        y = random.randint(50, HEIGHT-50) #4 変数yに 50~550からランダムに選んだ数値を 代入する
        boon.pos = x, y #5 boonの座標に、変数x, 変数yの数値を 代入する
        clock.schedule(boon_move, 3) #6 3秒後にboon_move関数を実行する

boon_move() #7 boon_move関数を 実行する

def on_mouse_move(pos): 
スック
スック

boonボーンも動いたよ




ラッチ先生
ラッチ先生

まず、boonボーン がライトに触れたら 動きが止まり、
ライトが離れたらboonボーン が 動き出すプログラムを作りましょう

スック
スック

ライトが離れるとboonボーンは すぐ違うところに 出現するね

ラッチ先生
ラッチ先生

boonボーン に プロパティ:onオン を追加します。
ライトに触れたら、Trueトゥルー。 触れてない時は、Falseフォルス。

そして、変数checkチェック_touchタッチ で
boonボーン が ライトに触れたかどうか 判定してもらいます

pythonしよう!簡単なゲーム19:プロパティ:onの解説
pythonしよう!簡単なゲーム19:ポイント条件を変数に代入の解説
Q
bool 型 とは?
pythonしよう!簡単なゲーム19:bool型の解説

★bool( )を使う理由★

collide_pixel( )メソッドは、
 ・ 触れたら その地点の座標(x, y)
 ・ 触れてなければ None  
を 返します。

変数check_touch に True か Falseが入るようにするため
bool()関数を使いました。

Python
boon = Actor("boon", (400, 300))
boon.on = False #1 プロパティonに Falseを設定する
Python
result = None

def boon_alpha(): #2 boon_alpha関数を 定義する
    check_touch = bool(boon.collide_pixel(light)) #3 変数check_touchに 条件 ライトに触れるを 代入する

    if check_touch != boon.on: #4 もし 変数check_touchが プロパティonと違ったら
        boon.on = check_touch  #5 プロパティonに 変数check_touchのデータを代入する

        if boon.on: #6 もし プロパティonが Trueなら
            clock.unschedule(boon_move) #7 boon_move関数を 止める
        else: #8 その他
            boon_move() #9 boon_move関数を 実行する

def boon_move(): 
Python
def update():
    boon_alpha() #10 boon_alpha関数を 実行する
Q
unschedule( )メソッドとは?
pythonしよう!簡単なゲーム19:unschedule()メソッドの解説
スック
スック

変数checkチェック が変更したら プロパティonオン も変わるね

ラッチ先生
ラッチ先生

さあ、boonボーンを透明にしていきましょう。

プロパティ: alphaアルファー を追加して、ここにアルファ値を入れます。

Python
boon = Actor("boon", (400, 300))
boon.on = False
boon.alpha = 0 #1 プロパティalphaに 0を設定する
Python
def boon_alpha(): 
    check_touch = bool(boon.collide_pixel(light)) 

    if check_touch != boon.on: 
        boon.on = check_touch  

        if boon.on: 
            clock.unschedule(boon_move) 
        else: 
            boon_move()
            boon.alpha = 0 #5 プロパティalphaを 0にする

    if boon.on: #2 もし プロパティonが Trueなら
        boon.alpha = min(255, boon.alpha + 1)  #3 プロパティalphaに 255と プロパティalphaに1ずつ増やす値の小さいほうを設定する

    boon._surf.set_alpha(boon.alpha) #4 boonの画像のアルファ値を プロパティalpha値にする

def boon_move(): 
Q
min( )関数とは?
pythonしよう!簡単なゲーム19:min()関数の解説
スック
スック

boonボーンが 出現したね




pythonしよう!簡単なゲーム19:結果発表の解説
ラッチ先生
ラッチ先生

タイマーを 作ります。

30秒以内で boonボーン を 見つけられたらクリアにします。

pythonしよう!簡単なゲーム19:ポイント:タイマーの作り方の解説
Python
bg_image = "bg"
result = None
time = 30 #1 変数time 初期値30

def timer(): #2 timer関数を 定義する
    global time #3 グローバル変数time

    if not result: #4 もし 変数resultに データが入っていなければ
        time -= 0.1 #5 変数timeを 0.1 ずつ減らす
        time = round(time, 1) #6 変数timeを 小数第1位までの数値にする

clock.schedule_interval(timer, 0.1) #7 0.1秒ずつtimer関数を 実行する
Python
def draw():
    screen.blit(bg_image, (0, 0))
    screen.draw.text(f"TIME: {time}",
                    (20, 20),
                    color="blue",
                    fontsize=70) #8 タイムを 表示する
    boon.draw()
    light.draw()
Q
round() メソッドとは?
pythonしよう!簡単なゲーム19:round()メソッドの解説
Q
schedule_interval() メソッドとは?
pythonしよう!簡単なゲーム19:schedule_interval()メソッドの解説
Q
text() メソッドとは?
pythonしよう!簡単なゲーム19:text()メソッドの解説
Q
f 文字列 とは?
pythonしよう!簡単なゲーム19:f 文字列の解説
スック
スック

あらら…⁉ タイマーがマイナスになっちゃった…

ラッチ先生
ラッチ先生

大丈夫です。
あとでちゃんと「0」で止まるようにします。

それでは、setセット_resultリザルト関数
クリアと ゲームオーバーのプログラムを 作成しましょう

pythonしよう!簡単なゲーム19:ポイントset?result関数の解説
Python
time = 30

def set_result(result_val,
               bg,
               costume,
               sound): #2 set_result関数を定義する
    global result, bg_image #3 グローバル変数 result, bg_image

    result = result_val #4 変数resultに 引数result_valを代入する
    music.stop() #5 BGMを 止める
    clock.unschedule(boon_move) #6 boon_move関数を 止める
    boon.alpha = 255 #7 プロパティalphaを 255に設定する
    bg_image = bg #8 変数bg_imageに 引数bgを代入する
    boon.image = costume #9 プロパティimageに 引数costumeを代入する
    sound.play() #10 引数soundを 再生する

def timer(): 
Python
music.play("不気味な洋館") #1 BGMを流す

pgzrun.go()
Q
効果音について
pythonしよう!簡単なゲーム19:soundsオブジェクトの解説
スック
スック

効果音ラボサイトからの音源は、MP3形式です。
しかし、pygame zeroプログラムでは、MP3形式は使えません。

WAV形式に 変換して フォルダsoundsに 入れてください

Q
music モジュールについて
pythonしよう!簡単なゲーム19:musicモジュールの解説
Q
unschedule( )メソッドについて
pythonしよう!簡単なゲーム19:unschedule()メソッドの解説
ラッチ先生
ラッチ先生

それでは、setセット_resultリザルト関数を使って
タイマーが 0 になったら ゲームオーバーにするプログラムを作ります

Python
def timer(): 
    global time 

    if not result: 
        time -= 0.1 
        time = round(time, 1)

        if time < 0: #1 もし 変数timeが 0未満になったら
            time = 0 #2 変数timeに 0 を設定する
            set_result("over",
                       "bg_over",
                       "boon_over",
                       sounds.ピアノの単音) #3 set_result関数を 実行する

BGM提供: DOVA-SYNDROME
https://dova-s.jp/
・ 「不気味な洋館」 written by のる

効果音提供:効果音ラボ
https://soundeffect-lab.info/
・ 「ピアノの単音」: 演出

スック
スック

あそこに boonボーンが いたのね

ラッチ先生
ラッチ先生

最後に、setセット_resultリザルト関数を使って
ライトに当たって
プロパティalphaアルファー が 255になったらゲームクリアです

Python
def timer(): 
    global time 

    if not result: 
        time -= 0.1 
        time = round(time, 1)

        if time < 0: 
            time = 0 
            set_result("over",
                       "bg_over",
                       "boon_over",
                       sounds.ピアノの単音)

        elif boon.alpha == 255: #1 もし プロパティalphaが 255なら
            set_result("clear",
                       "bg_clear",
                       "boon_clear",
                       sounds.小鼓) #2 set_result関数を 実行する

BGM提供: DOVA-SYNDROME
https://dova-s.jp/
・ 「不気味な洋館」 written by のる

効果音提供:効果音ラボ
https://soundeffect-lab.info/
・ 「小鼓(こつづみ)」: 演出

スック
スック

今回の学習は、これで 終了! おつかれさま




ラッチ先生
ラッチ先生

今回は、
boonボーン 画像の alphaアルファー 値を使った かくれんぼゲームを作りました。

かくれんぼ!
Python
import pgzrun
from pgzhelper import * 
import random  

WIDTH = 800
HEIGHT = 600

boon = Actor("boon", (400, 300))
boon.on = False 
boon.alpha = 0 

light = Actor("light", (100, 100))

bg_image = "bg"
result = None 
time = 30 

def set_result(result_val,
               bg,
               costume,
               sound): 
    global result, bg_image 

    result = result_val 
    music.stop() 
    clock.unschedule(boon_move) 
    boon.alpha = 255 
    bg_image = bg 
    boon.image = costume 
    sound.play() 
    
def timer(): 
    global time 

    if not result: 
        time -= 0.1 
        time = round(time, 1)
        
        if time < 0: 
            time = 0 
            set_result("over",
                       "bg_over",
                       "boon_over",
                       sounds.ピアノの単音) 
            

        elif boon.alpha == 255: 
            set_result("clear",
                       "bg_clear",
                       "boon_clear",
                       sounds.小鼓) 
            
clock.schedule_interval(timer, 0.1) 

def boon_alpha(): 
    check_touch = bool(boon.collide_pixel(light))

    if check_touch != boon.on: 
        boon.on = check_touch  

        if boon.on: 
            clock.unschedule(boon_move) 
        else: 
            boon_move() 
            boon.alpha = 0 

    if boon.on: 
        boon.alpha = min(255, boon.alpha + 1)  

    boon._surf.set_alpha(boon.alpha) 

def boon_move(): 
    if not result: 
        x = random.randint(50, WIDTH-50) 
        y = random.randint(50, HEIGHT-50) 
        boon.pos = x, y 
        clock.schedule(boon_move, 3) 

boon_move() 

def on_mouse_move(pos): 
    if not result:     
        light.pos = pos 
    
def update():
    boon_alpha() 

def draw():
    screen.blit(bg_image, (0, 0))
    screen.draw.text(f"TIME: {time}",
                     (20, 20),
                     color="blue",
                     fontsize=70) 
    boon.draw()
    light.draw()

music.play("不気味な洋館") 

pgzrun.go()
ラッチ先生
ラッチ先生

setセット_alphaアルファー( )メソッドを使えば
キャラクター画像の 透明度が 変えることが できます

スック
スック

みなさんも、 かくれんぼゲームを作ってみよう!

それじゃあ、またね!

スポンサーリンク
ABOUT ME
ラッチ先生
ラッチ先生
こんにちは!
「Pythonしよう!楽しく学べるプログラミング教室」の学長、ラッチです。

scratchのように楽しく学べるPython講座です。
・図やアニメーションを使って、わかりやすく楽しく学べる!
・毎回の授業が新しい発見の連続!
・プログラミングの考え方が身につき、自分のやりたいことが形にできるように。

この3点をモットーにサイトを立ち上げました。 よろしくお願いします
記事URLをコピーしました