import simplegui
import random

# Constants
WIDTH = 800  # Window size
HEIGHT = 600
PLAYER_BASE = 40  # Base of the triangular spaceship
PLAYER_HEIGHT = 30  # Height of the triangular spaceship
ENEMY_WIDTH = 30
ENEMY_HEIGHT = 20
BULLET_WIDTH = 5
BULLET_HEIGHT = 10
ENEMY_COUNT = 10  # Number of enemies
BULLET_SPEED = 7  # Bullet speed
BASE_ENEMY_SPEED = 0.67  # Initial enemy speed
enemy_speed = BASE_ENEMY_SPEED  # Variable for dynamic enemy speed

# Global variables
player_pos = [WIDTH // 2, HEIGHT - 30]
player_speed = 0
bullets = []
enemies = []
score = 0
game_over = False

# Initialize enemies
def initialize_enemies():
    """Reset the enemies list with new positions."""
    global enemies
    enemies = []
    for i in range(ENEMY_COUNT):
        enemy_x = random.randint(0, WIDTH - ENEMY_WIDTH)
        enemy_y = random.randint(30, 150)
        enemies.append([enemy_x, enemy_y])

initialize_enemies()

# Helper functions
def draw(canvas):
    global bullets, enemies, score, game_over
    
    # Draw spaceship as a triangle
    canvas.draw_polygon([(player_pos[0], player_pos[1] - PLAYER_HEIGHT // 2),  # Top vertex
                         (player_pos[0] - PLAYER_BASE // 2, player_pos[1] + PLAYER_HEIGHT // 2),  # Bottom left
                         (player_pos[0] + PLAYER_BASE // 2, player_pos[1] + PLAYER_HEIGHT // 2)],  # Bottom right
                        1, "White", "Blue")
    
    # Update and draw bullets
    for bullet in bullets[:]:
        bullet[1] -= BULLET_SPEED
        if bullet[1] < 0:
            bullets.remove(bullet)
        else:
            canvas.draw_line((bullet[0], bullet[1]), (bullet[0], bullet[1] - BULLET_HEIGHT), 2, "Yellow")
    
    # Update and draw enemies
    for enemy in enemies[:]:
        enemy[1] += enemy_speed
        if enemy[1] > HEIGHT:
            game_over = True  # Enemy reached the bottom
        canvas.draw_polygon([(enemy[0] - ENEMY_WIDTH // 2, enemy[1] - ENEMY_HEIGHT // 2),
                             (enemy[0] + ENEMY_WIDTH // 2, enemy[1] - ENEMY_HEIGHT // 2),
                             (enemy[0] + ENEMY_WIDTH // 2, enemy[1] + ENEMY_HEIGHT // 2),
                             (enemy[0] - ENEMY_WIDTH // 2, enemy[1] + ENEMY_HEIGHT // 2)],
                            1, "Red", "Green")
    
    # Check for collisions
    for bullet in bullets[:]:
        for enemy in enemies[:]:
            if (enemy[0] - ENEMY_WIDTH // 2 <= bullet[0] <= enemy[0] + ENEMY_WIDTH // 2 and
                    enemy[1] - ENEMY_HEIGHT // 2 <= bullet[1] <= enemy[1] + ENEMY_HEIGHT // 2):
                bullets.remove(bullet)
                enemies.remove(enemy)
                score += 1
                break
    
    # Display score and game over
    canvas.draw_text("Score: {}".format(score), (10, 20), 20, "White")
    canvas.draw_text("Enemy Speed: {:.2f}".format(enemy_speed), (10, 40), 20, "White")
    if game_over:
        canvas.draw_text("GAME OVER!", (WIDTH // 2 - 100, HEIGHT // 2), 36, "Red")

def reset_game():
    """Reset the game state for a new game."""
    global player_pos, player_speed, bullets, enemies, score, enemy_speed, game_over
    player_pos = [WIDTH // 2, HEIGHT - 30]
    player_speed = 0
    bullets = []
    initialize_enemies()
    score = 0
    enemy_speed = BASE_ENEMY_SPEED
    game_over = False

def keydown(key):
    global player_speed, enemy_speed
    if key == simplegui.KEY_MAP["left"]:
        player_speed = -12  # Increased speed
    elif key == simplegui.KEY_MAP["right"]:
        player_speed = 12  # Increased speed
    elif key == simplegui.KEY_MAP["space"]:
        if len(bullets) < 5:  # Limit the number of bullets on screen
            bullets.append([player_pos[0], player_pos[1] - PLAYER_HEIGHT])
    elif key == simplegui.KEY_MAP["up"]:
        enemy_speed *= 1.05  # Increase enemy speed by 5%
    elif key == simplegui.KEY_MAP["down"]:
        enemy_speed *= 0.95  # Decrease enemy speed by 5%
    elif key == simplegui.KEY_MAP["n"]:  # Reset the game with 'N'
        reset_game()

def keyup(key):
    global player_speed
    if key == simplegui.KEY_MAP["left"] or key == simplegui.KEY_MAP["right"]:
        player_speed = 0

def update():
    global player_pos
    player_pos[0] += player_speed
    player_pos[0] = max(PLAYER_BASE // 2, min(WIDTH - PLAYER_BASE // 2, player_pos[0]))

# Create frame
frame = simplegui.create_frame("Space Invaders", WIDTH, HEIGHT)

# Register handlers
frame.set_draw_handler(draw)
frame.set_keydown_handler(keydown)
frame.set_keyup_handler(keyup)
frame.set_canvas_background("Black")

# Start frame and timer
frame.start()
timer = simplegui.create_timer(50, update)
timer.start()
