簡単なゲーム

【Pygame Zero】簡単なゲーム21:運命の分かれ道!あみだくじゲーム

ratch2025

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

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

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

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

BGM提供: DOVA-SYNDROME
https://dova-s.jp/
・ 「晴色カレイドスコープ」 written by まんぼう二等兵

効果音提供:効果音ラボ
https://soundeffect-lab.info/
・ 「間抜け4」: アニメ
・ 「決定ボタンを押す3」: ボタン・システム音
・ 「成功音」: ボタン・システム音

ラッチ先生
ラッチ先生

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

pythonしよう!簡単なゲーム21:boonとあみだくじを表示するを解説
pythonしよう!簡単なゲーム21:boonあみだくじ!zipの中身
スック
スック

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

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

BGM提供: DOVA-SYNDROME
https://dova-s.jp/
・ 「晴色カレイドスコープ」 written by まんぼう二等兵

効果音提供:効果音ラボ
https://soundeffect-lab.info/
・ 「間抜け4」: アニメ
・ 「決定ボタンを押す3」: ボタン・システム音
・ 「成功音」: ボタン・システム音

pythonしよう!簡単なゲーム21:boonあみだくじ!zipの中身
スポンサーリンク

あみだくじを 作る

3つのボタンを作る

boonが 動く

結果発表

pythonしよう!簡単なゲーム21:boonあみだくじ!結果発表の解説

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




★ラッチ先生の言葉から

ラッチ先生
ラッチ先生

今回の「boon あみだくじ!」では、
・ あみだくじを 作る
・ ボタンを クリックする
プログラムがあります。

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

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

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

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

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




ラッチ先生
ラッチ先生

今回のプログラミングのポイントが こちらです

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

『dirディル』 は、「durationディレクション(方向)」の略語だよ




ラッチ先生
ラッチ先生

最初に
左側の横棒を 全部表示しましょう

空リストbarsバーズ を 作成して、9本のbarバー を生成して追加しましょう

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

bars = [] #1 空リストbarsを 作成する

for i in range(9): #2 9回繰り返す
    bar = Actor("bar", (275, 100 + 50 * i)) #3 線を 生成する
    bars.append(bar) #4 リストbarsに 追加する
Python
def draw():
    screen.blit(bg_img, (0, 0))
    for bar in bars: #5 リストbarsから barを取り出す
        bar.draw() #6 barを表示する
    boon.draw()
pythonしよう!簡単なゲーム21:あみだくじを作る①の解説
Q
range関数とは?
pythonしよう!簡単なゲーム21:range()関数の解説
Q
append( )メソッドとは?
pythonしよう!簡単なゲーム21:append()メソッドの解説
スック
スック

barバーのy座標を 50pxずつ ずらしたんだね

ラッチ先生
ラッチ先生

そうです!
同じように 右側の横棒も全部表示しましょう

Python
for i in range(9): 
    bar = Actor("bar", (275, 100 + 50 * i)) 
    bars.append(bar)

for i in range(8): #1 8回繰り返す
    bar = Actor("bar", (525, 125 + 50 * i)) #2 線を 生成する
    bars.append(bar) #2  リストbarsに 線を追加する

def update():
pythonしよう!簡単なゲーム21:あみだくじを作る②の解説
スック
スック

左側のbarバー のy座標から 25pxずれてるね

ラッチ先生
ラッチ先生

randomランダム( )メソッドを使って
横棒の出る確率を80%にします。

そうすると、毎回違うあみだくじができます

pythonしよう!簡単なゲーム21:random関数の解説
Python
for i in range(9):
    if random.random() < 0.8: #1 もし 0.8未満なら
        bar = Actor("bar", (275, 100 + 50 * i)) 
        bars.append(bar)

for i in range(8):
    if random.random() < 0.8: #2 もし 0.8未満なら
        bar = Actor("bar", (525, 125 + 50 * i)) 
        bars.append(bar) 
スック
スック

おおっ!いいねぇ




ラッチ先生
ラッチ先生

まず、スタート地点に、
ボタンとして3つのboonボーンを 表示しよう。

Python
buttons = [] #1 空リストbuttonsを 作成する

for i in range(3): #2 3回繰り返す
    button = Actor("boon", (150 + 250 * i, 50)) #3 ボタンを生成する
    buttons.append(button) #4 リストbuttonに ボタンを追加する
    
def update():
    pass

def draw():
    screen.blit(bg_img, (0, 0))
    for bar in bars: 
        bar.draw()
    boon.draw()
    for button in buttons: #5 リストbuttonsから ボタンを取り出す
        button.draw() #6 ボタンを 表示する
