簡単なゲーム

【Pygame Zero】簡単なゲーム09:ジャンプ台からジャンプする

ratch2025

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

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

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

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

BGM提供:DOVA-SYNDROME
https://dova-s.jp/
Meta Universeby TECHNOTRAIN

効果音提供:Chisato’s Website
https://chisatosound.sakura.ne.jp/index.html
「Accent. Brilliant [02] (Low)」:アクセント
「Heal [04] (Short. Low)」: 回復の魔法
「Jump [01] (High)」: アクションゲーム
「Kiga Nukeru [01] (Long)」:アニメ                  

ラッチ先生
ラッチ先生

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

pythonしよう!簡単なゲーム09:boonと地面を表示する
スック
スック

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

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

pythonしよう!簡単なゲーム09:ジャンプしてタッチ!No.2zipの中身
スック
スック

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

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

BGM提供:DOVA-SYNDROME
https://dova-s.jp/
Meta Universeby TECHNOTRAIN

効果音提供:Chisato’s Website
https://chisatosound.sakura.ne.jp/index.html
「Accent. Brilliant [02] (Low)」:アクセント
「Heal [04] (Short. Low)」: 回復の魔法
「Jump [01] (High)」: アクションゲーム 
「Kiga Nukeru [01] (Long)」:アニメ                

pythonしよう!簡単なゲーム09:ジャンプしてタッチ!No.2zipの中身
スポンサーリンク

ジャンプする

障害物が 出てくる

ゲーム終了

pythonしよう!簡単なゲーム09:ゲームオーバー

ゲームクリア

pythonしよう!簡単なゲーム09:ゲームクリア

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

ラッチ先生
ラッチ先生

今回の「ジャンプしてタッチ!No.2」では、
・ 障害物が ランダムに 出現する
・ 障害物、風船に 触れる
プログラムがあります。

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

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

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

ラッチ先生
ラッチ先生

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

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

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

ラッチ先生
ラッチ先生

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

スック
スック

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

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

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

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

クリアとゲームオーバーのプログラムを まとめたよ

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

2つに 分けたよ

ラッチ先生
ラッチ先生

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

pythonしよう!簡単なゲーム09:プロパティ:onの解説
Python
boon = Actor("boon", (100, 200))
boon.jump_speed = 0  #1 プロパティ:jump_speedに 0を設定する
boon.on = False    #2 プロパティ:onに Falseを設定する

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

game = "play"        #3 変数gameを宣言 初期値:play

def boon_jump():     #4 boon_jump()関数を 定義する

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

        if boon.collide_pixel(ground): #8 もし 地面に触れたら
            boon.on = True             #9 プロパティonに Trueを設定する
            boon.jump_speed = 0      #10 jump_speedを 0に設定する
            boon.bottom = ground.top #11 boonの底に 地面の頂点を代入する
        
Python
def update():
    boon_jump() #12 boon_jump()関数を 実行する
スック
スック

おおっ!着地したぞ

ラッチ先生
ラッチ先生

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

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

Python
def on_key_down(key):      #1 キーを押した関数を 定義する
    if key == keys.SPACE:  #2 もし スペースキーだったら 
        if boon.on and game == "play": #3 もしプロパティonが true かつ 変数gameが playなら
            boon.jump_speed = -15  #4 プロパティjump_speedに -15を代入する
            boon.on = False        #5 プロパティonに Falseを設定する
            sounds.jump_01_high.play()  #6 効果音を 入れる
Q
play( )メソッドとは
pythonしよう!簡単なゲーム09:soundsモジュールの解説
スック
スック

ジャンプだ!

ラッチ先生
ラッチ先生

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

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

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

        elif keyboard.left:   #7 もし 左キーが押されたら
            if boon.left > 0: #8 もし boonの左端が 0以上だったら
                boon.x -= 5   #9 boonのx座標を 5pxずつ減らす
                boon.flip_x = True #10 boonの向きを 左向きにする
Python
def update():
    boon_jump()
    boon_move()  #11 boon_move()関数を 実行する
Q
プロパティ:flip_x とは
pythonしよう!簡単なゲーム09:プロパティflip_xの解説
スック
スック

左右の端で 止まったね。
これで、boonの動きは O.K!

ラッチ先生
ラッチ先生

空のblocksブロックスを 作りましょう

そして、cleateクリエイト_blockブロック( )関数を 定義します。
1.確率40%で 画像stepを 出現
2.障害物を 生成
3.プロパティ speed(動く速さ):6
4.リストblocksブロックスの中に 追加する
5.cleateクリエイト_blockブロック関数を
    0.7から2.0秒のランダムな時間後にもう一度実行する

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


障害物を生成する座標(場所)を
障害物のmidbottomミッドボトム に指定しました。

