簡単なゲーム

【Pygame Zero】簡単なゲーム08:タップゲームを作ろう

ratch2025

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

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

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

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

BGM提供:DOVA-SYNDROME
https://dova-s.jp/
Toy_Storeby Heitaro Ashibe

効果音提供:Chisato’s Website
https://chisatosound.sakura.ne.jp/index.html
「Accent. Brilliant [02] (Low)」:アクセント
・ 「Coin Get [01] (Low)」: アクションゲーム
「Kiga Nukeru [01] (Long)」:アニメ 
・ 「Correct Answer [01D]」:クイズ                 

ラッチ先生
ラッチ先生

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

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

今回は、スクリーンの色を “lavenderラベンダー“に したよ

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

pythonしよう!簡単なゲーム08:boon タップゲーム!zipの中身
スック
スック

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

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

BGM提供:DOVA-SYNDROME
https://dova-s.jp/
Toy_Storeby Heitaro Ashibe

効果音提供:Chisato’s Website
https://chisatosound.sakura.ne.jp/index.html
「Accent. Brilliant [02] (Low)」:アクセント
・ 「Coin Get [01] (Low)」: アクションゲーム
「Kiga Nukeru [01] (Long)」:アニメ 
・ 「Correct Answer [01D]」:クイズ                 

pythonしよう!簡単なゲーム08:
music、soundsフォルダ
スポンサーリンク

カウントダウン

8回 boonを 表示する

ゲーム終了

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

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

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

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

ラッチ先生
ラッチ先生

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

pythonしよう!簡単なゲーム08:Actorクラスの解説
スック
スック

これで、変数boonボーン や 変数handハンド
「 . (ドット)」を付ければ 使えるよ

ラッチ先生
ラッチ先生

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

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

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

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

4つに 分けたよ

ラッチ先生
ラッチ先生

boonボーンと 手に表示・非表示するスイッチとして
プロパティ:showショー を追加します。

pythonしよう!簡単なゲーム08:プロパティshowの解説
Python
boon = Actor("boon", (400, 250))
boon.show = True   #1 プロパティshowに Tureを設定する

hand = Actor("hand", (400, 380))
hand.show = False   #2 プロパティshowに Falseを設定する

def draw():
    screen.fill("lavender")

    if boon.show:  #3 もし プロパティshow が Trueなら 
        boon.draw()
    if hand.show:  #4 もし プロパティshow が Trueなら
        hand.draw()
pythonしよう!簡単なゲーム08:カウントダウン①の解説
スック
スック

手は、消しておくよ

ラッチ先生
ラッチ先生

