Pythonでブロック崩しゲームを作る

投稿日: 2024年2月19日

ブロック崩しゲームは、画面上を反射しながら移動するボールを、画面下部に落ちないように、バーを左右に操作して打ち返し、煉瓦状に並べられたブロックを消していくものです。

ゲームを作成するにはPygameというライブラリを使用するのが一般的です。

Pygameは、ゲームの開発を簡単にするためのモジュールを多数提供しています。ここでは基本的なブロック崩しゲームのコード例を紹介します。

ステップ 1: ライブラリをインストール

pip install pygame

上記はターミナルのインストール方法ですがAnacondaでは「pygame」と検索してインストールしてください。

ステップ 2: Pygameの初期化

import pygame
import random

pygame.init()

import pygame はPygameライブラリをプログラムにインポートしています。これにより、Pygameの機能を使用できるようになります。
import random は乱数を生成するためのライブラリをインポートしています。このゲームでは、ボールの初期方向をランダムにするために使用します。
pygame.init() はPygameを使用する前に必要な初期化を行います。

ステップ 3: ウィンドウの設定

screen_width = 600
screen_height = 400
screen = pygame.display.set_mode((screen_width, screen_height))

ウィンドウ(ゲームを表示する画面)の幅(screen_width)と高さ(screen_height)を設定します。
pygame.display.set_mode() 関数は、指定された幅と高さのウィンドウを作成します。

ステップ 4: 色の設定

black = (0, 0, 0)
white = (255, 255, 255)
red = (255, 0, 0)

ここでは、RGB値を使用して色を定義しています。RGBは赤(Red)、緑(Green)、青(Blue)の三原色の強度を表し、0から255の範囲で指定します。

ステップ 5: パドルとボールの設定