midbottomミッドボトム = (WIDTH :画面の右端
        groundクランド.topトップ:地面の上)

pythonしよう!簡単なゲーム09:要害物の midbottomの位置
Python
blocks = []  #1 リストblocks 空リストにする

def create_block():    #2 create_block( )関数を 実行する
    if game == "play": #3 もし 変数gameが playなら
        block = Actor("block", midbottom = (WIDTH, ground.top)) #4 blockオブジェクトを 生成する
        block.speed = 6  #5 プロパティspeedを 6に設定する
        blocks.append(block)  #6 リストblocksに blockオブジェクトを追加する
        clock.schedule(create_block, random.uniform(0.7, 2.0))  #7 0.7~2.0のランダムな時間後に create_block関数を 実行する

create_block() #8 create_block( )関数を 実行する

def draw():
    screen.fill("honeydew")
    ground.draw()
    boon.draw()
    for block in blocks: #9 リストblocksから blockオブジェクトを取り出す
        block.draw()  #10 blockオブジェクトを 表示する
Q
append( )メソッドとは
pythonしよう!簡単なゲーム09:append()メソッドの解説
Q
uniform( )メソッドとは
pythonしよう!簡単なゲーム09:uniform( )メソッドの解説
Q
schedule( )メソッドとは
pythonしよう!簡単なゲーム09:schedule( )メソッドの解説
スック
スック

あれっ⁉ 障害物が 1個しか出てこないよ

ラッチ先生
ラッチ先生

ははは…! 
前の障害物の上に重なって表示されるからね

blockブロック_moveムーヴ()関数を 定義して 動かすと 現れてくるよ
1.左へ 動かす
2.左端で 削除する

Python
create_block()

def block_move():      #1 block_move()関数を 定義する
    if game == "play": #2 もし 変数gameが playなら
        for block in blocks:       #3 リストblocksから ブロックを取り出す
            block.x -= block.speed #4 ブロックのx座標を プロパティspeedずつ 減らす
            if block.x < 0:        #5 もし ブロックのx座標が 0より小さくなったら
                blocks.remove(block)  #6 リストblocksから ブロックを削除する
Python
def update():
    boon_jump()
    boon_move()
    block_move()  #7 block_move()関数を 実行する
スック
スック

おおっ!出てきたぞ

ラッチ先生
ラッチ先生

障害物を ブロックとステップにします。

pythonしよう!簡単なゲーム09:プロパティ:
imageの解説

boonボーンが、これらに触れるとゲームオーバーになりますが
ステップの茶色部分では、大ジャンプできるんだ

スック
スック

このジャンプで 風船にタッチが できるんだね

ラッチ先生
ラッチ先生

そうです。
randomランダム ()関数を使って 確率40%の割合で
ステップを 出そうと思います。

pythonしよう!簡単なゲーム09:random( )関数の解説
スック
スック

確率40%. . .?

ラッチ先生
ラッチ先生

これを見てください。
確率が40%は、
randomランダム ()関数で出た数値が 0.4未満にすればいいんだ

スック
スック

なるほど!

Python
def create_block(): 
    if game == "play":
        if random.random() < 0.4: #1 もし ランダムに選んだ数値が 0.4未満なら
            block_image = "step"  #2 変数block_imageに "step"を代入する
        else:                     #3 その他
            block_image = "block" #4 変数block_imageに "block"を代入する
        block = Actor(block_image, midbottom = (WIDTH, ground.top))  #5 "block"を 変数block_imageに 変える
スック
スック

これで、両方 出てくるようになったね

pythonしよう!簡単なゲーム09:ゲームオーバー
ラッチ先生
ラッチ先生

まずは、ゲームを終了するgameゲーム_endエンド( )関数を 定義します・

pythonしよう!簡単なゲーム09:ポイント3の解説
Python
boon = Actor("boon", (100, 200))
boon.jump_speed = 0 
boon.on = False
boon.bg = None   #2 プロパティbgに None(無し)を設定する
Python
def game_end(bg, costume, sound): #5 game_end()関数を 定義する
    global game        #6 グローバル変数 game

    game = "end"       #7 変数gameに endを代入する
    music.stop()       #8 BGMを 止める
    boon.bg = bg       #9 プロパティbgに 引数bgを設定する
    boon.image = costume #10 プロパティimageに 引数costumeを設定する
    sound.play()       #11 変数soundを 再生する
    
def draw():
    screen.fill("honeydew")
    if boon.bg:             #3 もし プロパティbgに データが入ったら
        screen.blit(boon.bg, (0, 0)) #4 プロパティbgのデータを 表示する
Python
music.play("meta_universe")  #1 BGMを 流す
Q
music モジュールとは
pythonしよう!簡単なゲーム09:プロパティflip_xの解説

