import pygame
import sys

# Set up display
screen = pygame.display.set_mode((900, 700))

# Set up colors (RGB format)
kirby_pink_color = (255, 105, 180)
kirby_yellow_color = (255, 255, 0)
ground_color = (0, 255, 0)

# Kirby properties
circle_radius1 = 25  # Initial radius
circle_radius2 = 25  # Initial radius
circle_y_offset1 = 25  # Offset from the top of Kirby1
circle_y_offset2 = 25  # Offset from the top of Kirby2
crouch_scale1 = 0.5  # Crouch scale for the Kirby1
crouch_scale2 = 0.5  # Crouch scale for the Kirby2 

# Kirby1 position and velocity
kirby1_x, kirby1_y = 425, 500
kirby1_x_speed, kirby_y_speed1 = 0, 0
gravity1 = 1
jump_height1 = -15  # Set jump height for Kirby1

# Kirby2 position and velocity
kirby2_x, kirby2_y = 425, 500
kirby2_x_speed, kirby2_y_speed = 0, 0
gravity2 = 1
jump_height2 = -15  # Set jump height for Kirby2

# Kirby1 crouching and in air states
is_crouching1 = False
in_air1 = False

# Kirby2 crouching and in air states
is_crouching2 = False
in_air2 = False

# Kirby1 movement flags
is_moving_left1 = False
is_moving_right1 = False
is_floating1 = False

# Kirby 2 movement flags
is_moving_left2 = False
is_moving_right2 = False
is_floating2 = False

# Load the Kirby face image
kirby_face1 = pygame.image.load("kirby_face.png")
kirby_face2 = pygame.image.load("kirby_face.png")

