簡単なゲーム

【Pygame Zero】簡単なゲーム04:ジャンプして風船を割ろう!

ratch2025

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

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

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

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

BGM提供:DOVA-SYNDROME
https://dova-s.jp/
Happiness_is_everywhereby Tinymemory 

効果音提供:Chisato’s Website
https://chisatosound.sakura.ne.jp/index.html
「Accent. Brilliant [02] (Low)」:アクセント
「Heal [04] (Short. Low)」:回復
・ 「Jump [01] (High)」:アクションゲーム
・ 「Synthesizer [07] Vibrato Bass」:シンセサイザーで作った音(分類できないもの)

ラッチ先生
ラッチ先生

基礎プログラムと 画像を入れた
「簡単なゲーム04 ジャンプして タッチ!」zipフォルダを ダウンロードしてください

pythonしよう!簡単なゲーム04:画面を表示する
スック
スック

今回は、スクリーンの色を “honeydewハニーデュー“に したよ

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

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

スペースキーを押すと ジャンプする

4つの風船をタッチすると クリア

コウモリに 触れたら ゲームオーバー

BGM・効果音を 入れる

BGM提供:DOVA-SYNDROME
https://dova-s.jp/
Happiness_is_everywhereby Tinymemory 

効果音提供:Chisato’s Website
https://chisatosound.sakura.ne.jp/index.html
「Accent. Brilliant [02] (Low)」:アクセント
「Heal [04] (Short. Low)」:回復
・ 「Jump [01] (High)」:アクションゲーム
・ 「Synthesizer [07] Vibrato Bass」:シンセサイザーで作った音(分類できないもの)

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

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

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

ラッチ先生
ラッチ先生

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

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

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

ラッチ先生
ラッチ先生

今回は、
boonが ジャンプするプログラムを作っていきます。

スック
スック

ジャンプの上方向:-(マイナス)
     下方向:+(プラス)

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

リストballoonsバルーンズを作成して、その中に4個の風船を入れるよ

スック
スック

balloonsバルーンズ[:]は、リストballoonsバルーンズのコピー と覚えてね

スック
スック

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

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

3つに 分けたよ

ラッチ先生
ラッチ先生

