簡単なゲーム

【Pygame Zero】簡単なゲーム02:色を当てろ!風船スロットゲーム

ratch2025

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

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

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

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

BGM提供:DOVA-SYNDROME
https://dova-s.jp/
Starlight_Dreamsby Kei Morimoto 

効果音提供:Chisato’s Website
https://chisatosound.sakura.ne.jp/index.html
「Accent. Brilliant [01] (Low. Fast)」:アクセント
「Accent. Brilliant [02] (Low)」:アクセント
・ 「Kiga Nukeru [01] (Long)」:アニメ

ラッチ先生
ラッチ先生

基礎プログラムと 画像を入れた
「簡単なゲーム02 風船スロット!」zipフォルダを ダウンロードしてください

pythonしよう!簡単なゲーム02:風船を表示する
スック
スック

今回は、スクリーンの色を “lightyellowライトイエロー“に したよ

「原色大事典」サイトには、URL:https://www.colordic.org/
pygame zeroで使える色が載っています

pythonしよう!簡単なゲーム02:風船スロット!zipの中身
スポンサーリンク

スロット操作:スペースキーで準備・回転・一時停止

当たり判定

BGM・効果音を 入れる (BGM音量調整)

BGM提供:DOVA-SYNDROME
https://dova-s.jp/
Starlight_Dreamsby Kei Morimoto 

効果音提供:Chisato’s Website
https://chisatosound.sakura.ne.jp/index.html
「Accent. Brilliant [01] (Low. Fast)」:アクセント
「Accent. Brilliant [02] (Low)」:アクセント
・ 「Kiga Nukeru [01] (Long)」:アニメ

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

ラッチ先生
ラッチ先生

今回の「風船スロット!」では、
・ 風船を クリックする
・ ボールのコスチュームの切り替え
・ セリフを 言う
プログラムがあります。

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

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

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

ラッチ先生
ラッチ先生

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

pythonしよう!簡単なゲーム02:変数balloonの詳しい解説
スック
スック

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

ラッチ先生
ラッチ先生

今回は、
風船の画像の切り替えで スロットを作っていきます。

スック
スック

この3つのステップで
コスチュームを 切り替えることができるよ

pythonしよう!簡単なゲーム02:ポイント2の詳しい解説
スック
スック

リストbuttonsボタンズを作成して、その中に3個のボタンを入れるよ

スック
スック

3つに 分けたよ

ラッチ先生
ラッチ先生

まず、風船の画像を プロパティ:imagesイメージズに入れ
animateアニメイト( ) メソッドで 画像の切り替えをしよう

Python
balloon.images = ["balloon_red", "balloon_blue", "balloon_green"] #1 プロパティimagesに 3つの画像を 代入する
balloon.fps = 20  #2 プロパティfpsに 20に設定する
Python
def update():         #3 更新する
    balloon.animate() #4 コスチュームを 切り替える
スック
スック

風船の回転速度を変えたい時は、
fps(フレームズ・パー・セコンド)の数値を 変えようね

ラッチ先生
ラッチ先生

defデフ onオン_keyキー_downダウン(keyキー): 関数を使って
スペースキーを 押したら 風船スロットが 開始するようにしましょう

Python
balloon.stop()               #1 風船の画像の入れ替えを 止める

game = "ready"               #2 変数gameを 宣言する 初期値:ready
Python
def on_key_down(key):        #3 キーを押したときの関数を定義する
    global game              #4 グローバル変数 game

    if key == keys.SPACE:    #5 もし キーが スペースキーなら
        if game == "ready":  #6 もし 変数gameが readyなら
            game = "play"    #7 変数gameに playを 代入する
            balloon.play()   #8 風船の画像の切り替えを 再生する
ラッチ先生
ラッチ先生

風船スロットを
3個の風船ボタンがクリックされたら 一時停止するようにします

pythonしよう!簡単なゲーム02:ポイント2の詳しい解説
Python
buttons = []           #1 リストbuttonsに 空リストを代入する

