量産

【Pygame Zero】量産02:複数のキャラクターから一つ選ぶ

ratch2025

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

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

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

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

BGM提供:DOVA-SYNDROME
https://dova-s.jp/
「I’M IN 」 by SHUNTA

効果音提供:Chisato’s Website
https://chisatosound.sakura.ne.jp/index.html
「accent_synth_bell_e_major_01b_poly」:アクセント
「power_up_item_01_fast」:ボタン音

ラッチ先生
ラッチ先生

基礎プログラムと 画像を入れた
「量産02 本物を探せ!」zipフォルダを ダウンロードしてください

pythonしよう!量産02:背景画像を表示する
pythonしよう!量産02:blit()メソッドの解説
スック
スック

今回は、blitブリット( )メソッドを使って 背景画像を 入れてみたよ

pythonしよう!量産02:boonを探せ!zipの中身
スポンサーリンク

20個のboonを 重ならないように 表示する

pythonしよう!量産02:20個のboonを表示する

boonを クリックすると 本物は セリフを言う 偽物は消える

BGM・効果音を 入れる

BGM提供:DOVA-SYNDROME
https://dova-s.jp/
「I’M IN 」 by SHUNTA

効果音提供:Chisato’s Website
https://chisatosound.sakura.ne.jp/index.html
「accent_synth_bell_e_major_01b_poly」:アクセント
「power_up_item_01_fast」:ボタン音

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

ラッチ先生
ラッチ先生

今回の「本物を 探せ!」では、
boonボーンを クリックする
boonボーンを ランダムな場所へ
boonボーン が セリフを言う
プログラムが あります

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

pythonしよう!量産02:pgzhelperモジュールのインポートを解説
pythonしよう!量産02:randomモジュールのインポートを解説
pythonしよう!量産02:sayモジュールのインポートを解説
スック
スック

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

ラッチ先生
ラッチ先生

今回は、
20個のboonボーンを 表示するプログラムを 作っていきます。

scratchで言う「クローン」。
pygama zeroでは、次の手順で プログラムします

pythonしよう!量産02:ポイント1を解説
スック
スック

リスト:boonボーンを作成して、その中に20個のboonボーンを 入れるんだ

pythonしよう!量産02:ポイント2を解説
スック
スック

pgzhelperピージーゼットヘルパーモジュールの collidelistコライドリスト_pixelピクセル( ) メソッドを 使います

pythonしよう!量産02:20個のboonを表示する
ラッチ先生
ラッチ先生

最初に、
20個のboonボーンを ランダムに表示します。

pythonしよう!量産02:ポイント1を解説
Python
boons = []                     #1 リストboons 空リストを代入する
target = random.randint(0, 20) #2 変数target 初期値:0~19からランダムに選んだ数値

for i in range(20):                   #3 20回繰り返す
    x = random.randint(50, WIDTH-50)  #4 変数xに 50~750からランダムに選んだ数値を代入する
    y = random.randint(50, HEIGHT-50) #5 変数yに 50~540からランダムに選んだ数値を代入する
    boon = Actor("boon", (x, y))  #6 boonインスタンスを作る
    boon.num = i                  #7 プロパティnum に 変数i を代入する
    boons.append(boon)            #8 リストboonsに boonを追加する
Python
def draw():
    screen.blit("haikei", (0, 0))
    for boon in boons:    #9 リストboonsから boonを取り出し
        boon.draw()       #10 boonを 表示する
スック
スック

boonボーンを ゆっくり表示させました。
本当は、一瞬で20個のboonボーンを 表示させます。

また、
変数targetターゲットは、本物のboonボーンの番号を入れる変数です

pythonしよう!量産02:list()クラスのappend()メソッドを解説
pythonしよう!量産02:for i in range()関数を解説
pythonしよう!量産02:リストboons
スック
スック

まだ、スクリーンには表示されないよ

pythonしよう!量産02:for文を解説
ラッチ先生
ラッチ先生

さあ、今度は、
collidelistコライドリスト_pixelピクセル( )メソッドを使って
boonボーンを 重ならないように 表示させよう

pythonしよう!量産02:ポイント2を解説
Python
for i in range(20):
    for _ in range(100): #1 100回 繰り返す
        x = random.randint(50, WIDTH-50)
        y = random.randint(50, HEIGHT-50)
        boon = Actor("boon", (x, y))
        boon.num = i
        
        if boon.collidelist_pixel(boons) == -1: #2 もし 他のboonに 触れてなければ
            boons.append(boon) 
            break  #3 繰り返しを 抜ける

ポイント1

pythonしよう!量産02:collidelist_pixel( )メソッドを解説
スック
スック

collidelistコライドリスト_pixelピクセル( ) メソッドは、とても便利だよ
みんなも使ってみてね

スック
スック

forフォー i inイン rangeレンジ(100)でもいいけど、
カウター変数:i に入っているデータを使わないので、
「 _ 」に したよ

ラッチ先生
ラッチ先生

変数targetターゲットに 数値(データ)が入っています。
同じ数値が プロパティ:numナンバーに入っているboonボーンが 本物です

Python
def draw():
    screen.blit("haikei", (0, 0))
    for boon in boons:
        boon.draw()
    text_display.draw(screen) #1 テキストディスプレイを装備する

