簡単なゲーム

【Pygame Zero】簡単なゲーム07:障害物をたくさん置くプログラム

ratch2025

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

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

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

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

BGM提供:DOVA-SYNDROME
https://dova-s.jp/
A Cat in Palm Beach by 北見ヒツジ

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

ラッチ先生
ラッチ先生

基礎プログラムと 画像を入れた
「簡単なゲーム07 ゴールを ねらえ!」zipフォルダを ダウンロードしてください

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

今回は、スクリーンの色を “lightcyanライトシアン“に したよ

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

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

boonを マウスで動かす

雲を 動かす

ゲーム終了

pythonしよう!簡単なゲーム07:ゲーム終了

BGM提供:DOVA-SYNDROME
https://dova-s.jp/
A Cat in Palm Beach by 北見ヒツジ

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

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

ラッチ先生
ラッチ先生

今回の「ゴールをめざして!」では、
・他の雲に重ならないように表示する
プログラムがあります。

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

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

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

ラッチ先生
ラッチ先生

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

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

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

ラッチ先生
ラッチ先生

今回は、
10個の雲が 現れて 左へ動くプログラムを 作っていきます。

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

スック
スック

リスト:cloudsクラウズを作成して、その中に雲を 追加していくんだ

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

10個の雲を表示する 条件だよ

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

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

ラッチ先生
ラッチ先生

boonボーンを動かすスイッチとして
プロパティ:onオン を追加します。
スペースキーを押したら、動くようにしましょう

pythonしよう!簡単なゲーム07:プロパティonの解説
Python
boon.on = False           #1 追加プロパティ:on に Falseを設定する
Python
def on_key_down(key):     #2 キーを押す関数を 定義する
    if key == keys.SPACE: #3 もし スペースキーが 押されたら 
        boon.on = True    #4 プロパティon に Trueを設定する

def on_mouse_move(pos):   #5 マウスを動かす関数を 定義する
    if boon.on:           #6 もし プロパティonが trueなら
        boon.angle = boon.angle_to(pos)  #7 boonの向きに マウスへ向く角度を 代入する
pythonしよう!簡単なゲーム07:angle_toメソッドの解説
ラッチ先生
ラッチ先生

mouseマウスオブジェクトに マウスの座標を 入れる
プロパティ:posポスを 追加します

pythonしよう!簡単なゲーム07:mouseオブジェクトの解説
Python
boon.on = False 
mouse.pos = 100, 500  #1 追加プロパティpos に (100, 500)を設定する
スック
スック

moveムーヴ_towardsトゥーワーズ( )メソッドで、boonボーンを 動かします。

pythonしよう!簡単なゲーム07:move_towards( )メソッドの解説
Python
def on_mouse_move(pos): 
    if boon.on: 
        boon.angle = boon.angle_to(pos) 
        mouse.pos = pos  #2 プロパティposに マウスの座標(pos)を代入する
Python
def boon_move():        #3 boonの動きを 定義する
    if boon.on:         #4 もし スイッチが Trueなら
        boon.move_towards(mouse.pos, 2)  #5 マウスの方へ 2pxずつ動く
Python
def update():    
    boon_move()     #5 boonを 動かす
スック
スック

これで、boonボーンの動きは、O.K!

ラッチ先生
ラッチ先生

つぎは、空のリストcloudsクラウズ を作成して、
10個の雲を スクリーンに 表示します。

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

for i in range(10):             #2 10回繰り返す
    x = random.randint(50, 750) #3 x座標に 50~750 からランダムに決めて代入する
    y = random.randint(50, 565) #4 y座標に 50~565 からランダムに決めて代入する
    cloud = Actor("cloud", (x, y)) #5 雲を 生成する
    clouds.append(cloud)        #6 リストcloudsに 追加する

def draw():
    screen.fill("lightcyan")
    sun.draw()
    boon.draw()
    for cloud in clouds:     #7 リストcloudsから 雲を取り出す
        cloud.draw()         #8 雲を 表示する
スック
スック

あれれっ!
雲が boonボーンや太陽に 触れるいる時があるよ

pythonしよう!簡単なゲーム07:雲がboonに重なっている
pythonしよう!簡単なゲーム07:雲が太陽に重なっている

スタートや ゴールができないじゃん!

ラッチ
ラッチ

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

雲を表示するときに 条件を 作ろう

★ 雲を 表示する条件 ★