for i in range(3):     #2 3回繰り返す
    x = 150 + 250 * i  #3 x座標に 150 + 250 * i (0, 1, 2)  
    y = 400            #4 y座標に 400を代入する
    button = Actor(balloon.images[i], (x, y))  #5 ボタンオブジェクト生成する
    buttons.append(button)  #6 リストbuttonsに 追加する

def draw():
    screen.fill("lightyellow")
    balloon.draw()
    for button in buttons:  #7 リストbuttonsから 取り出す
        button.draw()       #8 ボタンを 表示する
pythonしよう!簡単なゲーム02:風船スロット③の解説
pythonしよう!簡単なゲーム02:for in range()関数の解説
スック
スック

風船のx座標は、
forフォー i inイン rangeレンジ(3): 関数の カウンター変数「i」を 使ったよ

ラッチ先生
ラッチ先生

collidepointコライドポイント_pixelピクセル(posポス) メソッドを使って
風船が クリックされたら 変数gameゲームを “resultリザルト“にして
スロットを 止めるよ

pythonしよう!簡単なゲーム02:ポイント2の解説
pythonしよう!簡単なゲーム02:collidepoint_pixel()メソッドの解説
Python
def on_mouse_down(pos):    #1 マウスをクリックした時の定義 引数:pos
    global game            #2 変数game

    for button in buttons: #3 ボタンを取り出す
        if button.collidepoint_pixel(pos):  #4 もし ボタンをクリックしたら
            if game == "play":   #5 もし 変数gameが playなら
                game = "result"  #6 変数gameに resultを代入する
                balloon.pause()  #7 風船の画像の切り替えを一時停止する
スック
スック

おお! いいねぇ

ラッチ先生
ラッチ先生

もう1回、スペースキーを押したら
変数gameゲームreadyレディにして、風船をリセットします。

Python
def on_key_down(key): 
    global game     

    if key == keys.SPACE: 
        if game == "ready": 
            game = "play"   
            balloon.play()  

        elif game == "result":  #1 もし 変数gameが resultなら
            game = "ready"      #2 変数gameに readyを 代入する
            balloon.stop()      #3 風船を 止める
スック
スック

スロットに なったね!

ラッチ先生
ラッチ先生

つぎは、当たり判定です。

クリックしたボタンの画像と 一時停止した風船の画像が
・ 同じなら 当たり。
・ それ以外は はずれ

pythonしよう!簡単なゲーム02:当たり判定の解説

それぞれの背景画像を 表示します。

背景画像 を 表示する ポイント

1,背景画像を入れる『変数:bgビージー_imageイメージ』を 宣言します。

初期値は、「Noneナン」です。
つまり、背景画像が ない 空です。

pythonしよう!簡単なゲーム02:変数bg_image

2,当たり判定の時に、それぞれの背景画像を 代入します。

pythonしよう!簡単なゲーム02:変数bg_image フォルダ内bg_bingo
pythonしよう!簡単なゲーム02:変数bg_image フォルダ内bg_ohno
Python
bg_image = None   #1 変数bg_image を宣言 初期値:None
Python
def draw():
    screen.fill("lightyellow")
    if game == "result":   #2 もし 変数gameが resultなら     
        screen.blit(bg_image, (0, 0))  #3 背景画像を 表示する
    balloon.draw()
Python
def on_mouse_down(pos): 
    global game, bg_image  #4 グローバル変数bg_image

    for button in buttons: 
        if button.collidepoint_pixel(pos): 
            if game == "play": 
                game = "result" 
                balloon.pause() 

                if button.image == balloon.image:  #5 もし ボタンの画像と風船の画像が 同じなら
                    bg_image = "bg_bingo"  #6 変数bg_imageに 画像"bg_bingo"を 代入する

                else:     #7 その他は
                    bg_image = "bg_ohno"  #8 変数bg_imageに 画像"bg_ohno"を 代入する
pythonしよう!簡単なゲーム02:blit(  )メソッドの解説
スック
スック

