ブロック崩しゲーム

今回はポンコツ2人組がPythonでブロック崩しゲームのプログラムに挑戦してみました! Pythonのpygameライブラリを使用していますので、事前にインストールする必要があります。

※この記事は2023/11/22時点の情報です。

ブロック崩し
スペースキーを押すとゲームが開始されます。ボールを落としてしまった場合のリトライは 何回でも可能で、全てのブロックを崩すとアプリケーションが終了します。

以下のコマンドでpygameライブラリをインストールします。
pip install pygame

pygameライブラリをインストール

下記のコードをテキストエディタにコピー&ペーストして「sample_game.py」という名前で保存します。 その後、コマンドプロンプトで保存した場所に移動し、下記コマンドで実行します。今回はF:¥pythonに保存しました。
python sample_game.py

import pygame
import sys

# ゲーム画面の幅と高さ
WIDTH, HEIGHT = 640, 480

# 色
WHITE = (255, 255, 255)
BLUE = (0, 0, 255)
RED = (255, 0, 0)

# パドルの情報
PADDLE_WIDTH, PADDLE_HEIGHT = 100, 10
PADDLE_SPEED = 7

# ボールの情報
BALL_RADIUS = 10
BALL_SPEED_X = 3  # X方向の速度
BALL_SPEED_Y = 3  # Y方向の速度

# ブロックの情報
BLOCK_WIDTH, BLOCK_HEIGHT = 60, 20
BLOCK_ROWS = 5
BLOCK_COLS = 8
BLOCK_PADDING = 5
BLOCK_OFFSET_TOP = 50

# 初期化
pygame.init()
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("ブロック崩し")

clock = pygame.time.Clock()

# パドルの初期位置
paddle_x = (WIDTH - PADDLE_WIDTH) // 2
paddle_y = HEIGHT - PADDLE_HEIGHT - 10

# ボールの初期位置と速度
ball_x = WIDTH // 2
ball_y = HEIGHT // 2
ball_dx = 0
ball_dy = 0
ball_started = False

# ブロックの生成
blocks = []
for row in range(BLOCK_ROWS):
    for col in range(BLOCK_COLS):
        block_x = col * (BLOCK_WIDTH + BLOCK_PADDING) + BLOCK_PADDING
        block_y = row * (BLOCK_HEIGHT + BLOCK_PADDING) + BLOCK_OFFSET_TOP
        blocks.append(pygame.Rect(block_x, block_y, BLOCK_WIDTH, BLOCK_HEIGHT))

# パドルの描画
def draw_paddle():
    pygame.draw.rect(screen, RED, (paddle_x, paddle_y, PADDLE_WIDTH, PADDLE_HEIGHT))

# ボールの描画
def draw_ball():
    pygame.draw.circle(screen, BLUE, (ball_x, ball_y), BALL_RADIUS)

# ブロックの描画
def draw_blocks():
    for block in blocks:
        pygame.draw.rect(screen, WHITE, block)

# ゲームループ
running = True
while running:
    screen.fill((0, 0, 0))

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_SPACE and not ball_started:
                ball_dx = BALL_SPEED_X
                ball_dy = BALL_SPEED_Y
                ball_started = True

    keys = pygame.key.get_pressed()
    if keys[pygame.K_LEFT] and paddle_x > 0:
        paddle_x -= PADDLE_SPEED
    if keys[pygame.K_RIGHT] and paddle_x < WIDTH - PADDLE_WIDTH:
        paddle_x += PADDLE_SPEED

    ball_x += ball_dx
    ball_y += ball_dy

    # ボールと壁の衝突
    if ball_x <= BALL_RADIUS or ball_x >= WIDTH - BALL_RADIUS:
        ball_dx *= -1
    if ball_y <= BALL_RADIUS:
        ball_dy *= -1

    # ボールとパドルの衝突
    if ball_y >= paddle_y - BALL_RADIUS and paddle_x <= ball_x <= paddle_x + PADDLE_WIDTH:
        ball_dy *= -1

    # ボールとブロックの衝突
    for block in blocks[:]:
        if block.collidepoint(ball_x, ball_y):
            blocks.remove(block)
            ball_dy *= -1

    # ボールが画面下に落ちたらゲームオーバー
    if ball_y >= HEIGHT - BALL_RADIUS:
        ball_started = False
        ball_x = WIDTH // 2
        ball_y = HEIGHT // 2
        ball_dx = 0
        ball_dy = 0

    draw_blocks()
    draw_paddle()
    draw_ball()

    pygame.display.flip()

    if not blocks:
        running = False

    clock.tick(60)

pygame.quit()
sys.exit()

処理結果は次の通りです。

Pythonの対話型プログラムの実行結果

ライブラリを利用すると100行程度で簡単にブロック崩しゲームができてしまいました。 ポンコツ2人組はプログラムを理解できなかったようですが、ゲームには興味津々のご様子です・・・

ブロック崩しゲームは好きですか?

プログラム作成は結構ストレスが溜まりますので、たまにはゲームで息抜きするのも良いかも知れませんね。 遊ぶときはしっかり遊んでメリハリのある時間を過ごすのが吉ですよ!

管理人情報