import random
import pygame

WIDTH = 640
HEIGHT = 480


def new_game():
    return {
        'player': pygame.FRect(300, 420, 40, 30),
        'blocks': [],
        'spawn': 0.0,
        'score': 0,
        'over': False,
    }


def update(game, direction, dt):
    if game['over']:
        return
    player = game['player']
    player.x = max(0, min(WIDTH - player.width, player.x + direction * 360 * dt))
    game['spawn'] += dt
    if game['spawn'] >= 0.55:
        game['spawn'] = 0.0
        game['blocks'].append(pygame.FRect(random.randint(0, WIDTH - 40), -40, 40, 40))

    remaining = []
    for block in game['blocks']:
        block.y += 220 * dt
        if block.top >= HEIGHT:
            game['score'] += 1
        else:
            remaining.append(block)
    game['blocks'] = remaining
    for block in game['blocks']:
        if player.colliderect(block):
            game['over'] = True


def draw(screen, font, game):
    screen.fill('#14213d')
    pygame.draw.rect(screen, '#46d9bf', game['player'])
    for block in game['blocks']:
        pygame.draw.rect(screen, '#ffb454', block)
    label = font.render(f"Dodged: {game['score']}", True, 'white')
    screen.blit(label, (16, 16))
    if game['over']:
        message = font.render('Game over! R to restart; Esc to quit.', True, 'white')
        screen.blit(message, (50, 220))


def main():
    pygame.init()
    try:
        screen = pygame.display.set_mode((WIDTH, HEIGHT))
        pygame.display.set_caption('Dodge the Blocks')
        font = pygame.font.Font(None, 30)
        clock = pygame.time.Clock()
        game = new_game()
        running = True
        while running:
            dt = min(clock.tick(60) / 1000, 0.05)
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    running = False
                elif event.type == pygame.KEYDOWN:
                    if event.key == pygame.K_ESCAPE:
                        running = False
                    elif event.key == pygame.K_r:
                        game = new_game()
            keys = pygame.key.get_pressed()
            direction = int(keys[pygame.K_RIGHT]) - int(keys[pygame.K_LEFT])
            update(game, direction, dt)
            draw(screen, font, game)
            pygame.display.flip()
    finally:
        pygame.quit()


if __name__ == '__main__':
    main()
