"""Undvik fallande väggar. Installera pygame och kör filen med Python 3."""

import math
import random

WIDTH, HEIGHT = 640, 512
BLOCK_SIZE = 64
PLAYER_SIZE = 32
PLAYER_SPEED = 260


def move_player(x, y, dx, dy, dt):
    """Flytta spelaren och håll hela spelaren innanför spelplanen."""
    length = math.hypot(dx, dy)
    if length > 1:
        dx, dy = dx / length, dy / length
    x = max(0, min(WIDTH - PLAYER_SIZE, x + dx * PLAYER_SPEED * dt))
    y = max(0, min(HEIGHT - PLAYER_SIZE, y + dy * PLAYER_SPEED * dt))
    return x, y


def wall_blocks(y, gap_start):
    """Ett hål på två block, med startindex från 0 till och med 8."""
    return [
        (column * BLOCK_SIZE, y, BLOCK_SIZE, BLOCK_SIZE)
        for column in range(10)
        if column not in (gap_start, gap_start + 1)
    ]


def overlaps(first, second):
    """True när två rektanglar överlappar med en positiv area."""
    x1, y1, w1, h1 = first
    x2, y2, w2, h2 = second
    return x1 < x2 + w2 and x1 + w1 > x2 and y1 < y2 + h2 and y1 + h1 > y2


def main():
    import pygame

    pygame.init()
    try:
        screen = pygame.display.set_mode((WIDTH, HEIGHT))
        pygame.display.set_caption("Fallande väggar – Programmera Python")
        clock = pygame.time.Clock()
        font = pygame.font.Font(None, 28)
        player_x, player_y = 304.0, 440.0
        wall_y = -float(BLOCK_SIZE)
        gap_start = random.randint(0, 8)
        wall_speed = 120
        score = 0
        playing = False
        running = True

        while running:
            # Begränsa bildfrekvens och undvik stora hopp efter en paus.
            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_RETURN and not playing:
                        player_x, player_y = 304.0, 440.0
                        wall_y = -float(BLOCK_SIZE)
                        gap_start = random.randint(0, 8)
                        wall_speed = 120
                        score = 0
                        playing = True
            if not running:
                break

            if playing:
                keys = pygame.key.get_pressed()
                dx = int(keys[pygame.K_RIGHT]) - int(keys[pygame.K_LEFT])
                dy = int(keys[pygame.K_DOWN]) - int(keys[pygame.K_UP])
                player_x, player_y = move_player(player_x, player_y, dx, dy, dt)
                wall_y += wall_speed * dt
                player = (player_x, player_y, PLAYER_SIZE, PLAYER_SIZE)

                if any(overlaps(player, block) for block in wall_blocks(wall_y, gap_start)):
                    playing = False
                elif wall_y > HEIGHT:
                    score += 1
                    wall_y = -float(BLOCK_SIZE)
                    gap_start = random.randint(0, 8)
                    wall_speed = min(wall_speed + 8, 300)

            screen.fill((242, 246, 239))
            for block in wall_blocks(wall_y, gap_start):
                pygame.draw.rect(screen, (36, 91, 76), block)
            pygame.draw.rect(screen, (215, 165, 47), (player_x, player_y, PLAYER_SIZE, PLAYER_SIZE))
            score_text = font.render(f"Klarade väggar: {score}", True, (34, 49, 44))
            screen.blit(score_text, (16, 12))
            if not playing:
                message = font.render("Enter: nytt spel | Esc: avsluta", True, (34, 49, 44))
                screen.blit(message, (170, 230))
            pygame.display.flip()
    finally:
        pygame.quit()


if __name__ == "__main__":
    main()