# Game loop
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_s and not is_crouching1:
                is_crouching1 = True
            elif event.key == pygame.K_k and not is_crouching2:
                is_crouching2 = True
            elif event.key == pygame.K_w and not in_air1:
                kirby_y_speed1 = jump_height1
                in_air1 = True
            elif event.key == pygame.K_i and not in_air2:
                kirby2_y_speed = jump_height2
                in_air2 = True
            elif event.key == pygame.K_e and not is_crouching1:
                is_floating1 = True
            elif event.key == pygame.K_o and not is_crouching2:
                is_floating2 = True
            elif event.key == pygame.K_r:  # Kirby1 exhale
                is_floating1 = False
            elif event.key == pygame.K_p:  # Kirby2 exhale
                is_floating2 = False
            elif event.key == pygame.K_a:  # Kirby1 move left
                is_moving_left1 = True
            elif event.key == pygame.K_d:  # Kirby1 move right
                is_moving_right1 = True
            elif event.key == pygame.K_j:  # Kirby2 move left
                is_moving_left2 = True
            elif event.key == pygame.K_l:  # Kirby2 move right
                is_moving_right2 = True
        elif event.type == pygame.KEYUP:
            if event.key == pygame.K_s:  # Kirby1 stop crouch
                is_crouching1 = False
            elif event.key == pygame.K_k:  # Kirby2 stop crouch
                is_crouching2 = False
            elif event.key == pygame.K_a:  # Kirby1 stop moving left
                is_moving_left1 = False
            elif event.key == pygame.K_j:  # Kirby2 stop moving left
                is_moving_left2 = False
            elif event.key == pygame.K_d:  # Kirby1 stop moving right
                is_moving_right1 = False
            elif event.key == pygame.K_l:  # Kirby2 stop moving right
                is_moving_right2 = False

    # Kirby1 Floating set up
    if is_floating1:
        gravity1 = 0.3
        jump_height1 = -6.5
        in_air1 = False
        is_crouching1 = False
        circle_radius1 = 35
        circle_y_offset1 = 35
    else:
        gravity1 = 1
        jump_height1 = -15
        in_air1 = True
        circle_radius1 = 25
        circle_y_offset1 = 25

    # Kirby2 Floating set up
    if is_floating2:
        gravity2 = 0.3
        jump_height2 = -6.5
        in_air2 = False
        is_crouching2 = False
        circle_radius2 = 35
        circle_y_offset2 = 35
    else:
        gravity2 = 1
        jump_height2 = -15
        in_air2 = True
        circle_radius2 = 25
        circle_y_offset2 = 25

    # Apply gravity to Kirby1
    kirby_y_speed1 += gravity1

    # Apply gravity to Kirby2
    kirby2_y_speed += gravity2

    # Apply horizontal motion for Kirby1
    if is_moving_left1:
        kirby1_x_speed = -5
    elif is_moving_right1:
        kirby1_x_speed = 5
    else:
        kirby1_x_speed = 0

    # Apply horizontal motion for Kirby 2
    if is_moving_left2:
        kirby2_x_speed = -5
    elif is_moving_right2:
        kirby2_x_speed = 5
    else:
        kirby2_x_speed = 0

    # Update Kirby1 position
    kirby1_x += kirby1_x_speed
    kirby1_y += kirby_y_speed1

    # Update Kirby2 position
    kirby2_x += kirby2_x_speed
    kirby2_y += kirby2_y_speed

    # Collision with the ground for Kirby1
    if kirby1_y + circle_radius1 >= 575:
        kirby1_y = 575 - circle_radius1
        kirby_y_speed1 = 0
        gravity1 = 1
        jump_height1 = -15
        is_floating1 = False
        in_air1 = False  # Kirby1 is on the ground

    # Collision with the ground for Kirby2
    if kirby2_y + circle_radius2 >= 575:
        kirby2_y = 575 - circle_radius2
        kirby2_y_speed = 0
        gravity2 = 1
        jump_height2 = -15
        is_floating2 = False
        in_air2 = False  # Kirby2 is on the ground

    # Collision with the sides of the screen for Kirby1
    if kirby1_x < 0:
        kirby1_x = 0
    elif kirby1_x > 900 - 2 * circle_radius1:
        kirby1_x = 900 - 2 * circle_radius1

    # Collision with the sides of the screen for Kirby2
    if kirby2_x < 0:
        kirby2_x = 0
    elif kirby2_x > 900 - 2 * circle_radius2:
        kirby2_x = 900 - 2 * circle_radius2

    # Draw background
    screen.fill((100, 100, 255))  # Blue background

    # Draw ground
    pygame.draw.rect(screen, ground_color, (0, 600, 900, 50))

    # Draw Kirby1
    if is_crouching1:
        pygame.draw.ellipse(screen, kirby_pink_color,
                            (int(kirby1_x),
                             int(kirby1_y + circle_radius1 * (1.5 - crouch_scale1)),
                             int(2 * circle_radius1),
                             int(crouch_scale1 * 2 * circle_radius1)))
        # Scale and draw the Kirby face when crouching
        kirby_face_scaled1 = pygame.transform.scale(kirby_face1, (int(2 * circle_radius1), int(2 * circle_radius1 * crouch_scale1)))
        screen.blit(kirby_face_scaled1, (int(kirby1_x), int(kirby1_y + circle_radius1 * (1.5 - crouch_scale1))))
    else:
        pygame.draw.circle(screen, kirby_pink_color,
                           (int(kirby1_x + circle_radius1), int(kirby1_y + circle_radius1)),
                           circle_radius1)
        # Scale and draw the Kirby face when not crouching
        kirby_face_scaled1 = pygame.transform.scale(kirby_face1, (int(2 * circle_radius1), int(2 * circle_radius1)))
        screen.blit(kirby_face_scaled1, (int(kirby1_x), int(kirby1_y)))

    # Draw Kirby2
    if is_crouching2:
        pygame.draw.ellipse(screen, kirby_yellow_color,
                            (int(kirby2_x),
                             int(kirby2_y + circle_radius2 * (1.5 - crouch_scale2)), 
                             int(2 * circle_radius2),
                             int(crouch_scale2 * 2 * circle_radius2)))
        # Scale and draw the Kirby face when crouching
        kirby_face_scaled2 = pygame.transform.scale(kirby_face2, (int(2 * circle_radius2), int(2 * circle_radius2 * crouch_scale2)))
        screen.blit(kirby_face_scaled2, (int(kirby2_x), int(kirby2_y + circle_radius2 * (1.5 - crouch_scale2))))
    else:
        pygame.draw.circle(screen, kirby_yellow_color,
                           (int(kirby2_x + circle_radius2), int(kirby2_y + circle_radius2)),
                           circle_radius2)
        # Scale and draw the Kirby face when not crouching
        kirby_face_scaled2 = pygame.transform.scale(kirby_face2, (int(2* circle_radius2), int(2 * circle_radius2))) # Different value here because the engine is being stupid and Kirby1 copies this value for some reason.
        screen.blit(kirby_face_scaled2, (int(kirby2_x), int(kirby2_y)))

    # Update the display
    pygame.display.flip()

    # Cap the frame rate
    pygame.time.Clock().tick(60)
Can you make the Kirby have collision with each other?