簡単なゲーム

【Pygame Zero】簡単なゲーム11:多数キャラクターの中からクリック判定

ratch2025

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

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

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

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

BGM提供:DOVA-SYNDROME
https://dova-s.jp/
「poppop」by Sakuttipanda

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

ラッチ先生
ラッチ先生

基礎プログラムと 画像を入れた
「簡単なゲーム11: スマイルboonを 探せ!」zipフォルダを
ダウンロードしてください

pythonしよう!簡単なゲーム11:スクリーンを表示する
スック
スック

今回は、スクリーンの色を “lavenderblushラベンダーブラッシュ“したよ

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

pythonしよう!簡単なゲーム11:スマイルboonを 探せ!zipの中身
スック
スック

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

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

BGM提供:DOVA-SYNDROME
https://dova-s.jp/
「poppop」by Sakuttipanda

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

pythonしよう!簡単なゲーム11:スマイルboonを 探せ!zipの中身
スポンサーリンク

50個の boonを動かす

boonを クリックして 判定する

pythonしよう!簡単なゲーム11:boonを クリック判定

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

ラッチ先生
ラッチ先生

今回の「スマイルboonを 探せ!」では、
boonボーンを 動かす
・ クリック判定
boonボーンを ランダムな場所で 表示する
・ セリフを 言う
プログラムがあります。

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

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

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

ラッチ先生
ラッチ先生

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

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

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

ラッチ先生
ラッチ先生

今回のプログラミングには、ポイントが 3つあります

スック
スック

リスト:boonsボーンズ を作成して、その中にboonボーンを 追加していくんだ

スック
スック

boonボーン をクリックした時に 使うよ

pythonしよう!簡単なゲーム11
:ポイント3の解説
スック
スック

boonボーンを クリックした時の判定のプログラムを まとめたよ

ラッチ先生
ラッチ先生

最初に リストboonsボーンズを 作成して
50個の boonボーンを 表示させましょう

pythonしよう!簡単なゲーム11
:ポイント1の解説
スック
スック

rangeレンジ( )関数を使って boonボーンを 50個作るよ

pythonしよう!簡単なゲーム11
:range() 関数の解説
Python
HEIGHT = 600

boons = []   #1 リストboons 空のリストを作成

for i in range(50):  #2 50回 繰り返す
    x = random.randint(50, WIDTH-50)  #3 x座標に 50~750からランダムに選んだ数字を 代入する
    y = random.randint(50, HEIGHT-50) #4 y座標に 50~550からランダムに選んだ数字を 代入する
    boon = Actor("boon_0", (x, y))  #5 boonを 生成する
    boon.angle = 45 * i  #6 boonの向きを 45 × i に設定する
    boons.append(boon)   #7 リストboonsに 追加する
Python
def draw():
    screen.fill("lavenderblush")
    for boon in boons:  #8 boonを 取り出す
        boon.draw()     #9 boonを 表示する
pythonしよう!簡単なゲーム11:50個のboonを動かす
スック
スック

おおっ!boonボーンの向きが バラバラだ

forフォー i inイン rangeレンジ( )関数 が どのように動いているでしょうか

50個だと、わかりずらいので、boonボーンを10個表示するで見てみましょう

コマ送りにしました。これをパソコンでは一瞬で行って 表示しています

ラッチ先生
ラッチ先生

次は、リストboonボーン_imagesイメージズに 3つのboonボーン画像を入れて、

pythonしよう!簡単なゲーム11:リストboon_images

3種類の boonボーンを 表示します

Python
boons = []
boon_images = ["boon_0", "boon_1", "boon_2"] #1 リストboon_images

for i in range(50):
    idx = i % 3     #2 idx(インデックス): 3で割った余り・・・0, 1, 2 
    x = random.randint(50, WIDTH-50) 
    y = random.randint(50, HEIGHT-50) 
    boon = Actor(boon_images[idx], (x, y)) #3 インデックスのboon画像を生成する
    boon.angle = 45 * i 
    boons.append(boon) 
pythonしよう!簡単なゲーム11:50個のboonを動かす
pythonしよう!簡単なゲーム11:リストboon_images
スック
スック

「 % 」は、便利だね

ラッチ先生
ラッチ先生

さあ、50個あるboonボーンから
ひとつ選んでスマイルboonボーンにしましょう

見つかりづらい最初のboonボーンにします。