93. music.play(“meta_universe”)

BGM提供:DOVA-SYNDROME
https://dova-s.jp/
Meta Universeby TECHNOTRAIN             

曲名の大文字は、小文字にしないとエラーが出るよ

スック
スック

これで、gameゲーム_endエンド( )関数が 定義できました。

bgビージー は、backgroundバックグランドの 略語だよ

ラッチ先生
ラッチ先生

それでは、collideコライド_pixelピクセル()メソッドを使って
障害物に 触れたら ゲームオーバーにします

pythonしよう!簡単なゲーム09:collide_pixelの解説
Python
def block_move(): 
    if game == "play":
        for block in blocks: 
            block.x -= block.speed 
            if block.x < 0: 
                blocks.remove(block)

            if block.collide_pixel(boon):  #1 もし ブロックが boonに触れたら
                if block.image == "block": #2 もし ブロックのプロパティが blockなら
                    game_end("bg_over", "boon_over", sounds.kiga_nukeru_01_long) #3 game_end関数を 実行する
                   break   #4 抜ける
スック
スック

あれれ⁉ ステップは通り抜けちゃうね…

ラッチ先生
ラッチ先生

はい。boonボーンが、ステップに触れる場合
2通りあります

pythonしよう!簡単なゲーム09:ステップの触れ方の解説

○ステップに触れ方
 1.ジャンプしていない: ゲームオーバー
 2.ジャンプして ステップの上: 大ジャンプ


プロパティ:jumpジャンプ_speedスピードの数値で、分けます。

Python
def block_move(): 
    if game == "play":
        for block in blocks: 
            block.x -= block.speed 
            if block.x < 0: 
                blocks.remove(block)

            if block.collide_pixel(boon): 
                if block.image == "block": 
                    game_end("bg_over", "boon_over", sounds.kiga_nukeru_01_long)

                elif block.image == "step":  #1 もし プロパティ:imageが stepなら
                    if boon.jump_speed <= 0: #2 もし プロパティ:jump_speedが 0以下なら
                        game_end("bg_over", "boon_over", sounds.kiga_nukeru_01_long)  #3 game_end()関数を 実行する
                    else:  #4 その他
                        boon.jump_speed = 0    #5 プロパティ:jump_speedを 0に設定する
                        boon.bottom = block.top #6 プロパティbottomを 障害物の topにする
                        boon.on = True  #7 プロパティon を Trueにする

                    break
スック
スック

あれっ⁉ boonボーンが 空中で止まっているよ

ラッチ
ラッチ

おぉぉぉ……と!
ステップが 通り過ぎたら、boonボーンは地面におちないと!

プロパティ:stepステップ を 追加して、
ステップの上にのったら、そのstepステップオブジェクトを 代入しちゃおう

pythonしよう!簡単なゲーム09:プロパティ:stepの解説
Python
boon = Actor("boon", (100, 200))
boon.jump_speed = 0 
boon.on = False
boon.bg = None
boon.step = None #1 プロパティ:stepに None(無し)を設定する
Python
def block_move(): 
    if game == "play":
        for block in blocks: 
            block.x -= block.speed 
            if block.x < 0: 
                blocks.remove(block)

            if block.collide_pixel(boon): 
                if block.image == "block": 
                    game_end("bg_over", "boon_over", sounds.kiga_nukeru_01_long)

                elif block.image == "step": 
                    if boon.jump_speed <= 0: 
                        game_end("bg_over", "boon_over", sounds.kiga_nukeru_01_long) 
                    else: 
                        boon.jump_speed = 0
                        boon.bottom = block.top 
                        boon.on = True
                        boon.step = block #2 プロパティstepに blockオブジェクトを 代入する

                    break
pythonしよう!簡単なゲーム09:boonがステップから落ちるの解説
Python
def boon_jump(): 

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

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

    else: #3 その他(プロパティon が True)
        if boon.step and (boon.step.right < boon.x): #4 ステップより右へ行った
            boon.on = False #5 プロパティonを Falseに設定する
            boon.step = None #6 プロパティstepを None(無し)に設定する
スック
スック

ちゃんと stepステップから 落ちたね

pythonしよう!簡単なゲーム09:ゲームクリア
ラッチ先生
ラッチ先生

最後にゲームクリアのプログラミングです。

まずは、stepステップでのジャンプを 高くしましょう

Python
def on_key_down(key): 
    if key == keys.SPACE: 
        if boon.on and game == "play":
            if boon.step: #1 もし プロパティstepに blockオブジェクトが入っていたら
                boon.jump_speed = -20 #2 プロパティjump_speedに -20を代入する
            else: #3 その他
                boon.jump_speed = -15 
            boon.on = False 
            sounds.jump_01_high.play()
スック
スック

あらら!上に突き抜けちゃった