1. 変数checkチェック_boonボーンboonボーンから 200px以上 離す
2. 変数checkチェック_sunサン : 太陽から 100px以上 離す
3. 変数checkチェック_cloudクラウド: 他の雲と 重ならない

スック
スック

distanceディスタンス_toトゥー( )メソッドを使えば、
boonボーンと 雲との距離を 計算してくれるよ

pythonしよう!簡単なゲーム07:distance_to()メソッドの解説
ラッチ先生
ラッチ先生

雲の重なりは、
collidelistコライドリスト_pixelピクセル()メソッドを使えば 判定してくれます

pythonしよう!簡単なゲーム07:collidelist_pixel()メソッドの解説
pythonしよう!簡単なゲーム07:ポイント2の解説
ラッチ先生
ラッチ先生

whileホワイル Trueトゥルー: 構文で 雲の場所を決めましょう

3つの条件が Trueトゥルーになったら
breakブレイク で このwhileホワイル構文を抜けて、 リストcloudsクラウズに 追加しましょう

pythonしよう!簡単なゲーム07:while Ture構文の解説
Python
for i in range(10): 
    while True:    #1 繰り返す
        x = random.randint(50, 750) 
        y = random.randint(50, 565) 
        cloud = Actor("cloud", (x, y)) 
        check_boon = boon.distance_to(cloud) > 200  #2 変数check_boonに 条件:boonと雲の距離が 200px以上を 代入する
        check_sun = sun.distance_to(cloud) > 100  #3 変数check_sunに 条件:太陽と雲の距離が 100以上を 代入する  
        check_cloud = cloud.collidelist_pixel(clouds) == -1 #4 変数check_cloudに 条件:他の雲に重ならないを 代入する
        if check_boon and check_sun and check_cloud: #5 もし 3つの条件が Tureなら
            break #6 抜け出す
        
    clouds.append(cloud) 
スック
スック

おおっ!お見事!

ラッチ先生
ラッチ先生

プロパティ:speedスピード を追加して、
ここに randintランドイント( )メソッドを使って、雲が動く速さを ランダムに決めます

pythonしよう!簡単なゲーム07:randint()関数の解説
Python
for i in range(10): 
    while True:   
        x = random.randint(50, 750) 
        y = random.randint(50, 565) 
        cloud = Actor("cloud", (x, y)) 
        cloud.speed = random.randint(1, 3) #1 プロパティspeedに 1~3からランダムに決めた数値を 設定する      
        check_boon = boon.distance_to(cloud) > 200 
ラッチ先生
ラッチ先生

雲の動きを defデフ boonボーン_moveムーヴ() 関数に 定義しよう

1.boonボーンの x座標を プロパティspeedずつ 減らします
2.雲のx座標が o より小さくなったら x座標800 にする

これで、雲は、左へ動いて、左端に着いたら 右端に現れるよ

Python
def cloud_move():              #1 cloud_move関数を 定義する
    if boon.on:                #2 もし プロパティon が Trueなら
        for cloud in clouds:   #3 リストcloudsから 雲を 取り出す
            cloud.x -= cloud.speed  #4 雲のx座標を プロパティspeedずつ 減らす

            if cloud.x < 0:    #5 もし 雲のx座標が 0 以下なら
                cloud.x = 800  #6 雲のx座標を 800に する

def update():
    boon_move() 
    cloud_move()       #7 cloud_move関数を 実行する
スック
スック

これで、雲の動きはO.K!

pythonしよう!簡単なゲーム07:ゲーム終了
ラッチ先生
ラッチ先生

まず、変数bgビージー_imageイメージを作成し、
背景画像が代入されたら、blitブリット( )メソッドで 表示する
プログラムを 作りましょう

pythonしよう!簡単なゲーム07:blit()メソッドの解説
Python
clouds = []
bg_image = None  #1 変数bg_imageを 宣言する 初期値:None(無し)
Python
def draw():
    screen.fill("lightcyan")
    if bg_image:                      #2 もし 変数bg_imageに 背景画像が代入されたら
        screen.blit(bg_image, (0, 0)) #3 背景画像を 表示する
    sun.draw()
ラッチ先生
ラッチ先生

次に、クリアとゲームオーバーのプログラムを
gameゲーム_endエンド関数に まとめて定義しましょう

引数に
bgビージー : 背景画像
costumeコスチュームboonボーン画像
soundサウンド: 変数soundsサウンズ(効果音オブジェクトを 入れる)