変数に 画像も入れられるんだね

blitブリット( ) メソッドを使って 背景画像を表示したよ

ラッチ先生
ラッチ先生

sayセイ( )メソッドを使って
風船に 2秒間 セリフを 言わせます

pythonしよう!簡単なゲーム02:say(  )メソッドの解説
Python
def draw():
    screen.fill("lightyellow")
    if game == "result":       
        screen.blit(bg_image, (0, 0)) 
    balloon.draw()
    for button in buttons: 
        button.draw() 
    text_display.draw(screen)  #1 テキストディスプレイを 装備する
Python
def on_mouse_down(pos): 
    global game, bg_image 

    for button in buttons: 
        if button.collidepoint_pixel(pos): 
            if game == "play": 
                game = "result" 
                balloon.pause() 

                if button.image == balloon.image: 
                    bg_image = "bg_bingo"  
                    balloon.say("Bingo!", 2, color = "darkgreen", size=80)  #2 Bingo!と 2秒間言う

                else:  
                    bg_image = "bg_ohno" 
                    balloon.say("Oh no!", 2, color= "darkgreen", size=80)   #3 Oh no!と 2秒間言う       
スック
スック

あれっ⁉ 
スペースキーを押して風船をリセットしたのに
まだ、セリフを言ってるよ

ラッチ
ラッチ

おぉぉぉ…と、いけない!

isイズ_talkingトーキング( ) メソッドを使って
セリフがない時にリセットするようにしましょう

pythonしよう!簡単なゲーム02:is_talking(  )メソッドの解説
Python
def on_key_down(key): 
    global game     

    if key == keys.SPACE: 
        if game == "ready": 
            game = "play"   
            balloon.play()  

        elif game == "result" and not balloon.is_talking():  #1 もし 変数gameが result で 風船がセリフを言ってないなら
            game = "ready" 
            balloon.stop() 
スック
スック

これで、セリフが終わってから リセットできるね

BGM提供:DOVA-SYNDROME
https://dova-s.jp/
Starlight_Dreamsby Kei Morimoto 

効果音提供:Chisato’s Website
https://chisatosound.sakura.ne.jp/index.html
「Accent. Brilliant [01] (Low. Fast)」:アクセント
「Accent. Brilliant [02] (Low)」:アクセント
・ 「Kiga Nukeru [01] (Long)」:アニメ

ラッチ先生
ラッチ先生

それでは、BGMを 入れてみましょう

Pythonパイソン zeroゼロには、musicミュージックオブジェクトが標準装備であります。
やり方、以下の手順です

pythonしよう!簡単なゲーム02:MP3ファイル

☆ Pygame zeroでは英語の大文字が 使えません。 エラーが出ます
 小文字 に直します

pythonしよう!簡単なゲーム02:mousicフォルダの解説
pythonしよう!簡単なゲーム02:musicモジュールの解説
Python
music.play("starlight_dreams")  #1 BGMを 入れる
スック
スック

今回のプログラムに「DOVA-SYNDROME」サイトから
Starlight_Dreams by Kei Morimoto
 BGMの曲として お借りしました。 ありがとうございます。

ラッチ先生
ラッチ先生

つぎに
効果音をつけましょう! 
 ・ スペースキーを 押した時
 ・ 当たり
 ・ はずれ

Pythonパイソン zeroゼロには、soundsサウンズオブジェクトが標準装備であります。

次の手順で 行います

pythonしよう!簡単なゲーム02:WAVファイル
pythonしよう!簡単なゲーム02:WAVファイル
pythonしよう!簡単なゲーム02:WAVファイル
pythonしよう!簡単なゲーム02:soundsフォルダの解説
pythonしよう!簡単なゲーム02:play()メソッドの解説
スック
スック

今回のプログラムに
Chisato’s Website」サイトから
「accent_brilliant_01_high_fast」:アクセント
「accent_brilliant_02_low」:アクセント
「kiga_nukeru_01_long」:アニメ

 効果音を お借りしました。 ありがとうございます。