pythonしよう!簡単なゲーム21:3つのボタンを作る①の解説
ラッチ先生
ラッチ先生

変数gameゲーム を 作成して、
あみだくじの ゲームを 3つに 構成します。

pythonしよう!簡単なゲーム21:変数gameの解説
Python
bg_img = "bg"
game = "ready" #1 変数gameを 宣言する 初期値:ready
スック
スック

変数gameゲーム で、ゲームの流れがわかるんだね

ラッチ先生
ラッチ先生

onオン_mouseマウス_downダウン関数で
ボタンをクリックしたら boonボーン を表示させるよ

pythonしよう!簡単なゲーム21:on_moue_down関数の解説
Python
def on_mouse_down(pos): #2 クリックした関数を 定義する
    global game #3 グローバル変数 game

    for button in buttons: #4 リストbuttonsから ボタンを取り出す
        if button.collidepoint_pixel(pos): #5 もし ボタンをクリックしたら
            sounds.決定ボタンを押す3.play() #6 効果音を 鳴らす
            game = "play" #7 変数gameを playに設定する
            boon.x = button.x #8 boonのx座標に ボタンのx座標を設定する
            buttons.clear() #9 リストbuttonsを 空にする
            break #10 ループが 終わる
    
def update():

効果音提供:効果音ラボ
https://soundeffect-lab.info/
・ 「決定ボタンを押す3」: ボタン・システム音

Q
collidepoint_pixel( )メソッドとは?
pythonしよう!簡単なゲーム21:range()関数の解説
Q
効果音に ついて?
pythonしよう!簡単なゲーム21:soundsモジュールの解説
Q
clear( )メソッドとは?
pythonしよう!簡単なゲーム21:clear( )メソッドの解説
スック
スック

おおっ!クリックした所に boonボーンが登場したね




ラッチ先生
ラッチ先生

それでは、boonボーン を動かすプログラムを作ろう

boonボーン_moveムーヴ関数では、
プロパティ:dirディル を使って
・ ”downダウン“: moveムーヴ_downダウン関数(下へ動く関数)
・ “sideサイド” :moveムーヴ_sideサイド関数(横へ動く関数)
それぞれの関数を 実行させるプログラムを作ります

pythonしよう!簡単なゲーム21:ポイント:あみだでのboonの動きの解説
スック
スック

boonボーン の動く速さを 定数SPEEDスピードに 「5」と設定します。

Python
SPEED = 5 #1 定数SPEED 5 と設定する

boon = Actor("boon", (150, 50))
boon.dir = "down" #2 プロパティ:dir "down"と設定する

bg_img = "bg"
Python
def boon_move(): #3 boon_move関数を 定義する
    if game != "play": #4 もし 変数gameが playでなければ
        return #5 返す

    if boon.dir == "down": #6 もし プロパティdirが downなら
        move_down() #7 move_down関数を 実行する

def move_down(): #8 move_down関数を 定義する
    if boon.y < 550: #9 もし y座標が 550未満なら
        boon.y += SPEED #10 y座標は 定数SPEEDずつ増やす
    
def update():
    boon_move() #11 boon_move関数を 実行する

def draw():
スック
スック

y:550で 止まるね

ラッチ先生
ラッチ先生

次に、boonボーン が 横棒の左右どちらに動くか判断する
checkチェック_barバー関数を 作ります。

基本は以下の3点です。

pythonしよう!簡単なゲーム21:check_bar関数の解説
Python
boon = Actor("boon", (150, 50))
boon.dir = "down"
boon.target_x = 0 #1 プロパティtarget_xに 0を設定する
スック
スック

追加プロパティ:targetターゲット_x には、
横棒で進むときの 目的地のx座標が 入ります。

最初は、「0」に 設定しておくよ

Python
def move_down(): 
    if boon.y < 550: 
        boon.y += SPEED
        check_bar() #2 check_bar関数を 実行する

def check_bar(): #3 check_bar関数を 定義する
    for bar in bars: #4 リストbarsから バーを取り出す
        left_x = bar.x - 125 #5 変数left_xに バーのx座標-125を設定する
        right_x = bar.x + 125 #6 変数right_xに バーのx座標+125を設定する

        if boon.y == bar.y: #7 もし boonのy座標が barのy座標と同じなら
            if boon.x == left_x: #8 もし boonのx座標が 変数left_xと同じなら
                boon.dir = "side" #9 プロパティdirに sideを設定する
                boon.target_x = right_x #10 プロパティtarget_xに 変数right_xを設定する

            elif boon.x == right_x: #11 もし boonのx座標が 変数right_xと同じなら
                boon.dir = "side" #12 プロパティdirに sideを設定する
                boon.target_x = left_x #13 プロパティtarget_xに 変数left_xを設定する
    