pythonしよう!簡単なゲーム07:ポイント3の解説
Python
def game_end(bg, costume, sound): #1 game_end関数を 定義する
    global bg_image       #2 グローバル変数 bg_image
    boon.on = False       #3 プロパティonに Falseを設定する 
    music.stop()          #4 BGMを 止める
    bg_image = bg         #5 変数bg_imageに 引数bgを 代入する
    boon.image = costume  #6 プロパティimageに 引数costumeを 代入する
    sound.play()          #7 変数soundに入っている効果音を 再生する
スック
スック

BGMと効果音のデータを フォルダに いれるよ

pythonしよう!簡単なゲーム07:music・soundsフォルダの解説

BGM提供:DOVA-SYNDROME
https://dova-s.jp/
A Cat in Palm Beach by 北見ヒツジ

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

ラッチ先生
ラッチ先生

musicミュージックモジュールのplayプレイ()メソッドで、BGMを 再生します

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

soundsサウンズモジュールのplayプレイ()メソッドで、効果音を鳴らすよ

pythonしよう!簡単なゲーム07:soundsモジュールの解説
ラッチ先生
ラッチ先生

collideコライド_pixelピクセル()メソッドを使って
boonボーンが、太陽、雲に触れたら gameゲーム_endエンド関数を 実行させよう

pythonしよう!簡単なゲーム07:collide_pixel()メソッドの解説
Python
def boon_move(): 
    if boon.on: 
        boon.move_towards(mouse.pos, 2) 

        if boon.collide_pixel(sun):  #2 もし 太陽に 触れたら
            game_end("bg_clear", "boon_goal", sounds.accent_brilliant_02_low)  #3 game_end関数を 実行する

        for cloud in clouds:     #4 リストcloudsから 雲を取り出す
            if boon.collide_pixel(cloud):  #5 もし 雲に触れたら
                game_end("bg_gameover", "boon_over", sounds.kiga_nukeru_01_long)  #6 game_end関数を 実行する
Python
music.play("a_cat_in_palm_beach")  #1 BGMを再生する
スック
スック

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

ラッチ先生
ラッチ先生

今回は、
10個の雲を重ならないように表示するプログラムを 作りました。

ゴールをめざして!
Python
import pgzrun
from pgzhelper import *
import random

WIDTH = 800
HEIGHT = 600

boon = Actor("boon", (100, 500))
sun = Actor("sun", (700, 100))

boon.on = False 
mouse.pos = 100, 500 

clouds = [] 
bg_image = None 

for i in range(10): 
    while True:   
        x = random.randint(50, 750) 
        y = random.randint(50, 565) 
        cloud = Actor("cloud", (x, y)) 
        cloud.speed = random.randint(1, 3) 
        check_boon = boon.distance_to(cloud) > 200 
        check_sun = sun.distance_to(cloud) > 100   
        check_cloud = cloud.collidelist_pixel(clouds) == -1
        if check_boon and check_sun and check_cloud: 
            break 
        
    clouds.append(cloud) 
    
def draw():
    screen.fill("lightcyan")
    if bg_image: 
        screen.blit(bg_image, (0, 0)) 
    sun.draw()
    boon.draw()
    for cloud in clouds: 
        cloud.draw() 

def on_key_down(key): 
    if key == keys.SPACE: 
        boon.on = True 

def on_mouse_move(pos): 
    if boon.on: 
        boon.angle = boon.angle_to(pos) 
        mouse.pos = pos 

def game_end(bg, costume, sound): 
    global bg_image 
    boon.on = False
    music.stop() 
    bg_image = bg 
    boon.image = costume
    sound.play() 

def boon_move(): 
    if boon.on: 
        boon.move_towards(mouse.pos, 2) 

        if boon.collide_pixel(sun): 
            game_end("bg_clear", "boon_goal", sounds.accent_brilliant_02_low) 

        for cloud in clouds: 
            if boon.collide_pixel(cloud): 
                game_end("bg_gameover", "boon_over", sounds.kiga_nukeru_01_long) 

def cloud_move(): 
    if boon.on: 
        for cloud in clouds: 
            cloud.x -= cloud.speed 

            if cloud.x < 0: 
                cloud.x = 800 

def update():
    boon_move() 
    cloud_move() 

music.play("a_cat_in_palm_beach") 

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

重ならない条件を 変数に 代入すると、Trueトゥルー/Falseフォルスを 返すので、

ifイフ 文に 使えて 便利です。

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

これで、ifイフ 文も シンプルになるね

それじゃ、またね!

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

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

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