Python
def on_key_down(key): 
    global game     

    if key == keys.SPACE: 
        if game == "ready": 
            game = "play"   
            balloon.play()  
            sounds.accent_brilliant_01_high_fast.play()  #1 効果音を入れる
Python
def on_mouse_down(pos): 
    global game, bg_image 

    for button in buttons: 
        if button.collidepoint_pixel(pos): 
            if game == "play": 
                game = "result" 
                balloon.pause() 

                if button.image == balloon.image: 
                    bg_image = "bg_bingo" 
                    balloon.say("Bingo!", 2, color = "darkgreen", size=80) 
                    sounds.accent_brilliant_02_low.play()  #2 効果音を入れる
                    
                else:  
                    bg_image = "bg_ohno"  
                    balloon.say("Oh no!", 2, color= "darkgreen", size=80) 
                    sounds.kiga_nukeru_01_long.play()  #3 効果音を入れる
スック
スック

BGMの音量を もう少し小さくした方がいいと思うな

ラッチ先生
ラッチ先生

そうですね。
ちょっと、効果音の音が 聞き取りづらいですね

setセット_volumeボリューム( ) メソッドを使って
スペースキーを押したら、BGMの音量を 40%に します

Python
def on_key_down(key): 
    global game     

    if key == keys.SPACE: 
        if game == "ready": 
            game = "play"   
            balloon.play()  
            sounds.accent_brilliant_01_high_fast.play() 
            music.set_volume(0.4)  #1 BGMの音量設定40%に する
スック
スック

これで、効果音も 聞きやすくなったね

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

ラッチ先生
ラッチ先生

今回は、
風船スロットのプログラムを 作りました。

風船スロット!
Python
import pgzrun
from pgzhelper import *
from costume import *
from say import text_display

WIDTH = 800
HEIGHT = 600

balloon = Actor("balloon_red", (400, 150))
balloon.images = ["balloon_red", "balloon_blue", "balloon_green"] 
balloon.fps = 20 
balloon.stop() 

game = "ready" 
bg_image = None 

buttons = [] 

for i in range(3): 
    x = 150 + 250 * i 
    y = 400
    button = Actor(balloon.images[i], (x, y)) 
    buttons.append(button) 

def draw():
    screen.fill("lightyellow")
    if game == "result":       
        screen.blit(bg_image, (0, 0)) 
    balloon.draw()
    for button in buttons: 
        button.draw() 
    text_display.draw(screen) 

def on_key_down(key): 
    global game     

    if key == keys.SPACE: 
        if game == "ready": 
            game = "play"   
            balloon.play()  
            sounds.accent_brilliant_01_high_fast.play() 
            music.set_volume(0.4) 

        elif game == "result" and not balloon.is_talking(): 
            game = "ready" 
            balloon.stop() 

def on_mouse_down(pos): 
    global game, bg_image 

    for button in buttons: 
        if button.collidepoint_pixel(pos): 
            if game == "play": 
                game = "result" 
                balloon.pause() 

                if button.image == balloon.image: 
                    bg_image = "bg_bingo" 
                    balloon.say("Bingo!", 2, color = "darkgreen", size=80) 
                    sounds.accent_brilliant_02_low.play() 
                    
                else:  
                    bg_image = "bg_ohno"  
                    balloon.say("Oh no!", 2, color= "darkgreen", size=80) 
                    sounds.kiga_nukeru_01_long.play() 
                                 
def update():
    balloon.animate() 

music.play("starlight_dreams") 

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

costumeコスチュームモジュールのプロパティやメソッドを使って
風船の画像の切り替えでスロットを作りした。

ラッチ先生
ラッチ先生

ボタンは、3個の風船にしてストップボタンにしました。

pythonしよう!簡単なゲーム02:ポイント2の詳しい解説
スック
スック

結構、簡単に作れたでしょ!
みんなも好きな画像で スロット作ってみよう

それじゃ、またね!

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

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

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