import pygame
import random
import sys

pygame.init()
#computeraidedautomation.com
# Window
WIDTH = 500
HEIGHT = 700
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Turbo Racer")

clock = pygame.time.Clock()

# Colors
GREEN = (30, 140, 30)
GRAY = (60, 60, 60)
WHITE = (255, 255, 255)
RED = (220, 40, 40)
BLUE = (50, 100, 255)
YELLOW = (255, 220, 0)
BLACK = (0, 0, 0)

font = pygame.font.SysFont(None, 40)
bigfont = pygame.font.SysFont(None, 80)

# Road
ROAD_X = 100
ROAD_W = 300

# Player
player_w = 50
player_h = 90
player_x = WIDTH // 2 - player_w // 2
player_y = HEIGHT - 120
player_speed = 7

# Lane animation
lane_offset = 0

# Enemy list
enemies = []

score = 0
game_over = False

def create_enemy():
    lane_positions = [130, 225, 320]
    x = random.choice(lane_positions)

    return {
        "x": x,
        "y": -120,
        "speed": random.randint(6, 10),
        "color": random.choice([BLUE, YELLOW, RED])
    }

for i in range(3):
    enemy = create_enemy()
    enemy["y"] = -i * 250
    enemies.append(enemy)

def draw_car(x, y, color):
    pygame.draw.rect(screen, color, (x, y, 50, 90), border_radius=8)

    pygame.draw.rect(screen, (30,30,30), (x+8, y+10, 34, 20))
    pygame.draw.rect(screen, (30,30,30), (x+8, y+60, 34, 20))

    pygame.draw.rect(screen, BLACK, (x-5, y+10, 5, 20))
    pygame.draw.rect(screen, BLACK, (x+50, y+10, 5, 20))
    pygame.draw.rect(screen, BLACK, (x-5, y+60, 5, 20))
    pygame.draw.rect(screen, BLACK, (x+50, y+60, 5, 20))

while True:

    clock.tick(60)

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()

        if game_over:
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_r:

                    enemies.clear()

                    for i in range(3):
                        enemy = create_enemy()
                        enemy["y"] = -i * 250
                        enemies.append(enemy)

                    player_x = WIDTH // 2 - player_w // 2
                    score = 0
                    game_over = False

    if not game_over:

        keys = pygame.key.get_pressed()

        if keys[pygame.K_LEFT]:
            player_x -= player_speed

        if keys[pygame.K_RIGHT]:
            player_x += player_speed

        if player_x < 110:
            player_x = 110

        if player_x > 340:
            player_x = 340

        lane_offset += 8

        if lane_offset > 80:
            lane_offset = 0

        for enemy in enemies:

            enemy["y"] += enemy["speed"]

            if enemy["y"] > HEIGHT:
                enemy.update(create_enemy())
                score += 1

            player_rect = pygame.Rect(
                player_x,
                player_y,
                player_w,
                player_h
            )

            enemy_rect = pygame.Rect(
                enemy["x"],
                enemy["y"],
                50,
                90
            )

            if player_rect.colliderect(enemy_rect):
                game_over = True

    # Draw background
    screen.fill(GREEN)

    # Road
    pygame.draw.rect(
        screen,
        GRAY,
        (ROAD_X, 0, ROAD_W, HEIGHT)
    )

    # Lane markers
    for y in range(-80, HEIGHT, 80):
        pygame.draw.rect(
            screen,
            WHITE,
            (245, y + lane_offset, 10, 40)
        )

    # Road edges
    pygame.draw.line(screen, WHITE, (100,0), (100,HEIGHT), 5)
    pygame.draw.line(screen, WHITE, (400,0), (400,HEIGHT), 5)

    # Enemies
    for enemy in enemies:
        draw_car(enemy["x"], enemy["y"], enemy["color"])

    # Player
    draw_car(player_x, player_y, RED)

    # Score
    score_text = font.render(
        f"Score: {score}",
        True,
        WHITE
    )

    screen.blit(score_text, (15,15))

    if game_over:

        overlay = pygame.Surface((WIDTH, HEIGHT))
        overlay.set_alpha(180)
        overlay.fill(BLACK)
        screen.blit(overlay, (0,0))

        txt1 = bigfont.render(
            "GAME OVER",
            True,
            RED
        )

        txt2 = font.render(
            f"Score : {score}",
            True,
            WHITE
        )

        txt3 = font.render(
            "Press R to Restart",
            True,
            WHITE
        )

        screen.blit(
            txt1,
            (WIDTH//2 - txt1.get_width()//2, 250)
        )

        screen.blit(
            txt2,
            (WIDTH//2 - txt2.get_width()//2, 350)
        )

        screen.blit(
            txt3,
            (WIDTH//2 - txt3.get_width()//2, 420)
        )

    pygame.display.flip()