def on_mouse_down(pos): #2 マウスがクリックした座標(pos)を取得する
    for boon in boons:  #3 リストboonsから boonを順に取り出す
        if boon.collidepoint_pixel(pos): #4 もし boonがクリックされたら
            if boon.num == target: #5 プロパティ:numが 変数targetのデータと一緒なら
                boon.image = "boon_ok" #6 画像を "boon_ok"にする
                boon.say("O.K!", 2, color="red", size=70, y_offset = -70) #7 「O.K!」と2秒間言う
            else:                  #8 その他
                boons.remove(boon) #9 リストboonsから クリックしたboonを 削除する
pythonしよう!量産02:collidepoint_pixel( )メソッドを解説
クリックしたboonが 本物

・ 画像を “boon_ok”にする
・ 「O.K!」と 2秒間言う

pythonしよう!量産02:本物のboon
その他

・ boonを 削除する

pythonしよう!量産02:それ以外のboon
pythonしよう!量産02:remove( )メソッドの解説
ラッチ先生
ラッチ先生

次に、clearクリア( ) メソッドを使って
本物のboonボーンをクリックされたら、他のboonボーンを消しちゃおう!

pythonしよう!量産02:clear( )メソッドの解説
Python
def on_mouse_down(pos):
    for boon in boons:
        if boon.collidepoint_pixel(pos):
            if boon.num == target:
                boon.image = "boon_ok"
                boon.say("O.K!", 2, color="red", size=70, y_offset = -70)
                boons.clear()      #1 リストboonsを すべて削除する
                boons.append(boon) #2 クリックされたboonを リストboonsに追加する
            else:
                boons.remove(boon)           
スック
スック

おおっ! すっきりしたね

ラッチ先生
ラッチ先生

今回は、2か所に 効果音を入れました。
boonボーンをクリックした音:
・ 本物
・ それ以外

pythonしよう!量産02:soudsオブジェクトのplay( )メソッドの解説
Python
def on_mouse_down(pos):
    for boon in boons:
        if boon.collidepoint_pixel(pos):
            if boon.num == target:
                music.stop()
                sounds.accent_synth_bell_e_major_01b_poly.play() #1 本物をクリックした効果音
                boon.image = "boon_ok"
                boon.say("O.K!", 2, color="red", size=70, y_offset = -70)
                boons.clear()
                boons.append(boon)
            else:
                sounds.power_up_item_01_fast.play() #2 その他をクリックした効果音
                boons.remove(boon)

効果音提供:Chisato’s Website
https://chisatosound.sakura.ne.jp/index.html
「accent_synth_bell_e_major_01b_poly」:アクセント
「power_up_item_01_fast」:ボタン音

スック
スック

うん。いいねぇ

ラッチ先生
ラッチ先生

最後に、BGMを入れてみよう

pythonしよう!量産02:musicモジュールの解説
Python
def on_mouse_down(pos):
    for boon in boons:
        if boon.collidepoint_pixel(pos):
            if boon.num == target:
                music.stop() #2 BGMを 止める
                sounds.accent_synth_bell_e_major_01b_poly.play()
                boon.image = "boon_ok"
                boon.say("O.K!", 2, color="red", size=70, y_offset = -70)
                boons.clear()
                boons.append(boon)
            else:
                sounds.power_up_item_01_fast.play()
                boons.remove(boon)
                
music.play("i'm in")  #1 BGMを 流す

BGM提供:DOVA-SYNDROME
https://dova-s.jp/
「I’M IN 」 by SHUNTA

★ 注意★
pygame zero プログラミングでは、大文字が使えません。エラーが出ます。
小文字に直して、「i’m in」プログラムに 入力してください

スック
スック

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

ラッチ先生
ラッチ先生

今回は、
boonボーンを 量産したプログラムを 作りました。

本物を 探せ!
Python
import pgzrun
import random
from pgzhelper import *
from say import text_display

WIDTH = 800
HEIGHT = 590

boons = []
target = random.randint(0, 20)

for i in range(20):
    for _ in range(100):
        x = random.randint(50, WIDTH-50)
        y = random.randint(50, HEIGHT-50)
        boon = Actor("boon", (x, y))
        boon.num = i
        
        if boon.collidelist_pixel(boons) == -1:
            boons.append(boon)
            break
        
def draw():
    screen.blit("haikei", (0, 0))
    for boon in boons:
        boon.draw()
    text_display.draw(screen)

def on_mouse_down(pos):
    for boon in boons:
        if boon.collidepoint_pixel(pos):
            if boon.num == target:
                music.stop()
                sounds.accent_synth_bell_e_major_01b_poly.play()
                boon.image = "boon_ok"
                boon.say("O.K!", 2, color="red", size=70, y_offset = -70)
                boons.clear()
                boons.append(boon)
            else:
                sounds.power_up_item_01_fast.play()
                boons.remove(boon)
                
music.play("i'm in")

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

キャラクターを重ならないように表示するプログラムです。

Python
boons = [] #ポイント1:手順1

for i in range(20):      #ポイント1:手順2
    for _ in range(100): #ポイント2:手順1
        x = random.randint(50, WIDTH-50)
        y = random.randint(50, HEIGHT-50)
        boon = Actor("boon", (x, y))
        
        if boon.collidelist_pixel(boons) == -1: #ポイント2:手順1
            boons.append(boon) 
            break

def draw():
    screen.blit("haikei", (0, 0))
    for boon in boons: #ポイント1:手順3
        boon.draw()
pythonしよう!量産02:ポイント1の解説
pythonしよう!量産02:ポイント2の解説
スック
スック

みんなも 重ならないように表示を試してください
それじゃ、またね!

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

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

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