textテキスト( )メソッドを使って
Pressプレス SPACEスペース toトゥー Startスタート!(スペースキーを押して スタート!」
を 表示します。

pythonしよう!簡単なゲーム08:text()メソッドの解説
Python
game = "ready"  #1 変数gameを 宣言 初期値:ready

def draw():
    screen.fill("lavender")
    if game == "ready":  #2 もし 変数gameが readyなら
        screen.draw.text("Press SPACE to Start!",
                         center = (400, 500),
                         fontsize = 70,
                         color = "blue"
                         )  #3 「Press SPACE to Start!」を 表示する
pythonしよう!簡単なゲーム08:カウントダウン②の解説
ラッチ先生
ラッチ先生

次は、カウントダウンの合図を リストcountsカウンツに 入れよう

そして、
変数countsカウンツ_indexインデックスを作って リストcountsカウンツの 番号を入れるよ

pythonしよう!簡単なゲーム08:変数counts_index
Python
counts = ["3", "2", "1", "Start!"]  #1 リストcountsに 「3、2、1、start」を 代入する 
counts_index = 0  #2 変数counts_index を宣言 初期値:0
スック
スック

スペースキーを押したら boonボーンを消して、
カウントダウンの数字を 表示するよ

playプレイ()メソッドを使って 効果音を入れよう

pythonしよう!簡単なゲーム08:play()メソッドの解説
Python
def draw():
    screen.fill("lavender")
    if game == "ready": 
        screen.draw.text("Press SPACE to Start!",
                         center = (400, 500),
                         fontsize = 70,
                         color = "blue"
                         ) 
    elif game == "count":  #8 もし 変数gameが countなら
        screen.draw.text(counts[counts_index],
                         center = (400, 300),
                         fontsize = 200,
                         color = "red"
                         ) #9 リストcountsのindex番を 表示する
Python
def on_key_down(key):  #1 キーを押した関数を 定義する
      global game        #2 グローバル変数 game

    if key == keys.SPACE:   #3 もし スペースキーが 押されたら
        if game == "ready": #4 もし 変数gameが readyなら
            game = "count"  #5 変数gameに countを 代入する
            boon.show = False  #6 プロパティshowに Falseを設定する
            sounds.coin_get_01_low.play() #7 効果音を 入れる
スック
スック

おおっ! カウント「3」が 出てきたぞ

ラッチ先生
ラッチ先生

countdownカウントダウン( )関数を 定義を しましょう

lenレン ( )関数を使って
「3、2,1,Startスタート! 」で 止まるようにしました。

pythonしよう!簡単なゲーム08:len関数の解説
Python
def countdown():    #1 countdown()関数を 定義する
    global game, counts_index  #2 グローバル変数game counts_index

    counts_index += 1  #3 変数counts_indexを 1ずつ増やす

    if counts_index < len(counts):    #4 変数counts_indexが リストcountsの要素の数より 小さければ
        sounds.coin_get_01_low.play() #5 効果音を鳴らす
    else:                             #6 その他
        clock.unschedule(countdown)   #7 countdown関数を 止める
        game = "play"                 #8 変数gameに playを代入する
Q
unschedule( )メソッドとは
pythonしよう!簡単なゲーム08:unschedule( )メソッドの解説
Q
play( )メソッドとは
pythonしよう!簡単なゲーム08:
play()メソッドの解説
スック
スック

そして、
scheduleスケジュール_intervalインターバル( ) メソッドで、
0.6秒ごとに countdownカウントダウン関数を 実行させるんだ!

pythonしよう!簡単なゲーム08:schedule_interval()メソッドの解説
Python
def on_key_down(key): 
    global game  

    if key == keys.SPACE:
        if game == "ready": 
            game = "count" 
            boon.show = False 
            sounds.coin_get_01_low.play() 
            clock.schedule_interval(countdown, 0.6) #1 0.6秒ごと countdown関数を 実行する
スック
スック

これで、カウントダウン完成!

ラッチ先生
ラッチ先生

最初に リストboonボーン_imagesイメージズを 作成し、
画像”boonボーン_okオーケー” と ”boonボーン_outアウト“を 入れましょう

pythonしよう!簡単なゲーム08:リストboon_imagesの解説
Python
boon = Actor("boon", (400, 250))
boon.show = True 
boon_images = ["boon_ok", "boon_out"] #1 リストboon_imagesに 2つの画像を 代入する
ラッチ先生
ラッチ先生

そして、
この2つのboonボーンの画像を 8回 ランダムに表示する
boonボーン_showショー() 関数を 定義します

choiceチョイス( )メソッドを使って
boonボーン_okオーケー” か “boonボーン_outアウト” か ランダムに選びます

Python
def boon_show(): #1 boon_show()関数を 定義する
    global game #2 グローバル変数game

    boon.image = random.choice(boon_images) #3 プロパティimageに リストboon_imagesから ランダムに選ぶ
    boon.show = True #4 boonの画像を表示する
    sounds.coin_get_01_low.play() #5 効果音を 鳴らす
ラッチ先生
ラッチ先生

カウントダウンが終わって、変数gameゲームが “playプレイ“になったら
boonボーン_moveムーヴ()関数を 実行しよう

Python
def countdown(): 
    global game, counts_index 

    counts_index += 1 

    if counts_index < len(counts): 
        sounds.coin_get_01_low.play() 
    else: 
        clock.unschedule(countdown) 
        game = "play" 
        boon_show()  #1 boon_show()関数を 実行する
スック
スック

おおっ!boonボーンの画像が、出てきたぞ

ラッチ先生
ラッチ先生

boonボーンにプロパティcountカウントを追加します。
ここには、boonボーン画像が表示した回数が 入ります。

Python
boon = Actor("boon", (400, 250))
boon.show = True 
boon_images = ["boon_ok", "boon_out"]  
boon.count = 0            #1 プロパティcountに 0を設定する
ラッチ先生
ラッチ先生

次に、boonボーン_showショー()関数を 修正します。
boonボーン画像が 表示するたびに プロパティcountカウント を 1ずつ増やす
boonボーン画像の表示回数を 8回

Python
def boon_show(): 
    global game 

    if boon.count < 8:  #1 もし プロパティcountが 8未満なら
        boon.image = random.choice(boon_images) 
        boon.show = True 
        sounds.coin_get_01_low.play() 
        boon.count += 1 #2 プロパティcountを 1ずつ増やす
ラッチ先生
ラッチ先生

そして、scheduleスケジュール_intervalインターバル( ) メソッドで、
0.6秒ごと boonボーン_showショー( )関数を 実行させてみよう

Python
def countdown(): 
    global game, counts_index 

    counts_index += 1 

    if counts_index < len(counts): 
        sounds.coin_get_01_low.play() 
    else: 
        clock.unschedule(countdown) 
        game = "play" 
        boon_show() 
        clock.schedule_interval(boon_show, 0.6)  #1 0.6秒ごとに boon_show関数を 実行する
スック
スック

あれれっ…!? 8回 boonボーンの顔が 表示された…?

ラッチ先生
ラッチ先生

まだですよ!

boonボーン画像を 非表示にする boonボーン_hideハイド()関数を定義します。

そして、scheduleスケジュール( )メソッドを使って
boonボーン画像が表示された0.4秒後に、boonボーン_hideハイド関数を 実行させるんだ

pythonしよう!簡単なゲーム08:schedule()メソッドの解説
Python
def boon_show(): 
    global game 

    if boon.count < 8: 
        boon.image = random.choice(boon_images) 
        boon.show = True 
        sounds.coin_get_01_low.play() 
        boon.count += 1 
        clock.schedule(boon_hide, 0.4) #3 0.4秒後に boon_hide関数を実行する

def boon_hide():     #1 boon_hide関数を 定義する
    boon.show = False  #2 プロパティshowを Falseに設定する
スック
スック

おおっ!いいねえ

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

スペースキーを 押したら、「手」を表示させましょう

Python
def on_key_down(key): 
    global game  

    if key == keys.SPACE:
        if game == "ready": 
            game = "count" 
            boon.show = False 
            sounds.coin_get_01_low.play() 
            clock.schedule_interval(countdown, 0.6) 

        elif game == "play":  #1 もし 変数gameが playなら
            hand.show = True  #2 手のプロパティshowを Trueにする

def on_key_up(key):        #3 キーを 離した関数を 定義する
    if key == keys.SPACE:  #4 もし キーが スペースキーなら
        hand.show = False  #5 手のプロパティshowに Falseを設定する
スック
スック

これで、タップできるね

ラッチ先生
ラッチ先生

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

pythonしよう!簡単なゲーム08:ポイント1の解説
Python
game = "ready" 
bg_image = None    #2 変数bg_imageを 宣言 初期値:None(無し) 

def draw():
    screen.fill("lavender")
    if bg_image:   #3 もし 変数bg_imageに 背景画像があったら
        screen.blit(bg_image, (0, 0))  #4 変数bg_imageの背景画像を 表示する
    if game == "ready": 
Python
def game_end(bg, costume, sound):  #5 game_end( )関数を 定義する
    global bg_image       #6 グローバル変数 bg_image

    music.stop()          #7 BGMを 止める
    bg_image = bg         #8 変数bg_imageに 引数bgを代入する
    boon.image = costume  #9 プロパティimageを 引数coutumeに設定する
    sound.play()          #10 変数soundの効果音を 再生する

music.play("toy_store")  #1 BGMを 流す
スック
スック

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

ラッチ先生
ラッチ先生

ゲームオーバーは、下記の2点です。

1.画像boonボーン_okオーケー を タップする
2.画像boonボーン_outアウト を タップしない

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

まずは、画像boonボーン_okオーケーを タップしたらゲームオーバーになる
プログラムを作ります。

Python
def on_key_down(key): 
    global game  

    if key == keys.SPACE:
        if game == "ready": 
            game = "count" 
            boon.show = False 
            sounds.coin_get_01_low.play() 
            clock.schedule_interval(countdown, 0.6) 

        elif game == "play":
            hand.show = True  

            if boon.show and boon.image == "boon_ok": #1 もし プロパティshowが True かつ 画像boon _okなら
                game = "result"  #2 変数gameに result(結果)を代入する
                clock.unschedule(boon_show)  #3 boon_show関数を 停止する
                clock.unschedule(boon_hide)  #4 boon_hide関数を 停止する
                game_end("bg_over", "boon_over", sounds.kiga_nukeru_01_long)  #5 game_end()関数を 実行する
スック
スック

unscheduleアンスケジュール( )メソッドで、
boonボーン_showショー関数とboonボーン_hideハイド関数を中止することを 忘れないでね

ラッチ先生
ラッチ先生

つぎは、画像boonボーン_outアウトを タップしなかったら
ゲームオーバーになるプログラムを作ります。

boonボーンオブジェクトに プロパティtapタップを追加して
タップされたか わかるようにしよう

pythonしよう!簡単なゲーム08:プロパティtapの解説
Python
def boon_show(): 
    global game 

    boon.tap = False  #1 プロパティtapを Falseに設定する
スック
スック

これで、
毎回boonボーン画像が表示されると、タップされてないことになります

ラッチ先生
ラッチ先生

先ほどの、画像boonボーン_okオーケー以外 スペースキーを押されたら
プロパティtapタップTrueトゥルーに なります。

Python
def on_key_down(key): 
    global game  

    if key == keys.SPACE:
        if game == "ready": 
            game = "count" 
            boon.show = False 
            sounds.coin_get_01_low.play() 
            clock.schedule_interval(countdown, 0.6) 

        elif game == "play":
            hand.show = True  

            if boon.show and boon.image == "boon_ok": 
                game = "result" 
                clock.unschedule(boon_show) 
                clock.unschedule(boon_hide) 
                game_end("bg_over", "boon_over", sounds.kiga_nukeru_01_long) 
            else:                #1 その他
                boon.tap = True  #2 プロパティtapに Trueを設定する
                sounds.correct_answer_01d.play()  #3 効果音を入れる
スック
スック

おおっ! boonボーンが タップされたら わかるね

ラッチ先生
ラッチ先生

今度のゲームオーバーは、
画像boonボーン_outアウトの時タップしなかった場合です。

つまり、boonボーンhideハイド関数で、画像boonボーン_outアウトが消えた時に
プロパティtapタップFalseフォルスになっていたら …

スック
スック

ゲームオーバー!!

Python
def boon_hide(): 
    global game   #1 グローバルgame

    if game == "play" and boon.image == "boon_out" and not boon.tap:  #2 もし 変数gameが play かつ 画像boon_out かつ プロパティtap  が Falseなら
        game = "result"  #3 変数gameを result(結果)を代入する
        clock.unschedule(boon_show)  #4 boon_show関数を 停止する
        game_end("bg_over", "boon_over", sounds.kiga_nukeru_01_long)  #5 game_end( )関数を 実行する
        return  #6 この関数から 抜ける
        
    boon.show = False 
ラッチ先生
ラッチ先生

それでは、最後のプログラム。ゲームクリアです。

8回boonボーンの画像をクリアです

Python
def boon_show(): 
    global game 

    boon.tap = False 

    if boon.count < 8: 
        boon.image = random.choice(boon_images) 
        boon.show = True 
        sounds.coin_get_01_low.play() 
        boon.count += 1 
        clock.schedule(boon_hide, 0.4) 
    else:    #1 その他(プロパティcountが 8以上)
        clock.unschedule(boon_show)  #2 boon_show関数を 停止する
        game = "result"     #3 変数gameに result(結果)を 代入する
        boon.show = True    #4 プロパティshowを Trueに設定する
        game_end("bg_clear", "boon_clear", sounds.accent_brilliant_02_low)  #5 game_end( )関数を実行する
スック
スック

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

ラッチ先生
ラッチ先生

今回は、
タップゲームをプログラムを 作りました。

boon タップゲーム!
Python
import pgzrun
import random

WIDTH = 800
HEIGHT = 600

boon = Actor("boon", (400, 250))
boon.show = True 
boon_images = ["boon_ok", "boon_out"]  
boon.count = 0 

hand = Actor("hand", (400, 380))
hand.show = False 

counts = ["3", "2", "1", "Start!"] 
counts_index = 0 

game = "ready" 
bg_image = None 

def draw():
    screen.fill("lavender")
    if bg_image: 
        screen.blit(bg_image, (0, 0)) 
    if game == "ready": 
        screen.draw.text("Press SPACE to Start!",
                         center = (400, 500),
                         fontsize = 70,
                         color = "blue"
                         ) 
    elif game == "count": 
        screen.draw.text(counts[counts_index],
                         center = (400, 300),
                         fontsize = 200,
                         color = "red"
                         ) 
        
    if boon.show: 
        boon.draw()
    if hand.show: 
        hand.draw()

def on_key_down(key): 
    global game  

    if key == keys.SPACE:
        if game == "ready": 
            game = "count" 
            boon.show = False 
            sounds.coin_get_01_low.play() 
            clock.schedule_interval(countdown, 0.6) 

        elif game == "play":
            hand.show = True  

            if boon.show and boon.image == "boon_ok": 
                game = "result" 
                clock.unschedule(boon_show) 
                clock.unschedule(boon_hide) 
                game_end("bg_over", "boon_over", sounds.kiga_nukeru_01_long) 
            else: 
                boon.tap = True 
                sounds.correct_answer_01d.play() 

def on_key_up(key): 
    if key == keys.SPACE: 
        hand.show = False 
    
def countdown(): 
    global game, counts_index 

    counts_index += 1 

    if counts_index < len(counts): 
        sounds.coin_get_01_low.play() 
    else: 
        clock.unschedule(countdown) 
        game = "play" 
        boon_show() 
        clock.schedule_interval(boon_show, 0.6) 

def boon_show(): 
    global game 

    boon.tap = False 

    if boon.count < 8: 
        boon.image = random.choice(boon_images) 
        boon.show = True 
        sounds.coin_get_01_low.play() 
        boon.count += 1 
        clock.schedule(boon_hide, 0.4) 
    else: 
        clock.unschedule(boon_show) 
        game = "result" 
        boon.show = True 
        game_end("bg_clear", "boon_clear", sounds.accent_brilliant_02_low) 

def boon_hide(): 
    global game 

    if game == "play" and boon.image == "boon_out" and not boon.tap: 
        game = "result" 
        clock.unschedule(boon_show) 
        game_end("bg_over", "boon_over", sounds.kiga_nukeru_01_long) 
        return 
        
    boon.show = False 

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

    music.stop() 
    bg_image = bg 
    boon.image = costume 
    sound.play() 

music.play("toy_store")

def update():
    pass

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

gameゲーム_endエンド( )関数で、
ゲームクリア・オーバーのプログラムをまとめました。

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

引数に 入れたいものを記入するだけ!
簡単で 便利だね

それじゃ、またね!

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

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

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