簡単なゲーム

【Pygame Zero】簡単なゲーム12:えさをねらえ!虫を避けて進め!

ratch2025

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

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

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

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

BGM提供: DOVA-SYNDROME
https://dova-s.jp/
「Pixel Twinkle」 written by Kei Morimoto

効果音提供:魔王魂
https://maou.audio/
「maou_se_magical06」 : 魔法 マジカル06
「maou_se_onepoint17」: ワンポイント17
「maou_se_system43」 : システム音 システム43

ラッチ先生
ラッチ先生

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

pythonしよう!簡単なゲーム12:スクリーンを表示する
pythonしよう!簡単なゲーム12
:スマイルboonを 探せ!zipの中身
スック
スック

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

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

BGM提供: DOVA-SYNDROME
https://dova-s.jp/
「Pixel Twinkle」 written by Kei Morimoto

効果音提供:魔王魂
https://maou.audio/
「maou_se_magical06」 : 魔法 マジカル06
「maou_se_onepoint17」: ワンポイント17
「maou_se_system43」 : システム音 システム43

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

左右キーで てんとう虫を動かす

5匹の 虫を 動かす

ゲームオーバー

クリア

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

ラッチ先生
ラッチ先生

今回の「えさを ねらえ!」では、
・ てんとう虫を 動かす
・ てんとう虫の口を 配置する
・ 10個のボールを ランダムな場所で 表示する
プログラムがあります。

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

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

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

ラッチ先生
ラッチ先生

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

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

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

ラッチ先生
ラッチ先生

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

スック
スック

リスト:bugsバグズ を作成して、その中にbugバグ を追加していくんだ

スック
スック

maxマックス( )メソッドとminミン( )メソッドを使って
動ける範囲を 決めたよ

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

10秒以内でえさをたべたか判定のプログラムを まとめたよ

スック
スック

てんとう虫が 後ろ向きに触れても クリアにならないよ

ラッチ先生
ラッチ先生

てんとう虫を動かすスイッチとして
プロパティ:onオン を追加します。

pythonしよう!簡単なゲーム12:プロパティonの解説
Python
ladybug = Actor("ladybug", (100, 500))
ladybug.on = True #1 プロパティ:on を 追加する
Python
def ladybug_move(): #2 てんとう虫の動きを  定義する
    if ladybug.on: #3 もし プロパティonが Trueなら
        ladybug.move_forward(3) #4 3px 進む

def update():
    ladybug_move() #5 てんとう虫が 動く
Q
move_forward( )メソッドとは
pythonしよう!簡単なゲーム12:move_forward()メソッドの解説
ラッチ先生
ラッチ先生

つぎに、
onオン_keyキー_downダウン(keyキー) 関数を使って
左右キーで てんとうむ虫の向きを 90度ずつ変えます

pythonしよう!簡単なゲーム12:on_key_down()関数の解説
Python
def on_key_down(key): #1 キーを押した時の動きを 定義する
    if ladybug.on: #2 プロパティonが Trueなら
        if key == keys.RIGHT: #3 もし 右キーなら
            ladybug.angle -= 90 #4 てんとう虫の向きを 90度減らす

        elif key == keys.LEFT: #5 もし 左キーなら
            ladybug.angle += 90 #6 てんとう虫の向きを 90度増やす
            
def update():
スック
スック

あれれっ⁉ てんとう虫が スクリーンから 消えちゃうよ…

ラッチ
ラッチ

おぉぉぉ…と!
上下左右の壁に 跳ね返るように しましょう

今回は、maxマックス( ) 関数と minミン( )関数を使って
てんとう虫が動ける範囲をプログラムします。

Q
max関数、min関数とは
pythonしよう!簡単なゲーム12:max関数とmin関数の解説
スック
スック

左右に壁の跳ね返りの角度の出し方です