pythonしよう!簡単なゲーム11:スマイルboon
Python
boons[0].image = "boon_smile" #1 リストboons[0]のプロパティimageを "boon_smile"に 設定する
boons[0].angle = 45 * random.randint(0, 7) #2 スマイルboonの向きを 45 × (0~7からランダムに選んだ数値) にする
スック
スック

なるほど!
boonsボーンズ[0] は、最初にスクリーンに表示されるため
重なりの奥に なって わかりづらくなるね

ラッチ先生
ラッチ先生

moveムーヴ_forwardフォワード()メソッドを使って
それぞれの向きへ動くようにするよ

スック
スック

スマイルboonボーン : boonsボーンズ[0] に
プロパティ onオン を追加して、動くスイッチにします。

pythonしよう!簡単なゲーム11:追加プロパティon の解説
Python
boons[0].image = "boon_smile" 
boons[0].angle = 45 * random.randint(0, 7)
boons[0].on = True #1 プロパティonに Trueを 設定する

def update():
    if boons[0].on: #2 もし プロパティonが Trueなら
        for boon in boons: #3 boonを取り出す
            boon.move_forward(1) #4 boonを 動かす
            if boon.x < 50 or boon.x > WIDTH-50: #5 もし 左右の壁に 触れたら
                boon.angle = 180 - boon.angle     #6 跳ね返す

            if boon.y < 50 or boon.y > HEIGHT-50: #7 もし 上下の壁に 触れたら
                boon.angle = -boon.angle            #8 跳ね返す
Q
move_forward( )メソッドとは
Q
跳ね返りの 角度は
スック
スック

おおっ! スマイルboonボーンは どこだあ?

pythonしよう!簡単なゲーム11:boonのクリック判定 の解説
ラッチ先生
ラッチ先生

onオン_mouseマウス_downダウン( )関数を使って
boonボーンを クリックした時の プログラムを 作ろう

pythonしよう!簡単なゲーム11:on_mouse_down()関数 の解説
Python
boons[0].on = True 

def on_mouse_down(pos): #1 クリックした時の関数を定義する
    for boon in boons: #2 リストboonsから boonを取り出す 
        if boon.collidepoint_pixel(pos): #3 もし boonをクリックしたら
            click_boon = boon.image #4 変数click_boonに プロパティimageのデータを 代入する
            del boons[1:] #5 リストboonsの1から最後までの要素を削除する
            boons[0].on = False #6 プロパティonを Falseに設定する
Q
collidepoint_pixel( )メソッドとは
Q
del boons[1:] とは
ラッチ先生
ラッチ先生

クリックしたboonボーンの画像によって終わり方を
gameゲーム_endエンド()関数として定義します。

pythonしよう!簡単なゲーム11:ポイント3の解説
ラッチ先生
ラッチ先生

背景画像を表示するために
boonsボーンズ[0]オブジェクトに プロパティbgビージー を 追加します。

最初は、背景画像を入れないため Noneナン(無し)を設定しましょう

Python
boons[0].image = "boon_smile" 
boons[0].angle = 45 * random.randint(0, 7)
boons[0].on = True
boons[0].bg = None #1 プロパティbg に None(無し)を設定する
Python
def draw():
    screen.fill("lavenderblush")
    if boons[0].bg:    #2 もし プロパティbgに 背景画像が入ったら
        screen.blit(boons[0].bg, (0, 0)) #3 背景画像を表示する
    for boon in boons: 
        boon.draw()
    text_display.draw(screen) #4 テキストディスプレイを 装備する 
    
music.play("poppop") #5 BGMを入れる
Q
text_displayオブジェクトとは
Q
musicモジュールとは
スック
スック

ifイフ boonsボーンズ[0].bgビージー :

ここでの boonsボーンズ[0].bgビージー は、
プロパティbgビージーに背景画像が代入されたら Trueトゥルーに なります!

Python
def game_end(bg, costume, sounds, word): #1 game_end関数を定義する
    music.stop() #2 BGM止める
    boons[0].bg = bg #3 プロパティbgに 引数bgを 設定する
    boons[0].image = costume #4 プロパティimageに 引数costumeを 設定する
    sounds.play() #5 引数soundsを 再生する
    boons[0].say(word, color="blue", size=70, y_offset=-70) #6 セリフを言う