ジャンプのプログラムを作っていきます。
boonボーンオブジェクトに 2つのプロパティ
jumpジャンプ_speedスピード : ジャンプの時にboonが上下に動く長さを保存
onオン :地面に着地したか判定(Trueトゥルー/ Falseフォルス
を 追加します。

pythonしよう!簡単なゲーム04:追加プロパティonの解説
Python
boon = Actor("boon", (400, 200))
boon.jump_speed = 0   #1 追加プロパティjump_speed: 0 に設定する
boon.on = False       #2 追加プロパティon: False に設定する
Python
def boon_jump():    #3 boonのジャンプを 定義する

    if not boon.on:   #4 もし プロパティonが False なら
        boon.jump_speed += 0.5    #5 プロパティjump_speedを 0.5ずつ 増やす
        boon.y += boon.jump_speed #6 boonのy座標を プロパティjump_speedずつ 増やす  

        if boon.collide_pixel(ground):  #7 もし 地上に触れたら
            boon.on = True              #8 プロパティon:Tureに設定する
            boon.jump_speed = 0       #9 プロパティjump_speedに 0を設定する
            boon.bottom = ground.top  #10 boonのプロパティbottom(下)を 地面のプロパティtop(上)のデータを設定する
Python
def update():
    boon_jump()  #11 boonが ジャンプする
スック
スック

おおっ!着地したぞ

ラッチ先生
ラッチ先生

次に スペースキーを押したら
プロパティjumpジャンプ_speedスピードを -20 に設定するよ

これで、boonボーンは ジャンプしちゃうんだ

Python
game = "play"        #1 変数game を宣言 初期値:play
Python
def on_key_down(key):  #2 キーを押す関数を 定義する
    if key == keys.SPACE and boon.on and game == "play":  #3 もし スペースキーで プロパティonが True かつ 変数gameが playだったら
        boon.jump_speed = -20  #4 プロパティjump_speedを -20に設定する
        boon.on = False    #5 プロパティonを Falseに設定する
スック
スック

ジャンプだ!

ラッチ先生
ラッチ先生

次に、左右キーを押したら boonボーンが左右に動くよう
boonボーン_moveムーヴ( ) 関数を 定義するよ

プロパティrightライトleftレフト を使って
左右の端で止まるようにしました。

pythonしよう!簡単なゲーム04:位置プロパティの解説
Python
def boon_move():           #1 boonの動きを 定義する
    if game == "play":     #2 もし 変数gameが playなら
        if keyboard.right: #3 もし 右キーが 押されたら
            if boon.right < WIDTH: #4 もし boonの右端が WIDTHより小さければ
                boon.x += 5  #5 boonのx座標を 5ずつ増やす
                boon.flip_x = False   #6 boonを反転させない        

        elif keyboard.left:   #6 もし 左キーが 押されたら
            if boon.left > 0: #7 もし boonの左端が 0より大きかったら
                boon.x -= 5   #8 boonのx座標を 5ずつ減らす
                boon.flip_x = True  #9 boonを反転させる
Python
def update():
    boon_jump() 
    boon_move()  #10 boon_move()関数を 実行する
pythonしよう!簡単なゲーム04:プロパティflip_xの解説
スック
スック

左右の端で 止まったね。

プロパティ:flipフリップ_x で、boonボーンの向きを 進む方向にしたよ

ラッチ先生
ラッチ先生

つぎは、空のリストballoonsバルーンズ を作成して、
4個の風船を スクリーンに 表示します。

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

for i in range(4):    #2 4回繰り返す カウント変数 i: 0, 1, 2, 3
    x = 100 + 200 * i #3 x座標に 100+200 × i を代入する
    y = 80            #4 y座標に 80 を代入する
    balloon = Actor("balloon", (x, y))  #5 風船を 生成する
    balloons.append(balloon) #6 リストballoonsに 風船を追加する
Python
def draw():         
    screen.fill("honeydew")
    for balloon in balloons:  #7 リストballoonsから 風船を取り出す
        balloon.draw()        #8 風船を 表示する
    boon.draw()
    ground.draw()
pythonしよう!簡単なゲーム04:風船の表示の解説
スック
スック

風船が きれいに並んだね

ラッチ先生
ラッチ先生

boonボーンが風船にタッチしたか判定する関数
defデフ checkチェック_balloonバルーン_touchタッチ( ) を 定義します。

collideコライド_pixelピクセル( )メソッドを使って
boonボーンに触れたか 判定します。

pythonしよう!簡単なゲーム04:ポイントの解説
pythonしよう!簡単なゲーム04:collide_pixel()メソッドの解説
スック
スック

removeリムーヴ( )メソッドを使って
リストballoonsバルーンズから 風船を 削除するよ

pythonしよう!簡単なゲーム04:remove()メソッドの解説
Python
def check_balloon_touch():  #1 check_balloon_touch()関数を 定義する
    global game        #2 グローバル変数 game

    if game == "play": #3 もし 変数gameが playなら
        for balloon in balloons[:]: #4 コピーリストballoonsから 風船を取り出す 
            if balloon.collide_pixel(boon):  #5 もし 風船がboonに 触れたら
                balloons.remove(balloon)  #6 リストballoonsから 風船を 削除する
Python
def update():
    boon_jump() 
    boon_move() 
    check_balloon_touch()  #7 check_balloon_touch()関数を 実行する
スック
スック

ああっ!

風船「2」が 飛ばされてるね

スック
スック

なるほどね!
リストballoonsバルーンズ[ : ] は、
最後の風船を取り出してからコピーするんだね

ラッチ先生
ラッチ先生

それでは、
風船が全部タッチされたら クリアになるプログラムを作ります。

lenレン( ) 関数を使って 風船が 『0』になったら
変数bgビージー_imageイメージ に 画像『bgビージー_clearクリア』を代入しましょう

pythonしよう!簡単なゲーム04:len()関数の解説
Python
bg_image = None         #1 変数bg_image を宣言 初期値:None(無し)

def draw():
    if game == "play":  #2 もし 変数gameが playなら         
        screen.fill("honeydew")
    else:               #3 その他は                
        screen.blit(bg_image, (0, 0))  #4 変数bg_imageを 表示する
Python
def check_balloon_touch(): 
    global game, bg_image           #5 グローバル変数bg_image

    if game == "play":              
        for balloon in balloons[:]: 
            if balloon.collide_pixel(boon):  
                balloons.remove(balloon) 

                if len(balloons) == 0:       #6 もし リストballoonsの要素が 0 なら
                    game = "clear"           #7 変数gameに clearを代入する
                    bg_image = "bg_clear"    #8 変数bg_imageに 画像bg_clearを 代入する
                    boon.image = "boon_clear"  #9 boonのプロパティimageに 画像boon_clearを設定する
ラッチ先生
ラッチ先生

つぎに、コウモリをランダムに動くようにします。

まず、コスチュームモジュールを使って
コウモリの羽を ばたつかせるよ

Python
bat = Actor("bat1", (700, 100))
bat.images = ["bat1", "bat2"]    #1 プロパティimagesに リスト[画像bat1, bat2]を セットする
bat.fps = 20                     #2 プロパティfpsを 20に設定する
Python
def update():
    boon_jump() 
    boon_move() 
    bat.animate()   #3 コスチュームの切り替えをする
ラッチ先生
ラッチ先生

animateアニメイト( )関数を 使って ランダムに 動かしましょう

pythonしよう!簡単なゲーム04:animate()関数の解説
Python
def bat_move():  #1 コウモリの動きを 定義する
    x = random.randint(50, WIDTH-50)  #2 xに 50~750から ランダムに決めた値を 代入する
    y = random.randint(50, 200) #3 yに 50~200から ランダムに決めた値を 代入する
    time = random.uniform(0.5, 2.0)  #4 timeに 0.5~2.0から ランダムに決めた値を代入する
    animate(bat, pos=(x, y), duration = time, on_finished=bat_move)  #5 コウモリの動きを アニメーションする

bat_move()  #6 bat_move( )関数を 実行する
スック
スック

おおっ! いいねぇ
onオン_finishedフィニッシュド = batバット_moveムーヴ で、batバット_moveムーヴ()関数が 繰り返されるんだね

ラッチ先生
ラッチ先生

collideコライド_pixelピクセル( )メソッドを使って
boonボーンが コウモリに 触れたら ゲームオーバーにします。

背景画像”bgビージー_overオーバー“を 表示させましょう

Python
def boon_jump(): 
    global game, bg_image         #1 グローバル変数bg_image

    if not boon.on: 
        boon.jump_speed += 0.5 
        boon.y += boon.jump_speed 

        if boon.collide_pixel(bat) and game == "play": #2 もし boonが コウモリに触れ かつ 変数gameが playだったら
            game = "over"            #3 変数gameに overを代入する 
            bg_image = "bg_over"     #4 変数bg_imageに 画像bg_overを 代入する
            boon.image = "boon_over"  #5 プロパティimageに 画像boon_overを設定する
スック
スック

変数gameゲームが “overオーバー“になったから
キーを 押しても boonボーンが 動かないね

BGM提供:DOVA-SYNDROME
https://dova-s.jp/
Happiness_is_everywhereby Tinymemory 

効果音提供:Chisato’s Website
https://chisatosound.sakura.ne.jp/index.html
「Accent. Brilliant [02] (Low)」:アクセント
「Heal [04] (Short. Low)」:回復
・ 「Jump [01] (High)」:アクションゲーム
・ 「Synthesizer [07] Vibrato Bass」:シンセサイザーで作った音(分類できないもの)

ラッチ先生
ラッチ先生

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

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

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

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

pythonしよう!簡単なゲーム04:mousicフォルダの解説
pythonしよう!簡単なゲーム04:musicモジュールの解説
スック
スック

今回は、setセット_volumeボリューム()メソッドを使って
BGMの音量を 調整したよ

Python
def boon_jump(): 
    global game, bg_image 

    if not boon.on: 
        boon.jump_speed += 0.5 
        boon.y += boon.jump_speed 

        if boon.collide_pixel(bat) and game == "play": 
            game = "over"  
            bg_image = "bg_over" 
            boon.image = "boon_over" 
            music.stop()    #3 BGMを 止める (ゲームオーバー)
Python
def check_balloon_touch(): 
    global game, bg_image 

    if game == "play":
        for balloon in balloons[:]: 
            if balloon.collide_pixel(boon): 
                balloons.remove(balloon) 

                if len(balloons) == 0: 
                    game = "clear" 
                    bg_image = "bg_clear" 
                    boon.image = "boon_clear" 
                    music.stop()  #4 BGMを 止める (クリア)
Python
music.play("happiness_is_everywhere")  #1 BGMを 入れる
music.set_volume(0.5)  #2 BGMの音量を 50%に する
スック
スック

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

ラッチ先生
ラッチ先生

つぎに
効果音をつけましょう! 
 ・ ジャンプした時
 ・ 風船に タッチした時
 ・ クリア
 ・ ゲームオーバー

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

次の手順で 行います

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

今回のプログラムに
Chisato’s Website」サイトから
Accent. Brilliant [02] (Low)」:アクセント
「Heal [04] (Short. Low)」:回復
「Jump [01] (High)」:アクションゲーム
・ 「Synthesizer [07] Vibrato Bass」:シンセサイザーで作った音(分類できないもの)

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

Python
def boon_jump(): 
    global game, bg_image 

    if not boon.on: 
        boon.jump_speed += 0.5 
        boon.y += boon.jump_speed 

        if boon.collide_pixel(bat) and game == "play": 
            game = "over"  
            bg_image = "bg_over" 
            boon.image = "boon_over" 
            music.stop() 
            sounds.synthesizer_07_vibrato_bass.play()  #4 ゲームオーバーの効果音を入れる
Python
def on_key_down(key): 
    if key == keys.SPACE and boon.on and game == "play": 
        boon.jump_speed = -20 
        boon.on = False  
        sounds.jump_01_high.play()  #2 ジャンプの効果音を 入れる
Python
def check_balloon_touch(): 
    global game, bg_image 

    if game == "play":
        for balloon in balloons[:]: 
            if balloon.collide_pixel(boon): 
                sounds.heal_04_short_low.play()  #2 風船にタッチした効果音を入れる
                balloons.remove(balloon) 

                if len(balloons) == 0: 
                    game = "clear" 
                    bg_image = "bg_clear" 
                    boon.image = "boon_clear" 
                    music.stop() 
                    sounds.accent_brilliant_02_low.play() #3 クリアの効果音を入れる
スック
スック

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

ラッチ先生
ラッチ先生

今回は、
boonボーンが ジャンプするプログラムを 作りました。

ジャンプして タッチ!
Python
import pgzrun
from pgzhelper import *
import random

WIDTH = 800
HEIGHT = 600

boon = Actor("boon", (400, 200))
boon.jump_speed = 0 
boon.on = False  

balloons = [] 

for i in range(4): 
    x = 100 + 200 * i 
    y = 80
    balloon = Actor("balloon", (x, y)) 
    balloons.append(balloon) 

bat = Actor("bat1", (700, 100))
bat.images = ["bat1", "bat2"]  
bat.fps = 20 

ground = Actor("ground", midbottom = (400, 600))

game = "play" 
bg_image = None

def draw():
    if game == "play":          
        screen.fill("honeydew")
    else:                       
        screen.blit(bg_image, (0, 0)) 

    for balloon in balloons: 
        balloon.draw()
    bat.draw()
    boon.draw()
    ground.draw()

def boon_jump(): 
    global game, bg_image 

    if not boon.on: 
        boon.jump_speed += 0.5 
        boon.y += boon.jump_speed 

        if boon.collide_pixel(bat) and game == "play": 
            game = "over"  
            bg_image = "bg_over" 
            boon.image = "boon_over" 
            music.stop() 
            sounds.synthesizer_07_vibrato_bass.play() 

        if boon.collide_pixel(ground): 
            boon.on = True 
            boon.jump_speed = 0 
            boon.bottom = ground.top 

def on_key_down(key): 
    if key == keys.SPACE and boon.on and game == "play": 
        boon.jump_speed = -20 
        boon.on = False  
        sounds.jump_01_high.play() 

def boon_move(): 
    if game == "play": 
        if keyboard.right:
            if boon.right < WIDTH:
                boon.x += 5 
                boon.flip_x = False          

        elif keyboard.left:
            if boon.left > 0:
                boon.x -= 5 
                boon.flip_x = True 

def check_balloon_touch(): 
    global game, bg_image 

    if game == "play":
        for balloon in balloons[:]: 
            if balloon.collide_pixel(boon): 
                sounds.heal_04_short_low.play() 
                balloons.remove(balloon) 

                if len(balloons) == 0: 
                    game = "clear" 
                    bg_image = "bg_clear" 
                    boon.image = "boon_clear" 
                    music.stop() 
                    sounds.accent_brilliant_02_low.play() 

def bat_move(): 
    x = random.randint(50, WIDTH-50) 
    y = random.randint(50, 200)
    time = random.uniform(0.5, 2.0) 
    animate(bat, pos=(x, y), duration = time, on_finished=bat_move) 

bat_move() 

def update():
    boon_jump() 
    boon_move() 
    check_balloon_touch() 
    bat.animate() 

music.play("happiness_is_everywhere") 
music.set_volume(0.5)

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

ジャンプのプログラムを作る時は、
プロパティjumpジャンプ_speedスピードを 追加して boonボーンを上下に 動かそう

ラッチ先生
ラッチ先生

プロパティon を 使って
boonが 着地したかどうか判定することを 忘れないでね

pythonしよう!簡単なゲーム04:プロパティonの解説
スック
スック

ジャンプの仕組みで、マリオみたいなゲームも作れるね

それじゃ、またね!

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

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

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