pythonしよう!簡単なゲーム12:跳ね返りの角度の解説
Python
def ladybug_move(): 
    if ladybug.on: 
        ladybug.move_forward(3)

        if ladybug.x < 50 or ladybug.x > WIDTH-50: #1 壁に触れたら
            ladybug.x = max(50, min(ladybug.x, WIDTH-50)) #2 x座標の範囲
            ladybug.angle = 180 - ladybug.angle #3 跳ね返る
ラッチ先生
ラッチ先生

上下の壁も跳ね返るようにします

今度は、てんとう虫のy座標の範囲を 決めます

Q
max関数、min関数とは
pythonしよう!簡単なゲーム12:max関数とmin関数の解説
Python
def ladybug_move(): 
    if ladybug.on: 
        ladybug.move_forward(3)

        if ladybug.x < 50 or ladybug.x > WIDTH-50: 
            ladybug.x = max(50, min(ladybug.x, WIDTH-50)) 
            ladybug.angle = 180 - ladybug.angle

        elif ladybug.y < 50 or ladybug.y > HEIGHT-50: #1 上下の壁に触れたら
            ladybug.y = max(50, min(ladybug.y, HEIGHT-50)) #2 y座標の範囲
            ladybug.angle = -ladybug.angle #3 跳ね返る
スック
スック

これで、てんとう虫の動きのプログラムは 完成です

ラッチ先生
ラッチ先生

空のリスト:bugsバグズ を作成して、
5匹の虫を ランダムに表示しよう

pythonしよう!簡単なゲーム12:ポイント2の解説
Python
bg_image = "bg"

bugs = [] #1 空のリストbugsを 用意する

for i in range(5): #2 5回繰り返す
    x = random.randint(200, 750) #3 x座標に 200~750からランダムに選んだ数値を代入する
    y = random.randint(50, 550) #4 y座標に 50~550からランダムに選んだ数値を代入する
    bug = Actor("bug", (x, y)) #5 虫を生成する
    bugs.append(bug) #6 リストbugsに 虫を追加する

def ladybug_move(): 
Python
def draw():
    screen.blit(bg_image, (0, 0))
    prey.draw()
    ladybug.draw()
    for bug in bugs: #7 リストbugsから 虫を取り出す
        bug.draw() # 8 虫を 表示する
Q
randint関数とは
pythonしよう!簡単なゲーム12:randint関数の解説
Q
append( )メソッドとは
pythonしよう!簡単なゲーム12:append()メソッドの解説
スック
スック

てんとう虫と 重ならないように表示したよ

ラッチ先生
ラッチ先生

虫のプロパティ
angleアングル(向き):上下左右の 4方向
speedスピード(動くスピード): 3~10px 

上記の2点で 動くようにします

Python
for i in range(5): 
    x = random.randint(200, 750) 
    y = random.randint(50, 550) 
    bug = Actor("bug", (x, y))
    bug.angle = 90 * random.choice([-1, 0, 1, 2]) #1 プロパティangleに -90, 0, 90, 180 からランダムに選んだ数値を代入する
    bug.speed = random.randint(3, 10) #2 プロパティspeedに 3~10からランダムに選んだ数値を代入する
    bugs.append(bug) 
Q
choice( )関数とは
ラッチ先生
ラッチ先生

defデフ bugバグ_moveムーヴ( )関数で 虫の動きを定義しましょう

スック
スック

虫が バラバラに 動き出したぞ!

ラッチ先生
ラッチ先生

虫も てんとう虫と同じように 動ける範囲を決めて
壁に当たったら 跳ね返るように しましょう

スック
スック

虫の画像の大きさは、
50 × 50 px です

pythonしよう!簡単なゲーム12:画像bugの解説
Python
def bug_move(): 
    if ladybug.on: 
        for bug in bugs: 
            bug.move_forward(bug.speed)

            if bug.x < 25 or bug.x > WIDTH-25: #1 もし 虫のx座標が 25より小さい または 775より大きいなら
                bug.x = max(25, min(bug.x, WIDTH-25)) #2 虫のx座標の範囲は 25~775まで
                bug.angle = 180- bug.angle #3 跳ね返る

            elif bug.y < 25 or bug.y > HEIGHT-25: #4 もし 虫のy座標が 25より小さい または 575より大きいなら        
                bug.y = max(25, min(bug.y, HEIGHT-25)) #5 虫のy座標の範囲は 25~575まで
                bug.angle = -bug.angle #6 跳ね返る