def update():
スック
スック

「ステップごと」「自動」をクリックしてみよう

checkチェック_barバー関数のプログラムの動きが わかるよ!

ラッチ先生
ラッチ先生

プロパティdirディレ が、sideサイド になった時の
boonボーン が横に動く moveムーヴ_sideサイド関数を 定義しましょう

Python
def boon_move(): 
    if game != "play": 
        return 

    if boon.dir == "down": 
        move_down()

    elif boon.dir == "side": #1 もし プロパティdirが sideなら
        move_side() #2 move_side関数を 実行する

def move_down(): 
Python
def move_side(): #3 move_side関数を 定義する
    if boon.x < boon.target_x: #4 もし x座標が プロパティtarget_xより 小さかったら
        boon.flip_x = False #5 プロパティflip_xを Falseに 設定する
        boon.x += SPEED #8-6 x座標を SPEEDごと増やす
    else: #7 その他
        boon.flip_x = True #8 プロパティflip_xを Trueに 設定する
        boon.x -= SPEED #9 x座標を SPEEDごと 減らす

    if boon.x == boon.target_x: #10 もし x座標が プロパティtarget_xを同じになったら
        boon.dir = "down" #11 プロパティdirに downを設定する
    
def update():
スック
スック

これで、boonボーンの動きは OK!

ラッチ先生
ラッチ先生

boonボーンが y座標:400になるまで、カバーをかけて
おもしろくするよ

Python
def draw():
    screen.blit(bg_img, (0, 0))
    for bar in bars: 
        bar.draw()
    boon.draw()
    for button in buttons: 
        button.draw()
    if boon.y < 400: #1 もし boonのy座標が400以下なら
        screen.blit("cover", (0, 400)) #2 カバーを (0, 400)に表示する 
    
スック
スック

おおっ、いいねえ!




pythonしよう!簡単なゲーム21:boonあみだくじ!結果発表の解説
ラッチ先生
ラッチ先生

最初に、
ゴールの位置をrandintランドイント()関数を使って 決めます

Python
boon.target_x = 0

goal = Actor("goal",
             (150 + 250 * random.randint(0, 2), 550)) #1 ゴールの 生成する

bg_img = "bg"
Python
def draw():
    screen.blit(bg_img, (0, 0))
    for bar in bars: 
        bar.draw()
    goal.draw() #2 ゴールを 表示する
    boon.draw()
    for button in buttons: 
        button.draw()
    if boon.y < 400: 
        screen.blit("cover", (0, 400))
        
Q
randint関数とは?
pythonしよう!簡単なゲーム21:randint関数の解説
スック
スック

これで、ゴールがランダムに 表示されるね

ラッチ先生
ラッチ先生

setセット_resultリザルト関数で
結果発表のプログラムを定義しましょう

pythonしよう!簡単なゲーム21:ポイント共通処理を引数付き関数にまとめるの解説
Python
bg_img = "bg"
game = "ready"
result_txt = None #1 変数result_txtを宣言する 初期値:None(無し)
Python
def set_result(bg,
               costume,
               sound,
               text): #3 set_result()関数を 定義する
    global game, bg_img, result_txt #4 グローバル変数 game, bg_img, result_txt

    game = "result" #5 変数gameを resultに設定する
    music.stop() #6 BGMを 止める
    bg_img = bg #7 変数bg_imgに 引数bgを設定する
    boon.image = costume #8 プロパティimageに 引数costumeを設定する
    sound.play() #9 引数soundを 鳴らす
    result_txt = text #10 変数result_txtに 引数textを設定する
    
def update():
Python
music.play("晴色カレイドスコープ")  #2 BGMを 流す 
    
pgzrun.go()
Q
musicモジュールとは?
pythonしよう!簡単なゲーム21:musicモジュールの解説
スック
スック

このsetセット_resultリザルト関数で、
クリアやゲームオーバーのプログラムを作るよ

ラッチ先生
ラッチ先生

moveムーヴ_downダウン()関数で
boonボーンのy座標が 550になった地点で 結果発表に なります

