import pygame
import random
pygame.init()
# 画面サイズの設定
SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
pygame.display.set_caption("ブロック崩し")
# 色の定義 (RGB)
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
BLUE = (0, 0, 255)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
# パドルの設定
PADDLE_WIDTH = 100
PADDLE_HEIGHT = 20
PADDLE_X = (SCREEN_WIDTH - PADDLE_WIDTH) // 2
PADDLE_Y = SCREEN_HEIGHT - PADDLE_HEIGHT - 10
PADDLE_SPEED = 7
paddle = pygame.Rect(PADDLE_X, PADDLE_Y, PADDLE_WIDTH, PADDLE_HEIGHT)
# ボールの設定
BALL_RADIUS = 10
BALL_X = SCREEN_WIDTH // 2
BALL_Y = SCREEN_HEIGHT // 2
BALL_SPEED_X = 3 # ★速度を遅くした
BALL_SPEED_Y = -3 # ★速度を遅くした
ball = pygame.Rect(BALL_X - BALL_RADIUS, BALL_Y - BALL_RADIUS, BALL_RADIUS * 2, BALL_RADIUS * 2)
# ブロックの設定
BLOCK_WIDTH = 70
BLOCK_HEIGHT = 20
BLOCK_ROWS = 5
BLOCK_COLS = 10
BLOCK_GAP = 5
BLOCK_TOP_MARGIN = 50
blocks = []
for row in range(BLOCK_ROWS):
for col in range(BLOCK_COLS):
block_x = col * (BLOCK_WIDTH + BLOCK_GAP) + (SCREEN_WIDTH - (BLOCK_COLS * (BLOCK_WIDTH + BLOCK_GAP) - BLOCK_GAP)) // 2
block_y = row * (BLOCK_HEIGHT + BLOCK_GAP) + BLOCK_TOP_MARGIN
block_rect = pygame.Rect(block_x, block_y, BLOCK_WIDTH, BLOCK_HEIGHT)
blocks.append(block_rect)
# フレームレートの制御 (追加)
clock = pygame.time.Clock()
FPS = 60 # 1秒あたりのフレーム数
# ゲームループの準備
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]: # 左矢印キーが押されていれば
paddle.x -= PADDLE_SPEED
if keys[pygame.K_RIGHT]: # 右矢印キーが押されていれば
paddle.x += PADDLE_SPEED
# パドルの画面外制限
if paddle.left < 0:
paddle.left = 0
if paddle.right > SCREEN_WIDTH:
paddle.right = SCREEN_WIDTH
# ボールの移動
ball.x += BALL_SPEED_X
ball.y += 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.bottom > SCREEN_HEIGHT:
running = False # ゲームオーバー
# ボールとパドルの衝突判定と跳ね返り
if ball.colliderect(paddle):
if BALL_SPEED_Y > 0:
ball.bottom = paddle.top
BALL_SPEED_Y *= -1
# ボールとブロックの衝突判定と処理
for block in blocks[:]:
if ball.colliderect(block):
blocks.remove(block)
BALL_SPEED_Y *= -1
break
# 画面の描画
screen.fill(BLACK)
pygame.draw.rect(screen, BLUE, paddle)
pygame.draw.circle(screen, RED, (ball.centerx, ball.centery), BALL_RADIUS)
# ブロックの描画
for block in blocks:
color = (random.randint(50, 255), random.randint(50, 255), random.randint(50, 255))
pygame.draw.rect(screen, color, block)
# 画面の更新
pygame.display.flip()
# ★フレームレートの制御
clock.tick(FPS) # 1秒間にFPS回このループが実行されるように待機
pygame.quit()