スック
スック

おおっ!いいねえ

ラッチ先生
ラッチ先生

collideコライド_pixelピクセル( )メソッドを使って
虫に触れたら てんとう虫は 50px後退させよう

pythonしよう!簡単なゲーム12:collide_pixel()メソッドの解説
Python
def bug_move(): 
    if ladybug.on: 
        for bug in bugs: 
            bug.move_forward(bug.speed)

            if bug.x < 25 or bug.x > WIDTH-25: 
                bug.x = max(25, min(bug.x, WIDTH-25)) 
                bug.angle = 180- bug.angle 

            elif bug.y < 25 or bug.y > HEIGHT-25: 
                bug.y = max(25, min(bug.y, HEIGHT-25)) 
                bug.angle = -bug.angle

            elif bug.collide_pixel(ladybug): #1 もし てんとう虫に触れたら
                sounds.maou_se_system43.play() #2 効果音を 鳴らす
                ladybug.move_forward(-50) #3 50px後退する
Q
play( )メソッドとは

効果音提供:魔王魂
https://maou.audio/

「maou_se_system43」 : システム音 システム43

スック
スック

なかなか、前に進まないね!

ラッチ先生
ラッチ先生

10秒以内に えさに たどり着かなかったら ゲームオーバーです。

変数countカウント を宣言して 秒数を 表示させましょう

スック
スック

countカウント_downダウン関数で、
・ 変数countカウント のデータから 1 減らす
・ 変数countカウント が 0 になったら 動きを 止める
を 定義して ます。

Python
bg_image = "bg"
count = 10 #1 変数countを 宣言 初期値:10
Python
def count_down(): #2 カウントダウンの関数を 定義する
    global count #3 グローバル変数 count

    if ladybug.on: #4 もし プロパティonが Trueなら
        count -= 1 #5 変数coutnを 1減らす

        if count == 0: #6 もし 変数カウントが 0 なら
            clock.unschedule(count_down) #7 count_down関数を 停止する
            ladybug.on = False #8 プロパティonを Falseにする

def on_key_down(key):
Q
unschedule( )メソッドとは
pythonしよう!簡単なゲーム12:unschedule( )メソッドの解説
ラッチ先生
ラッチ先生

scheduleスケジュール_intervalインターバル()メソッドで、
1秒ごとに countカウント_downダウン関数を 実行させよう

pythonしよう!簡単なゲーム12:schedule_interval( )メソッドの解説
Python
def draw():
    screen.blit(bg_image, (0, 0))
    screen.draw.text(f"TIME: {count}",
     (10, 10), 
     fontsize=70,
     color="blue") #9 カウント表示する
    prey.draw()
    ladybug.draw()
    for bug in bugs: 
        bug.draw()

clock.schedule_interval(count_down, 1) #10 1秒ごとに count_down関数を実行する
Q
text( )メソッドとは
pythonしよう!簡単なゲーム12:text( )メソッドの解説
Q
f 文字列
pythonしよう!簡単なゲーム12:f文字列の解説