Python
def move_down(): 
    if boon.y < 550: 
        boon.y += SPEED
        check_bar()

    else: #1 その他(boonのy座標が 550以上なら)
        if boon.x == goal.x: #2 もし x座標が ゴールのx座標と同じなら
            set_result("bg_clear",
                       "boon_clear",
                       sounds.成功音,
                       "txt_clear") #3 set_result関数を 実行する
        else: #4 その他(ゴールのx座標でないなら)
            set_result("bg_over",
                       "boon_over",
                       sounds.間抜け4,
                       "txt_over") #4 set_result関数を 実行する
Python
def draw():
    screen.blit(bg_img, (0, 0))
    for bar in bars: 
        bar.draw()
    goal.draw()
    boon.draw()
    for button in buttons: 
        button.draw()
    if boon.y < 400: 
        screen.blit("cover", (0, 400)) 
    if result_txt: #5 もし 変数result_txtに データが入ったら
        screen.blit(result_txt, (200, 150)) #6 テキストを 表示する

BGM提供: DOVA-SYNDROME
https://dova-s.jp/
・ 「晴色カレイドスコープ」 written by まんぼう二等兵

効果音提供:効果音ラボ
https://soundeffect-lab.info/
・ 「間抜け4」: アニメ
・ 「決定ボタンを押す3」: ボタン・システム音
・ 「成功音」: ボタン・システム音

スック
スック

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




ラッチ先生
ラッチ先生

今回は、
あみだくじ ゲームを作りました。

boon あみだくじ!
Python
import pgzrun
import random
from pgzhelper import *

WIDTH = 800
HEIGHT = 600

SPEED = 5 

boon = Actor("boon", (150, 50))
boon.dir = "down"
boon.target_x = 0 

goal = Actor("goal",
             (150+250*random.randint(0, 2), 550)) 

bg_img = "bg"
game = "ready" 
result_txt = None 

bars = [] 

for i in range(9): 
    if random.random() < 0.8: 
        bar = Actor("bar", (275, 100 + 50 * i)) 
        bars.append(bar) 

for i in range(8): 
    if random.random() < 0.8: 
        bar = Actor("bar", (525, 125 + 50 * i)) 
        bars.append(bar) 

buttons = [] 

for i in range(3): 
    button = Actor("boon", (150 + 250 * i, 50)) 
    buttons.append(button) 

def on_mouse_down(pos): 
    global game 

    for button in buttons: 
        if button.collidepoint_pixel(pos): 
            sounds.決定ボタンを押す3.play() 
            game = "play" 
            boon.x = button.x 
            buttons.clear() 
            break 

def boon_move(): 
    if game != "play": 
        return 

    if boon.dir == "down": 
        move_down() 

    elif boon.dir == "side": 
        move_side() 

def move_down(): 
    if boon.y < 550: 
        boon.y += SPEED 
        check_bar() 
    else: 
        if boon.x == goal.x: 
            set_result("bg_clear",
                       "boon_clear",
                       sounds.成功音,
                       "txt_clear") 
        else: 
            set_result("bg_over",
                       "boon_over",
                       sounds.間抜け4,
                       "txt_over")                  

def check_bar(): 
    for bar in bars: 
        left_x = bar.x - 125 
        right_x = bar.x + 125 

        if boon.y == bar.y: 
            if boon.x == left_x: 
                boon.dir = "side" 
                boon.target_x = right_x 

            elif boon.x == right_x: 
                boon.dir = "side" 
                boon.target_x = left_x 
                
def move_side(): 
    if boon.x < boon.target_x:
        boon.flip_x = False
        boon.x += SPEED 
    else:
        boon.flip_x = True
        boon.x -= SPEED 

    if boon.x == boon.target_x: 
        boon.dir = "down" 


def set_result(bg,
               costume,
               sound,
               text): 
    global game, bg_img, result_txt 

    game = "result" 
    music.stop() 
    bg_img = bg 
    boon.image = costume 
    sound.play() 
    result_txt = text 
    
def update():
    boon_move() 

def draw():
    screen.blit(bg_img, (0, 0))
    for bar in bars: 
        bar.draw() 
    for button in buttons: 
        button.draw() 
    if boon.y < 400: 
        screen.blit("cover", (0, 400)) 
    goal.draw() 
    if result_txt: 
        screen.blit(result_txt, (200, 150)) 
    boon.draw()
    
music.play("晴色カレイドスコープ")  
        
pgzrun.go()
ラッチ先生
ラッチ先生

checkチェック_barバー()関数で
boonボーンが あみだくじ上を動いています。

pythonしよう!簡単なゲーム21:check_bar関数の解説
スック
スック

みなさんも、 あみだくじを作ってみよう!

それじゃあ、またね!

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

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

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