ラッチ先生
ラッチ先生

そして、リストballoonsバルーンズを作成して、
風船を4個 表示しましょう

pythonしよう!簡単なゲーム09:ポイント2の解説
Python
balloons = [] #1 リストballoonsを作成 空リスト

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

風船が きれいに並んだね

ラッチ先生
ラッチ先生

removeリムーヴ( )メソッドを使って
boonボーンに触れたら 削除します。

pythonしよう!簡単なゲーム09:remove()メソッドの解説
スック
スック

風船をremoveリムーヴ( )メソッドで削除する時は、
リストballoonsバルーンズのコピーを 使うよ

Q
なぜ リストballoonsの コピーを使うか
スック
スック

ああっ!

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

スック
スック

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

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

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

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

        for balloon in balloons[:]: #2 リストballoonsのコピーから 風船を取り出す
            if balloon.collide_pixel(boon): #3 boonに触れたら
                sounds.heal_04_short_low.play() #4 効果音を 鳴らす
                balloons.remove(balloon) #5 風船を 削除する

                if len(balloons) == 0: #6 もし リストballoonsにある風船が0に なったら
                    game_end("bg_clear", "boon_clear", sounds.accent_brilliant_02_low) #7 game_end()関数を 実行する

    else: 
        if boon.step and (boon.step.right < boon.x): 
スック
スック

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

ラッチ先生
ラッチ先生

今回は、
stepステップの上から ジャンプするプログラムを作りました。

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

WIDTH = 800
HEIGHT = 600

boon = Actor("boon", (100, 200))
boon.jump_speed = 0 
boon.on = False 
boon.bg = None 
boon.step = None 

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

game = "play" 

def boon_jump(): 
    global game 

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

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

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

                if len(balloons) == 0: 
                    game_end("bg_clear", "boon_clear", sounds.accent_brilliant_02_low) 

    else: 
        if boon.step and (boon.step.right < boon.x): 
            boon.on = False 
            boon.step = None 
        
def on_key_down(key): 
    if key == keys.SPACE: 
        if boon.on and game == "play":
            if boon.step: 
                boon.jump_speed = -20 
            else: 
                boon.jump_speed = -15 
            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 

blocks = [] 

def create_block(): 
    if game == "play": 
        if random.random() < 0.4: 
            block_image = "step" 
        else: 
            block_image = "block" 
        block = Actor(block_image, midbottom = (WIDTH, ground.top)) 
        block.speed = 6 
        blocks.append(block) 
        clock.schedule(create_block, random.uniform(0.7, 2.0)) 

create_block() 

def block_move(): 
    if game == "play": 
        for block in blocks: 
            block.x -= block.speed 
            if block.x < 0: 
                blocks.remove(block) 

            if block.collide_pixel(boon): 
                if block.image == "block": 
                    game_end("bg_over", "boon_over", sounds.kiga_nukeru_01_long) 

                elif block.image == "step": 
                    if boon.jump_speed <= 0: 
                        game_end("bg_over", "boon_over", sounds.kiga_nukeru_01_long) 
                    else: 
                        boon.jump_speed = 0 
                        boon.bottom = block.top 
                        boon.on = True 
                        boon.step = block 
            
                break     

def game_end(bg, costume, sound): 
    global game 

    game = "end" 
    music.stop() 
    boon.bg = bg 
    boon.image = costume 
    sound.play() 

balloons = [] 

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

def draw():
    screen.fill("honeydew")
    if boon.bg: 
        screen.blit(boon.bg, (0, 0)) 

    for balloon in balloons: 
        balloon.draw() 
    ground.draw()
    boon.draw()
    for block in blocks: 
        block.draw() 

def update():
    boon_jump() 
    boon_move() 
    block_move() 

music.play("meta_universe") 

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

プロパティ:jumpジャンプ_speedスピードが +になっていれば、
boonボーンが ステップの上に のったことが わかったね

pythonしよう!簡単なゲーム09:ステップの触れ方の解説

○ステップに触れ方
 1.ジャンプしていない: ゲームオーバー
 2.ジャンプして ステップの上: 大ジャンプ


プロパティ:jumpジャンプ_speedスピードの数値で、分けます。

ラッチ先生
ラッチ先生

また、プロパティ:stepステップを作って stepオブジェクトを 入れておくと
stepステップが 通り過ぎた時、 boonボーンが地面に落ちるよ

3.blockブロックオブジェクトが 通り過ぎたら, 落ちる

pythonしよう!簡単なゲーム09:ステップからboonが落ちるの解説

boonボーンのx座標が ステップの右端のx座標より 大きくなったら
プロパティonオンFalseフォルスに 設定すると 落ちます

スック
スック

マリオみたいなゲームも作れるね

それじゃ、またね!

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

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

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