ブロック崩しゲーム
今回はポンコツ2人組がPythonでブロック崩しゲームのプログラムに挑戦してみました! Pythonのpygameライブラリを使用していますので、事前にインストールする必要があります。
ブロック崩し
スペースキーを押すとゲームが開始されます。ボールを落としてしまった場合のリトライは
何回でも可能で、全てのブロックを崩すとアプリケーションが終了します。
以下のコマンドでpygameライブラリをインストールします。
pip install 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()
処理結果は次の通りです。
ライブラリを利用すると100行程度で簡単にブロック崩しゲームができてしまいました。 ポンコツ2人組はプログラムを理解できなかったようですが、ゲームには興味津々のご様子です・・・
プログラム作成は結構ストレスが溜まりますので、たまにはゲームで息抜きするのも良いかも知れませんね。 遊ぶときはしっかり遊んでメリハリのある時間を過ごすのが吉ですよ!