paddle_width = 100
paddle_height = 10
paddle = pygame.Rect(screen_width // 2 - paddle_width // 2, screen_height - 20, paddle_width, paddle_height)

ball_diameter = 10
ball = pygame.Rect(screen_width // 2 - ball_diameter // 2, screen_height // 2 - ball_diameter // 2, ball_diameter, ball_diameter)
ball_speed_x = 3 * random.choice((1, -1))
ball_speed_y = 3 * random.choice((1, -1))

パドルとボールの大きさ、形、初期位置を設定します。パドルはpygame.Rectを使って長方形として、ボールは同じくpygame.Rectを使って円として(実際には小さい正方形として)描画します。
ボールの速度も設定しており、random.choice((1, -1))により初期の動きの方向がランダムに決まります。

ステップ 6: ブロックの設定

block_list = []
block_width = 60
block_height = 20
for i in range(6):
    for j in range(5):
        block_list.append(pygame.Rect(i * (block_width + 10) + 10, j * (block_height + 10) + 10, block_width, block_height))

画面上部に配置するブロックを生成しています。block_listには、それぞれのブロックの位置とサイズが格納されます。

ステップ 7: ゲームのループ

# ゲームのループ
running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    # パドルの操作
    keys = pygame.key.get_pressed()
    if keys[pygame.K_LEFT] and paddle.left > 0:
        paddle.move_ip(-5, 0)
    if keys[pygame.K_RIGHT] and paddle.right < screen_width:
        paddle.move_ip(5, 0)

    # ボールの動き
    ball.move_ip(ball_speed_x, ball_speed_y)

    # ボールが画面の端に当たったら反射
    if ball.left <= 0 or ball.right >= screen_width:
        ball_speed_x *= -1
    if ball.top <= 0:
        ball_speed_y *= -1

    # ボールがパドルに当たったら反射
    if ball.colliderect(paddle):
        ball_speed_y *= -1

    # ボールがブロックに当たったらブロックを消去して反射
    for block in block_list[:]:
        if ball.colliderect(block):
            block_list.remove(block)
            ball_speed_y *= -1
            break

    # ボールが画面下に行ったらリセット
    if ball.bottom >= screen_height:
        ball = pygame.Rect(screen_width // 2 - ball_diameter // 2, screen_height // 2 - ball_diameter // 2, ball_diameter, ball_diameter)
        ball_speed_x = 3 * random.choice((1, -1))
        ball_speed_y = 3 * random.choice((1, -1))

    # 画面の描画
    screen.fill(black)
    pygame.draw.rect(screen, white, paddle)
    pygame.draw.ellipse(screen, red, ball)
    for block in block_list:
        pygame.draw.rect(screen, white, block)

    pygame.display.flip()
    pygame.time.Clock().tick(60)

pygame.quit()

「while」で無限ループをしています。この無限ループはゲームが実行されている間ずっと続きます。
ゲームの終了条件(この例ではウィンドウを閉じる操作)が満たされると、ループから抜け出してゲームが終了します。


イベント処理とオブジェクトの動き
keys = pygame.key.get_pressed()で
ユーザーの入力(キーボード操作)に応じてパドルを動かしたり、ボールの位置を更新したりします。

ボールがウィンドウの端、パドル、またはブロックに当たった際の処理もここで行います。

screen.fill(black)
画面を一旦黒で塗りつぶし、その上にパドル、ボール、ブロックを描画します。
pygame.display.flip() は画面を更新して、描画したオブジェクトを表示します。
pygame.time.Clock().tick(60) は、ゲームのフレームレートを60に設定しています。これは、1秒間に60回画面が更新されることを意味します。

実行するとこのようになります。めちゃくちゃ地味ですが基本的なゲームになります。ここでパラメータなどを触ったりして動きがどうなるか確認してください。

🔳.全体のコード

全体のコードは以下のようになります

import pygame
import random

# Pygameを初期化
pygame.init()

# ウィンドウの設定
screen_width = 600
screen_height = 400
screen = pygame.display.set_mode((screen_width, screen_height))

# 色の設定
black = (0, 0, 0)
white = (255, 255, 255)
red = (255, 0, 0)

# パドルの設定
paddle_width = 100
paddle_height = 10
paddle = pygame.Rect(screen_width // 2 - paddle_width // 2, screen_height - 20, paddle_width, paddle_height)

# ボールの設定
ball_diameter = 10
ball = pygame.Rect(screen_width // 2 - ball_diameter // 2, screen_height // 2 - ball_diameter // 2, ball_diameter, ball_diameter)
ball_speed_x = 3 * random.choice((1, -1))
ball_speed_y = 3 * random.choice((1, -1))

# ブロックの設定
block_list = []
block_width = 60
block_height = 20
for i in range(6):
    for j in range(5):
        block_list.append(pygame.Rect(i * (block_width + 10) + 10, j * (block_height + 10) + 10, block_width, block_height))

# ゲームのループ
running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    # パドルの操作
    keys = pygame.key.get_pressed()
    if keys[pygame.K_LEFT] and paddle.left > 0:
        paddle.move_ip(-5, 0)
    if keys[pygame.K_RIGHT] and paddle.right < screen_width:
        paddle.move_ip(5, 0)

    # ボールの動き
    ball.move_ip(ball_speed_x, ball_speed_y)

    # ボールが画面の端に当たったら反射
    if ball.left <= 0 or ball.right >= screen_width:
        ball_speed_x *= -1
    if ball.top <= 0:
        ball_speed_y *= -1

    # ボールがパドルに当たったら反射
    if ball.colliderect(paddle):
        ball_speed_y *= -1

    # ボールがブロックに当たったらブロックを消去して反射
    for block in block_list[:]:
        if ball.colliderect(block):
            block_list.remove(block)
            ball_speed_y *= -1
            break

    # ボールが画面下に行ったらリセット
    if ball.bottom >= screen_height:
        ball = pygame.Rect(screen_width // 2 - ball_diameter // 2, screen_height // 2 - ball_diameter // 2, ball_diameter, ball_diameter)
        ball_speed_x = 3 * random.choice((1, -1))
        ball_speed_y = 3 * random.choice((1, -1))

    # 画面の描画
    screen.fill(black)
    pygame.draw.rect(screen, white, paddle)
    pygame.draw.ellipse(screen, red, ball)
    for block in block_list:
        pygame.draw.rect(screen, white, block)

    pygame.display.flip()
    pygame.time.Clock().tick(60)

pygame.quit()

このコードは非常に基本的なブロック崩しゲームの例です。
各セクションのパラメーター(例えば、パドルの大きさやボールの速度)を変更することで、ゲームの難易度やプレイ感を調整することができます。

記事