Q
sayメソッドとは
ラッチ先生
ラッチ先生

最後に boonボーンが クリックされた時に
gameゲーム_endエンド( )関数を 実行します。

クリックされたときに 変数clickクリック_boonボーンに クリックされた画像が
設定されています。

変数clickクリック_boonボーンに入っている boonボーンの画像によって
gameゲーム_endエンド()関数の引数を 変えましょう

Python
def on_mouse_down(pos): 
    for boon in boons: 
        if boon.collidepoint_pixel(pos): 
            click_boon = boon.image 
            del boons[1:] 
            boons[0].on = False 

            if click_boon == "boon_smile":  #1 もし 変数click_boonが ”boon_smile"画像なら
                game_end("bg_clear", #2 game_end()関数を 実行する
                         "boon_ok",
                         sounds.accent_brilliant_02_low,
                         "O.K!") 
            else:  #3 その他
                game_end("bg_gameover",#4 game_end()関数を 実行する
                         "boon_smile",
                         sounds.kiga_nukeru_01_long,
                         "here!") 
Q
soundモジュールとは
スック
スック

あれっ⁉
スマイルboonボーンを クリックしてないのに ゲームクリアになってるよ

ラッチ
ラッチ

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

リストboonsボーンズからboonボーンの取り出す方法を 逆にするのを 忘れてた

スック
スック

そうか!スマイルboonボーンが 最初に反応してしまうんだね

Python
def on_mouse_down(pos): 
    for boon in reversed(boons): #1 reversed( )にして 逆から取り出す
        if boon.collidepoint_pixel(pos): 
            click_boon = boon.image 
            del boons[1:] 
            boons[0].on = False 

            if click_boon == "boon_smile": 
                game_end("bg_clear",
                 "boon_ok",
                 sounds.accent_brilliant_02_low,
                 "O.K!") 
            else: 
                game_end("bg_gameover",
                "boon_smile",
                sounds.kiga_nukeru_01_long,
                "here!") 
スック
スック

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

ラッチ先生
ラッチ先生

今回は、
50個のboonボーンを 動かして、その中からスマイルboonボーンを探すプログラムを作りました。

スマイルboonを 探せ!
Python
import pgzrun
from pgzhelper import *
import random
from say import text_display

WIDTH = 800
HEIGHT = 600

boons = [] 
boon_images = ["boon_0", "boon_1", "boon_2"] 

for i in range(50): 
    idx = i % 3     
    x = random.randint(50, WIDTH-50) 
    y = random.randint(50, HEIGHT-50) 
    boon = Actor(boon_images[idx], (x, y)) 
    boon.angle = 45 * i 
    boons.append(boon) 

boons[0].image = "boon_smile" 
boons[0].angle = 45 * random.randint(0, 7) 
boons[0].on = True 
boons[0].bg = None 

def on_mouse_down(pos): 
    for boon in reversed(boons):
        if boon.collidepoint_pixel(pos): 
            click_boon = boon.image 
            del boons[1:] 
            boons[0].on = False 

            if click_boon == "boon_smile": 
                game_end("bg_clear",
                         "boon_ok",
                         sounds.accent_brilliant_02_low,
                         "O.K!") 
            else: 
                game_end("bg_gameover",
                         "boon_smile",
                         sounds.kiga_nukeru_01_long,
                         "here!") 

def game_end(bg, costume, sounds, word): 
    music.stop() 
    boons[0].bg = bg 
    boons[0].image = costume 
    sounds.play() 
    boons[0].say(word,
                 color="blue",
                 size=70,
                 y_offset=-70) 

def update():
    if boons[0].on: 
        for boon in boons: 
            boon.move_forward(1) 

            if boon.x < 50 or boon.x > WIDTH-50: 
                boon.angle = 180 - boon.angle     

            if boon.y < 50 or boon.y > HEIGHT-50: 
                boon.angle = -boon.angle            

def draw():
    screen.fill("lavenderblush")
    if boons[0].bg:    
        screen.blit(boons[0].bg, (0, 0)) 
    for boon in boons: 
        boon.draw() 

    text_display.draw(screen) 

music.play("poppop")

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

たくさんのboonボーンからクリック判定するときは、
reversedリバースド( )メソッドを使って、リストの最後から取り出しましょう

スック
スック

みんなも reversedリバースド()メソッドを使ってみてね

それじゃ、またね!

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

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

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