import pygame
import random
import math

# Inicjalizacja Pygame
pygame.init()

# Ustawienia okna gry
SCREEN_WIDTH, SCREEN_HEIGHT = 800, 600
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
pygame.display.set_caption('Gra 2 Graczy: Czerwony łapie Niebieskiego')

# Kolory
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (255, 0, 0)
BLUE = (0, 0, 255)
GRAY = (169, 169, 169)  # Szary kolor

# Gracz 1 (Niebieski)
player1_size = 40
player1_speed = 5
player1_pos = [SCREEN_WIDTH // 4, SCREEN_HEIGHT // 2]  # Pozycja początkowa gracza 1

# Gracz 2 (Czerwony)
player2_size = 40
player2_speed = 5
player2_pos = [3 * SCREEN_WIDTH // 4, SCREEN_HEIGHT // 2]  # Pozycja początkowa gracza 2

# Przeszkody (szersze prostokąty)
obstacle_width = 100
obstacle_height = 20
obstacles = [
    [100, 150],  # Przeszkoda 1
    [300, 250],  # Przeszkoda 2
    [500, 400],  # Przeszkoda 3
    [600, 100],  # Przeszkoda 4
    [200, 500],  # Przeszkoda 5
]

# Funkcja do rysowania kwadratów
def draw_square(color, position, size):
    pygame.draw.rect(screen, color, pygame.Rect(position[0], position[1], size, size))

# Funkcja do rysowania prostokątów (przeszkód)
def draw_rectangle(color, position, width, height):
    pygame.draw.rect(screen, color, pygame.Rect(position[0], position[1], width, height))

# Funkcja do poruszania gracza 1 (Niebieski)
def move_player1(player1_pos, keys, speed, obstacles):
    new_player1_pos = player1_pos[:]
    
    if keys[pygame.K_a] and player1_pos[0] > 0:
        new_player1_pos[0] -= speed
    if keys[pygame.K_d] and player1_pos[0] < SCREEN_WIDTH - player1_size:
        new_player1_pos[0] += speed
    if keys[pygame.K_w] and player1_pos[1] > 0:
        new_player1_pos[1] -= speed
    if keys[pygame.K_s] and player1_pos[1] < SCREEN_HEIGHT - player1_size:
        new_player1_pos[1] += speed

    # Sprawdzanie kolizji z przeszkodami
    if not check_collision_with_obstacles(new_player1_pos, obstacles, player1_size):
        player1_pos[:] = new_player1_pos

# Funkcja do poruszania gracza 2 (Czerwony)
def move_player2(player2_pos, keys, speed, obstacles):
    new_player2_pos = player2_pos[:]
    
    if keys[pygame.K_LEFT] and player2_pos[0] > 0:
        new_player2_pos[0] -= speed
    if keys[pygame.K_RIGHT] and player2_pos[0] < SCREEN_WIDTH - player2_size:
        new_player2_pos[0] += speed
    if keys[pygame.K_UP] and player2_pos[1] > 0:
        new_player2_pos[1] -= speed
    if keys[pygame.K_DOWN] and player2_pos[1] < SCREEN_HEIGHT - player2_size:
        new_player2_pos[1] += speed

    # Sprawdzanie kolizji z przeszkodami
    if not check_collision_with_obstacles(new_player2_pos, obstacles, player2_size):
        player2_pos[:] = new_player2_pos

# Funkcja sprawdzająca kolizję z przeszkodami
def check_collision_with_obstacles(position, obstacles, size):
    for obstacle in obstacles:
        if (obstacle[0] < position[0] + size and obstacle[0] + obstacle_width > position[0] and
            obstacle[1] < position[1] + size and obstacle[1] + obstacle_height > position[1]):
            return True
    return False

# Funkcja sprawdzająca, czy gracze się złapali
def check_collision(player1_pos, player2_pos, size):
    return abs(player1_pos[0] - player2_pos[0]) < size and abs(player1_pos[1] - player2_pos[1]) < size

# Pętla gry
clock = pygame.time.Clock()
running = True

while running:
    screen.fill(WHITE)
    
    # Obsługa zdarzeń
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
    
    # Ruch gracza 1 (Niebieski) - sterowanie WASD
    keys = pygame.key.get_pressed()
    move_player1(player1_pos, keys, player1_speed, obstacles)

    # Ruch gracza 2 (Czerwony) - sterowanie strzałkami
    move_player2(player2_pos, keys, player2_speed, obstacles)

    # Sprawdzanie kolizji (czy gracz 2 złapał gracza 1)
    if check_collision(player1_pos, player2_pos, player1_size):
        font = pygame.font.SysFont(None, 55)
        text = font.render("Czerwony złapał Niebieskiego!", True, RED)
        screen.blit(text, (SCREEN_WIDTH // 4, SCREEN_HEIGHT // 2))
        pygame.display.update()
        pygame.time.delay(2000)  # Czekanie 2 sekundy na zakończenie
        running = False

    # Rysowanie graczy i przeszkód
    draw_square(BLUE, player1_pos, player1_size)
    draw_square(RED, player2_pos, player2_size)

    # Rysowanie przeszkód
    for obstacle in obstacles:
        draw_rectangle(GRAY, obstacle, obstacle_width, obstacle_height)

    # Aktualizacja ekranu
    pygame.display.update()
    
    # Ustalamy FPS
    clock.tick(60)

# Zakończenie gry
pygame.quit()