79. screen.draw.text(f” TIME : {count}”,

変数countのデータが 10,9,8…0と スクリーンに表示されます

スック
スック

タイムが 0 になったら, 動きが止まったね

ラッチ先生
ラッチ先生

10秒以内にえさを ふれたか 判定を
gameゲーム_endエンド()関数に 定義します。

pythonしよう!簡単なゲーム12:ポイント3の解説
Python
def game_end(bg,sound): #2 ゲームエンド関数を定義する
    global bg_image #3 グローバル変数 bg_image

    music.stop() #4 BGMを止める
    bg_image = bg #5 引数bgを 変数bg_imageに 代入する
    sound.play() #6 効果音を 再生する

def on_key_down(key): 
Python
clock.schedule_interval(count_down, 1) 
music.play("pixel_twinkle") #1 BGMを 流す
Q
musicモジュールとは

BGM提供: DOVA-SYNDROME
https://dova-s.jp/
「Pixel Twinkle」 written by Kei Morimoto

スック
スック

「pixel twinkle」と 大文字の『P』『T』を小文字にしてね

pygame zeroプログラムでは、大文字はエラーになっちゃうんだ

ラッチ先生
ラッチ先生

それでは、変数countカウントが 0 になったら、
gameゲーム_endエンド( )関数で ゲームオーバーに しましょう

Python
def count_down(): 
    global count 

    if ladybug.on: 
        count -= 1 

        if count == 0: 
            clock.unschedule(count_down)
            game_end("bg_over", sounds.maou_se_magical06) #1 game_end( )関数を 実行する           
            ladybug.on = False 

効果音提供:魔王魂
https://maou.audio/


「maou_se_magical06」 : 魔法 マジカル06

スック
スック

おおっ!いいね。

ラッチ先生
ラッチ先生

collideコライド_pixelピクセル( )メソッドを使って
えさを食べたら クリアになるプログラムを 作りましょう

Python
def ladybug_move(): 
    if ladybug.on: 
        ladybug.move_forward(3)

        mouth.pos = move(ladybug.x,
                         ladybug.y,
Python
        elif ladybug.y < 50 or ladybug.y > HEIGHT-50: 
            ladybug.y = max(50, min(ladybug.y, HEIGHT-50)) 
            ladybug.angle = -ladybug.angle

        if ladybug.collide_pixel(prey): #1 えさに 触れたら
                game_end("bg_clear", sounds.maou_se_onepoint17)  #2 game_end()関数を 実行する
                ladybug.on = False #3 プロパティon を Falseに設定する 

効果音提供:魔王魂
https://maou.audio/

「maou_se_onepoint17」: ワンポイント17

スック
スック

あれっ⁉ おしりでも クリアに なるの…?

ラッチ先生
ラッチ先生

そうですね。お尻で クリアは 納得しませんね

そういう場合は、口のオブジェクトを てんとう虫につけて
口が えさに触れたら クリアになるように しましょう

pythonしよう!簡単なゲーム12:move( )関数の解説
Python
ladybug.on = True

mouth = Actor("mouth", (100, 500)) #1 口を 生成する
mouth.visible = True #2 プロパティvisibleを Trueにする
Python
def ladybug_move(): 
    if ladybug.on: 
        ladybug.move_forward(3)

        mouth.pos = move(ladybug.x,
                         ladybug.y,
                         ladybug.angle,
                         35) #3 口の座標(pos)に てんとう虫の座標から35px前に 設定する
Python
def draw():
    screen.blit(bg_image, (0, 0))
    screen.draw.text(f"TIME: {count}",
                     (10, 10),
Python
    for bug in bugs: 
        bug.draw()
    if mouth.visible: #4 プロパティvisibleが Trueなら
        mouth.draw() #5 口を 表示する
Q
プロパティvisibleとは
ラッチ先生
ラッチ先生

プロパティ:visible の Ture / False で
口の 表示 / 非表示 を するよ

スック
スック

口は、ちゃんと てんとう虫に くっついているね

ラッチ先生
ラッチ先生

それでは、
クリアの条件を てんとう虫が えさに触れたではなく

Python
if ladybug.collide_pixel(prey): #1 もし えさに触れたら

ladybugレディバグmouthマウス に 変えます

Python
if mouth.collide_pixel(prey): #1 もし えさに触れたら
Python
def ladybug_move(): 
    if ladybug.on: 
        ladybug.move_forward(3)

        mouth.pos = move(ladybug.x,
                         ladybug.y,
Python
        elif ladybug.y < 50 or ladybug.y > HEIGHT-50: 
            ladybug.y = max(50, min(ladybug.y, HEIGHT-50)) 
            ladybug.angle = -ladybug.angle

        if mouth.collide_pixel(prey): #1 口が えさに 触れたら
                game_end("bg_clear", sounds.maou_se_onepoint17)  
                ladybug.on = False 
スック
スック

おおっ!口の方で クリアしたぞ!

ラッチ先生
ラッチ先生

最後に
プロパティvisibleビジブルFalseフォルス にして 非表示にしておけば
みんなには 口の存在が わからないよ

Python
mouth = Actor("mouth", (100, 500)) 
mouth.visible = True #1 プロパティvisibleを False にする
スック
スック

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

ラッチ先生
ラッチ先生

今回は、
5匹の虫を よけながら えさへたどり着くプログラムを作りました。

えさを ねらえ!
Python
import pgzrun
from pgzhelper import * 
import random 

WIDTH = 800
HEIGHT = 600

ladybug = Actor("ladybug", (100, 500))
ladybug.on = True

mouth = Actor("mouth", (100, 500)) 
mouth.visible = False 

prey = Actor("prey", (700, 100))

bg_image = "bg"
count = 10

bugs = [] 

for i in range(5): 
    x = random.randint(200, 750) 
    y = random.randint(50, 550) 
    bug = Actor("bug", (x, y)) 
    bug.angle = 90 * random.choice([-1, 0, 1, 2]) 
    bug.speed = random.randint(3, 10) 
    bugs.append(bug) 

def ladybug_move(): 
    if ladybug.on: 
        ladybug.move_forward(3) 

        mouth.pos = move(ladybug.x,
                         ladybug.y,
                         ladybug.angle,
                         35) 

        if ladybug.x < 50 or ladybug.x > WIDTH-50: 
            ladybug.x = max(50, min(ladybug.x, WIDTH-50)) 
            ladybug.angle = 180 - ladybug.angle 

        elif ladybug.y < 50 or ladybug.y > HEIGHT-50: 
            ladybug.y = max(50, min(ladybug.y, HEIGHT-50)) 
            ladybug.angle = -ladybug.angle 

        if mouth.collide_pixel(prey): 
            game_end("bg_clear", sounds.maou_se_onepoint17) 
            ladybug.on = False 

def bug_move(): 
    if ladybug.on: 
        for bug in bugs: 
            bug.move_forward(bug.speed) 

            if bug.x < 25 or bug.x > WIDTH-25: 
                bug.x = max(25, min(bug.x, WIDTH-25)) 
                bug.angle = 180- bug.angle 

            elif bug.y < 25 or bug.y > HEIGHT-25: 
                bug.y = max(25, min(bug.y, HEIGHT-25)) 
                bug.angle = -bug.angle 

            elif bug.collide_pixel(ladybug): 
                sounds.maou_se_system43.play() 
                ladybug.move_forward(-50) 

def count_down(): 
    global count 

    if ladybug.on: 
        count -= 1 

        if count == 0: 
            clock.unschedule(count_down) 
            game_end("bg_over", sounds.maou_se_magical06) 
            ladybug.on = False 

def game_end(bg,sound): 
    global bg_image 

    music.stop() 
    bg_image = bg 
    sound.play() 
            
def on_key_down(key):
    if ladybug.on: 
        if key == keys.RIGHT: 
            ladybug.angle -= 90 

        elif key == keys.LEFT: 
            ladybug.angle += 90
            
def update():
    ladybug_move() 
    bug_move() 

def draw():
    screen.blit(bg_image, (0, 0))
    screen.draw.text(f"TIME: {count}",
                     (10, 10),
                     fontsize=70,
                     color="blue") 
    prey.draw()
    ladybug.draw()
    for bug in bugs: 
        bug.draw() 
    if mouth.visible: 
        mouth.draw() 

clock.schedule_interval(count_down, 1) 
music.play("pixel_twinkle") 

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

てんとう虫や虫が動く 範囲は、
maxマックス( )と minミン( ) 関数を 使うと 便利だったね

ラッチ先生
ラッチ先生

また、
てんとう虫 に 口 をつけることで
クリアの仕方が よくなったね

スック
スック

これは、いろいろなゲームに使えるよ

それじゃあ、またね!

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

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

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