【Pygame Zero】簡単なゲーム02:色を当てろ!風船スロットゲーム
こんにちは!
「Pythonしよう!楽しく学べるプログラミング教室」の
ラッチ先生です


スックです。よろしくね!
BGM提供:DOVA-SYNDROME
https://dova-s.jp/
・ 「Starlight_Dreams 」 by 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フォルダを ダウンロードしてください


今回は、スクリーンの色を “lightyellow“に したよ
「原色大事典」サイトには、URL:https://www.colordic.org/
pygame zeroで使える色が載っています

学習の流れ
スロット操作:スペースキーで準備・回転・一時停止
当たり判定
BGM・効果音を 入れる (BGM音量調整)
BGM提供:DOVA-SYNDROME
https://dova-s.jp/
・ 「Starlight_Dreams 」 by 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つのモジュールを 用意しました



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

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


属性(データ)やメソッド(命令)は、
『 . (ドット)』を付ければ、使えるよ
今回のプログラミングのポイント

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

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


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

3つに 分けたよ
スロット操作: 準備、回転、一時停止

まず、風船の画像を プロパティ:imagesに入れ
animate( ) メソッドで 画像の切り替えをしよう
balloon.images = ["balloon_red", "balloon_blue", "balloon_green"] #1 プロパティimagesに 3つの画像を 代入する
balloon.fps = 20 #2 プロパティfpsに 20に設定するdef update(): #3 更新する
balloon.animate() #4 コスチュームを 切り替える
風船の回転速度を変えたい時は、
fps(フレームズ・パー・セコンド)の数値を 変えようね

def on_key_down(key): 関数を使って
スペースキーを 押したら 風船スロットが 開始するようにしましょう
balloon.stop() #1 風船の画像の入れ替えを 止める
game = "ready" #2 変数gameを 宣言する 初期値:readydef 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個の風船ボタンがクリックされたら 一時停止するようにします

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 ボタンを 表示する


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

collidepoint_pixel(pos) メソッドを使って
風船が クリックされたら 変数gameを “result“にして
スロットを 止めるよ


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にして、風船をリセットします。
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 風船を 止める
スロットに なったね!
当たり判定

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

それぞれの背景画像を 表示します。
背景画像 を 表示する ポイント
1,背景画像を入れる『変数:bg_image』を 宣言します。
初期値は、「None」です。
つまり、背景画像が ない 空です。

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


bg_image = None #1 変数bg_image を宣言 初期値:Nonedef draw():
screen.fill("lightyellow")
if game == "result": #2 もし 変数gameが resultなら
screen.blit(bg_image, (0, 0)) #3 背景画像を 表示する
balloon.draw()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"を 代入する

変数に 画像も入れられるんだね
blit( ) メソッドを使って 背景画像を表示したよ

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

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 テキストディスプレイを 装備する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( ) メソッドを使って
セリフがない時にリセットするようにしましょう

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・効果音を 入れる(音量調整)
BGM提供:DOVA-SYNDROME
https://dova-s.jp/
・ 「Starlight_Dreams 」 by 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オブジェクトが標準装備であります。
やり方、以下の手順です
BGM の 流し方
1. MP3ファイルのBGMを 用意する

☆ Pygame zeroでは英語の大文字が 使えません。 エラーが出ます
小文字 に直します
2. フォルダ『music』フォルダに 入れる

3. musicモジュールのメソッドを使う

music.play("starlight_dreams") #1 BGMを 入れる
今回のプログラムに「DOVA-SYNDROME」サイトから
・ 「Starlight_Dreams 」 by Kei Morimoto
BGMの曲として お借りしました。 ありがとうございます。

つぎに
効果音をつけましょう!
・ スペースキーを 押した時
・ 当たり
・ はずれ
Python zeroには、soundsオブジェクトが標準装備であります。
次の手順で 行います
効果音のつけ方
1. WAVファイルの効果音を 用意する



2. フォルダ『sounds』フォルダに 入れる

3. soundsモジュールのplay( )メソッドを使う


今回のプログラムに
「Chisato’s Website」サイトから
・ 「accent_brilliant_01_high_fast」:アクセント
・ 「accent_brilliant_02_low」:アクセント
・ 「kiga_nukeru_01_long」:アニメ
効果音を お借りしました。 ありがとうございます。
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 効果音を入れる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%に します
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%に する
これで、効果音も 聞きやすくなったね
今回の学習は、これで 終了! おつかれさま
まとめ

今回は、
風船スロットのプログラムを 作りました。
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個の風船にしてストップボタンにしました。


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