コンテンツにスキップ

バードゲーム

背景

画像

ウィンドウを表示すると同時に、draw関数内でscreen.blitで画像を描画します。

import pgzrun
import random

WIDTH = 400
HEIGHT = 708

def draw():
    screen.blit('background', (0, 0))

pgzrun.go()

鳥の描画

鳥の画像を表示します。

bird = Actor('bird1', (75, 200))

def draw():
    screen.blit('background', (0, 0))
    bird.draw()

取りの表示を更新するupdate_bird関数を作り、update関数から呼び出します。 鳥が自動的に落下するようにy座標を増やしていきます。

def update_bird():
    bird.y += 3

def update():
    update_bird()

取りの落下速度を3固定では無く、変数にします。 birdの属性 vy に設定します。

bird.vy = 3

def update_bird():
    bird.y += bird.vy

上下キーで鳥を上下に移動できるようにします。 上下キーを押したら、vyを変化させます。

def on_key_down(key):
    if key == keys.UP:
        bird.vy = -3
    elif key == keys.DOWN:
        bird.vy = 3

上昇時、下降時で画像を変えるようにします。

def update_bird():
    bird.y += bird.vy

    if bird.vy < 0:
        bird.image = 'bird2'
    else:
        bird.image = 'bird1'

パイプの描画

まず、パイプのActorを作ります。

pipe_top = Actor('top', anchor=('left', 'bottom'), pos=(300, 380))
pipe_bottom = Actor('bottom', anchor=('left', 'top'), pos=(300, 450))

anchorは基準点を表します。pipe_topは左下、pipe_bottmは左上をposで指します。 drawでパイプを表示するようにします。

def draw():
    screen.blit('background', (0, 0))
    bird.draw()
    pipe_top.draw()
    pipe_bottom.draw()

パイプを左にスクロールしてくるようにします。この処理を行うupdate_pipesを作り、updateから呼び出すようにします。

def update_pipes():
    pipe_top.left -= 3
    pipe_bottom.left -= 3
def update():
    update_bird()
    update_pipes()

パイプが左端にスクロールし消えたらまた右端から出てくるようにします。この処理はreset_pipes関数にまとめて記述し、update_pipesから呼び出すようにします。

def update_pipes():
    pipe_top.left -= 3
    pipe_bottom.left -= 3
    if pipe_top.right < 0:
        reset_pipes()
def reset_pipes():
    pipe_top.pos = (400, 380)
    pipe_bottom.pos = (400, 450)

上のコードではパイプの隙間の場所は常に固定です。これをランダムに決めるようにします。

def reset_pipes():
    gap = random.randint(200,500)
    pipe_top.pos = (400, gap)
    pipe_bottom.pos = (400, gap+100)

衝突判定

update_bird関数で鳥とパイプが衝突したかどうかを判定します。 衝突していたら画像を変更し、下に落ちるようにします。

if bird.colliderect(pipe_top) or bird.colliderect(pipe_bottom):
    bird.image = 'birddead'
    bird.vy = 5

鳥が死んだかどうかの属性deadをbirdに設定し、初期値をFalseにします。

bird = Actor('bird1', (75, 200))
bird.vy = 3
bird.dead = False

衝突していたときにはdeadをTrueにし、画像を変更できないようにします。

def update_bird():
    bird.y += bird.vy

    if bird.vy < 0:
        bird.image = 'bird2'
    else:
        bird.image = 'bird1'

    if bird.colliderect(pipe_top) or bird.colliderect(pipe_bottom):
        bird.image = 'birddead'
        bird.vy = 5
        bird.dead = True

死んだ場合には画像を変更しないようにします。

if not bird.dead:
    if bird.vy < 0:
        bird.image = 'bird2'
    else:
        bird.image = 'bird1'

死んだ場合には操作できないようにします。

def on_key_down(key):
    if bird.dead:
        return
    if key == keys.UP:
        bird.vy = -3
    elif key == keys.DOWN:
        bird.vy = 3

リセットと得点

画面外に出た場合、再スタートするようにします。

※updateの一番下に書く。

if not 0 < bird.y < 720:
    bird.y = 200
    bird.dead = False
    bird.vy = 0
    reset_pipes()

何回パイプを通過したかを記録します。birdにscore属性を追加します。

bird = Actor('bird1', (75, 200))
bird.dead = False
bird.vy = 3
bird.score = 0

パイプリセット時に得点を増やします。

def update_pipes():
    pipe_top.left -= 3
    pipe_bottom.left -= 3
    if pipe_top.right < 0:
        reset_pipes()
        bird.score += 1

drawで画面に表示します。

screen.draw.text( str(bird.score), color='white', midtop=(200, 10), fontsize=70,  shadow=(1, 1) )