Python Block Breaker

import pygame # Define some colors BLACK = (0, 0, 0) WHITE = (255, 255, 255) # Set up the game window WINDOW_WIDTH = 640 WINDOW_HEIGHT = 480 pygame.init() screen = pygame.display.set_mode((WINDOW_WIDTH, WINDOW_HEIGHT)) pygame.display.set_caption(“Arkanoid Clone”) # Set up the clock to control the frame rate clock = pygame.time.Clock() # Main game loop running = True while running: # Handle events for event in pygame.event.get(): if event.type == pygame.QUIT: running = False # Clear the screen screen.fill(BLACK) # Update the display pygame.display.flip() # Control the frame rate clock.tick(60) # Quit Pygame and exit the program pygame.quit() # Set up the paddle PADDLE_WIDTH = 80 PADDLE_HEIGHT = 20 paddle_x = WINDOW_WIDTH / 2 – PADDLE_WIDTH / 2 paddle_y = WINDOW_HEIGHT – PADDLE_HEIGHT – 10 paddle_speed = 5 paddle_rect = pygame.Rect(paddle_x, paddle_y, PADDLE_WIDTH, PADDLE_HEIGHT) # Handle paddle movement keys = pygame.key.get_pressed() if keys[pygame.K_LEFT] and paddle_rect.left > 0: paddle_rect.move_ip(-paddle_speed, 0) if keys[pygame.K_RIGHT] and paddle_rect.right < WINDOW_WIDTH: paddle_rect.move_ip(paddle_speed, 0) # Draw the paddle pygame.draw.rect(screen, WHITE, paddle_rect) # Set up the ball BALL_RADIUS = 10 ball_x = WINDOW_WIDTH / 2 ball_y = WINDOW_HEIGHT / 2 ball_speed_x = 5 ball_speed_y = -5 ball_rect = pygame.draw.circle(screen, WHITE, (ball_x, ball_y), BALL_RADIUS) # Handle ball movement and collisions ball_rect.move_ip(ball_speed_x, ball_speed_y) if ball_rect.left < 0 or ball_rect.right > WINDOW_WIDTH: ball_speed_x = -ball_speed_x if ball_rect.top < 0: ball_speed_y = -ball_speed_y if ball_rect.colliderect(paddle_rect): ball_speed_y = -ball_speed_y ball_rect.top = paddle_rect.bottom # Draw the ball pygame.draw.circle(screen, WHITE, (ball_rect.centerx, ball_rect.centery), BALL_RADIUS) # Set up the bricks BRICK_WIDTH = 60 BRICK_HEIGHT = 20 BRICK_GAP = 10 NUM_ROWS = 5 NUM_COLS = 8 bricks = [] for row in range(NUM_ROWS): brick_row = [] for col in range(NUM_COLS): brick_x = col * (BRICK_WIDTH + BRICK_GAP) + BRICK_GAP brick_y = row * (BRICK_HEIGHT + BRICK_GAP) + BRICK_GAP + 50 brick_rect = pygame.Rect(brick_x, brick_y, BRICK_WIDTH, BRICK_HEIGHT) if row == 0: brick_color = (255, 0, 0) # red elif row == 1: brick_color = (255, 165, 0) # orange elif row == 2: brick_color = (255, 255, 0) # yellow elif row == 3: brick_color = (0, 128, 0) # green else: brick_color = (0, 0, 255) # blue brick_row.append((brick_rect, brick_color)) bricks.append(brick_row) # Handle ball collision with bricks for row in bricks: for brick in row: if ball_rect.colliderect(brick[0]): ball_speed_y = -ball_speed_y row.remove(brick) # TODO: update player score and check if level is complete # Draw the bricks for row in bricks: for brick in row: pygame.draw.rect(screen, brick[1], brick[0]) # Initialize game variables score = 0 lives = 3 level = 1 max_levels = 3 # Handle ball collision with the bottom of the screen if ball_rect.bottom > WINDOW_HEIGHT: lives -= 1 if lives <= 0: # TODO: show game over screen and reset game pass else: ball_x = WINDOW_WIDTH / 2 ball_y = WINDOW_HEIGHT / 2 ball_speed_x = 5 ball_speed_y = -5 ball_rect.center = (ball_x, ball_y) paddle_rect.centerx = ball_rect.centerx # Handle level completion if len(bricks) == 0: level += 1 if level > max_levels: # TODO: show victory screen and reset game pass else: # TODO: show level complete screen and prepare next level pass # Handle ball collision with bricks for row in bricks: for brick in row: if ball_rect.colliderect(brick[0]): ball_speed_y = -ball_speed_y score += 1 row.remove(brick) # Draw the score, lives, and level font = pygame.font.SysFont(None, 30) score_text = font.render(f”Score: {score}”, True, WHITE) lives_text = font.render(f”Lives: {lives}”, True, WHITE) level_text = font.render(f”Level: {level}”, True, WHITE) screen.blit(score_text, (10, 10)) screen.blit(lives_text, (WINDOW_WIDTH – lives_text.get_width() – 10, 10)) screen.blit(level_text, (WINDOW_WIDTH // 2 – level_text.get_width() // 2, 10)) # Set up power-up items POWERUP_WIDTH = 20 POWERUP_HEIGHT = 20 powerup_speed = 3 powerup_types = [“expand_paddle”, “shrink_paddle”, “fast_ball”, “slow_ball”, “extra_life”, “lose_life”] powerups = [] powerup_timer = 0 powerup_duration = 5000 # Handle power-up item movement and collision if powerup_timer <= 0: powerup_type = random.choice(powerup_types) powerup_x = random.randint(0, WINDOW_WIDTH - POWERUP_WIDTH) powerup_y = 0 powerup_rect = pygame.Rect(powerup_x, powerup_y, POWERUP_WIDTH, POWERUP_HEIGHT) powerups.append((powerup_rect, powerup_type)) powerup_timer = random.randint(5000, 10000) else: powerup_timer -= 1 for powerup in powerups: powerup_rect = powerup[0] powerup_type = powerup[1] powerup_rect.move_ip(0, powerup_speed) if powerup_rect.colliderect(paddle_rect): powerups.remove(powerup) if powerup_type == "expand_paddle": paddle_rect.inflate_ip(20, 0) elif powerup_type == "shrink_paddle": paddle_rect.inflate_ip(-20, 0) elif powerup_type == "fast_ball": ball_speed_x *= 2 ball_speed_y *= 2 elif powerup_type == "slow_ball": ball_speed_x /= 2 ball_speed_y /= 2 elif powerup_type == "extra_life": lives += 1 elif powerup_type == "lose_life": lives -= 1 if lives <= 0: # TODO: show game over screen and reset game pass elif powerup_rect.bottom > WINDOW_HEIGHT: powerups.remove(powerup) # Draw the power-up items for powerup in powerups: powerup_rect = powerup[0] powerup_type = powerup[1] if powerup_type == “expand_paddle”: color = (255, 0, 0) # red elif powerup_type == “shrink_paddle”: color = (255, 165, 0) # orange elif powerup_type == “fast_ball”: color = (255, 255, 0) # yellow elif powerup_type == “slow_ball”: color = (0, 128, 0) # green elif powerup_type == “extra_life”: color = (0, 0, 255) # blue elif powerup_type == “lose_life”: color = (255, 0, 255) # purple pygame.draw.rect(screen, color, powerup_rect) # Load sounds and music bounce_sound = pygame.mixer.Sound(“bounce.wav”) brick_sound = pygame.mixer.Sound(“brick.wav”) powerup_sound = pygame.mixer.Sound(“powerup.wav”) gameover_sound = pygame.mixer.Sound(“gameover.wav”) victory_sound = pygame.mixer.Sound(“victory.wav”) pygame.mixer.music.load(“music.mp3”) # Play background music pygame.mixer.music.play(loops=-1) # Handle ball collision with the paddle and bricks if ball_rect.colliderect(paddle_rect): ball_speed_y = -ball_speed_y ball_rect.top = paddle_rect.bottom bounce_sound.play() elif ball_rect.top < 0: ball_speed_y = -ball_speed_y ball_rect.top = 0 bounce_sound.play() for row in bricks: for brick in row: if ball_rect.colliderect(brick[0]): ball_speed_y = -ball_speed_y score += 1 row.remove(brick) brick_sound.play() # TODO: add particle effect and screen shake # Handle power-up item collision and activation if powerup_rect.colliderect(paddle_rect): powerups.remove(powerup) if powerup_type == "expand_paddle": paddle_rect.inflate_ip(20, 0) elif powerup_type == "shrink_paddle": paddle_rect.inflate_ip(-20, 0) elif powerup_type == "fast_ball": ball_speed_x *= 2 ball_speed_y *= 2 elif powerup_type == "slow_ball": ball_speed_x /= 2 ball_speed_y /= 2 elif powerup_type == "extra_life": lives += 1 powerup_sound.play() elif powerup_type == "lose_life": lives -= 1 powerup_sound.play() if lives <= 0: # TODO: show game over screen and reset game gameover_sound.play() pass # Draw particle effect and screen shake # TODO: implement particle effect and screen shake # Set up particle effect particle_image = pygame.Surface((4, 4)) pygame.draw.circle(particle_image, WHITE, (2, 2), 2) particle_image.set_colorkey((0, 0, 0)) particles = [] # Handle ball collision with bricks for row in bricks: for brick in row: if ball_rect.colliderect(brick[0]): ball_speed_y = -ball_speed_y score += 1 row.remove(brick) brick_sound.play() # Add particle effect and screen shake for i in range(10): particle_rect = particle_image.get_rect() particle_rect.center = (brick[0].centerx + random.randint(-10, 10), brick[0].centery + random.randint(-10, 10)) particle_speed_x = random.randint(-5, 5) particle_speed_y = random.randint(-5, 5) particles.append((particle_rect, particle_speed_x, particle_speed_y)) # Add screen shake screen_shake = 20 # Handle power-up item collision and activation if powerup_rect.colliderect(paddle_rect): powerups.remove(powerup) if powerup_type == "expand_paddle": paddle_rect.inflate_ip(20, 0) elif powerup_type == "shrink_paddle": paddle_rect.inflate_ip(-20, 0) elif powerup_type == "fast_ball": ball_speed_x *= 2 ball_speed_y *= 2 elif powerup_type == "slow_ball": ball_speed_x /= 2 ball_speed_y /= 2 elif powerup_type == "extra_life": lives += 1 powerup_sound.play() # Add particle effect for i in range(10): particle_rect = particle_image.get_rect() particle_rect.center = (powerup_rect.centerx + random.randint(-10, 10), powerup_rect.centery + random.randint(-10, 10)) particle_speed_x = random.randint(-5, 5) particle_speed_y = random.randint(-5, 5) particles.append((particle_rect, particle_speed_x, particle_speed_y)) elif powerup_type == "lose_life": lives -= 1 powerup_sound.play() # Add particle effect for i in range(10): particle_rect = particle_image.get_rect() particle_rect.center = (powerup_rect.centerx + random.randint(-10, 10), powerup_rect.centery + random.randint(-10, 10)) particle_speed_x = random.randint(-5, 5) particle_speed_y = random.randint(-5, 5) particles.append((particle_rect, particle_speed_x, particle_speed_y)) if lives <= 0: # TODO: show game over screen and reset game gameover_sound.play() pass # Update particle effect and screen shake for particle in particles: particle_rect = particle[0] particle_speed_x = particle[1] particle_speed_y = particle[2] particle_rect.move_ip(particle_speed_x, particle_speed_y) pygame.draw.circle(screen, WHITE, particle_rect.center, 2) particle[0] = particle_rect if screen_shake > 0: screen_shake_x = random.randint(-screen_shake, screen_shake) screen_shake_y = random.randint(-screen_shake, screen_shake) screen_rect.move_ip(screen_shake_x, screen_shake_y) screen_shake -= 1 else: screen_rect.topleft = (0, 0) # Draw the particles and screen shake for particle in particles: particle_rect = particle[0] pygame.draw.circle(screen, WHITE, particle_rect.center, 2) # Draw the screen shake pygame.draw.rect(screen, BLACK, screen_rect) # Set up levels LEVELS = [ [ “1111111111”, “2222222222”, “3333333333”, “4444444444”, “5555555555”, ], [ “1111111111”, “1111111111”, “1111111111”, “1111111111”, “1111111111”, ], [ “1111111111”, “2222222222”, “3333333333”, “4444444444”, “5555555555”, “4444444444”, “3333333333”, “2222222222”, “1111111111”, ], ] # Set up current level current_level = 0 bricks = [] for row_index, row in enumerate(LEVELS[current_level]): bricks.append([]) for col_index, col in enumerate(row): brick_rect = pygame.Rect(col_index * BRICK_WIDTH, row_index * BRICK_HEIGHT + 50, BRICK_WIDTH, BRICK_HEIGHT) if col == “1”: bricks[row_index].append((brick_rect, 1)) elif col == “2”: bricks[row_index].append((brick_rect, 2)) elif col == “3”: bricks[row_index].append((brick_rect, 3)) elif col == “4”: bricks[row_index].append((brick_rect, 4)) elif col == “5”: bricks[row_index].append((brick_rect, 5)) # Set up font font = pygame.font.Font(None, 30) # Draw score text score_text = font.render(f”Score: {score}”, True, WHITE) screen.blit(score_text, (10, 10)) # Set up pause menu paused = False pause_text = font.render(“Paused”, True, WHITE) pause_rect = pause_text.get_rect(center=screen_rect.center) resume_text = font.render(“Press space to resume”, True, WHITE) resume_rect = resume_text.get_rect(center=(screen_rect.centerx, screen_rect.centery + 50)) # Handle pause and unpause if event.type == pygame.KEYDOWN: if event.key == pygame.K_SPACE: paused = not paused if paused: screen.blit(pause_text, pause_rect) screen.blit(resume_text, resume_rect) pygame.display.flip() continue # Set up game over screen game_over = False game_over_text = font.render(“Game Over”, True, WHITE) game_over_rect = game_over_text.get_rect(center=screen_rect.center) restart_text = font.render(“Press space to restart”, True, WHITE) restart_rect = restart_text.get_rect(center=(screen_rect.centerx, screen_rect.centery + 50)) # Handle game over and restart if lives <= 0: game_over = True if game_over: screen.blit(game_over_text, game_over_rect) screen.blit(restart_text, restart_rect) pygame.display.flip() if event.type == pygame.KEYDOWN: if event.key == pygame.K_SPACE: # Reset game lives = 3 score = 0 current_level = 0 bricks = [] for row_index, row in enumerate(LEVELS[current_level]): bricks.append([]) for col_index, col in enumerate(row): brick_rect = pygame.Rect(col_index * BRICK_WIDTH, row_index * BRICK_HEIGHT + 50, BRICK_WIDTH, BRICK_HEIGHT) if col == "1": bricks[row_index].append((brick_rect, 1)) elif col == "2": bricks[row_index].append((brick_rect, 2)) elif col == "3": bricks[row_index].append((brick_rect, 3)) elif col == "4": bricks[row_index].append((brick_rect, 4)) elif col == "5": bricks[row_index].append((brick_rect, 5)) # Reset ball and paddle positions ball_rect.center = (SCREEN_WIDTH // 2, SCREEN_HEIGHT // 2) ball_speed_x = BALL_SPEED ball_speed_y = -BALL_SPEED paddle_rect.centerx = SCREEN_WIDTH // 2 # Reset power-up item powerups = [] powerup = None powerup_type = None # Reset game state paused = False game_over = False # Play background music pygame.mixer.music.play(loops=-1)