import pyxel
'''
der entwurf mit coopilot ging schnell. es startete ok. auch einige
weitere züge waren moeglich. dann scheiterte er aber immer an den rändern.
claude schauffte die korrektur in einem versuch. bravo!
'''
# Startzustand: Feld 0 leer, Rest mit Pins
board = [0] + [1] * 14

# Positionen der Felder im Dreieck
positions = [
    (64, 16),  # 0
    (56, 32), (72, 32),  # 1, 2
    (48, 48), (64, 48), (80, 48),  # 3, 4, 5
    (40, 64), (56, 64), (72, 64), (88, 64),  # 6, 7, 8, 9
    (32, 80), (48, 80), (64, 80), (80, 80), (96, 80)  # 10, 11, 12, 13, 14
]

# Alle gültigen Züge (start, middle, end) 
moves = [
    # Horizontale (links rechts und zurück)
    (3, 4, 5), (5, 4, 3),
    (6, 7, 8), (8, 7, 6),
    (7, 8, 9), (9, 8, 7),
    (10, 11, 12), (12, 11, 10),
    (11, 12, 13), (13, 12, 11),
    (12, 13, 14), (14, 13, 12),
    
    # Diagonale (nach links schräg: /)
    (0, 1, 3), (3, 1, 0),
    (1, 3, 6), (6, 3, 1),
    (3, 6, 10), (10, 6, 3), 
    # 
    (2, 4, 7), (7, 4, 2),
    (4, 7, 11), (11, 7, 4),
    (5, 8, 12), (12, 8, 5),
    
    # Diagonale (nach rechts schräg: \)
    (0, 2, 5), (5, 2, 0),
    (2, 5, 9), (9, 5, 2),
    (5, 9, 14), (14, 9, 5),
    #
    (1, 4, 8), (8, 4, 1),
    (4, 8, 13), (13, 8, 4),
    (3, 7, 12), (12, 7, 3),
]
selected = None

def get_clicked_field(mx, my):
    for i, (x, y) in enumerate(positions):
        if (mx - x)**2 + (my - y)**2 < 36:  # Etwas größerer Klickbereich
            return i
    return None

def update():
    global selected, board

    # R-Taste für Restart
    if pyxel.btnp(pyxel.KEY_R):
        board = [0] + [1] * 14
        selected = None
        return
    
    if pyxel.btnp(pyxel.MOUSE_BUTTON_LEFT):
        clicked = get_clicked_field(pyxel.mouse_x, pyxel.mouse_y)
        
        if clicked is None:
            selected = None
            return
        
        if selected is None:
            # Wähle einen Pin aus
            if board[clicked] == 1:
                selected = clicked
        else:
            # Versuche einen Zug zu machen
            move_found = False
            for start, middle, end in moves:
                if (start == selected and end == clicked and 
                    board[start] == 1 and board[middle] == 1 and board[end] == 0):
                    board[start] = 0
                    board[middle] = 0
                    board[end] = 1
                    selected = None
                    move_found = True
                    break
            
            if not move_found:
                # Falls kein Zug möglich, neue Auswahl oder deselektieren
                if board[clicked] == 1:
                    selected = clicked
                else:
                    selected = None

def draw():
    pyxel.cls(0)
    
    # Finde mögliche Zielfelder wenn ein Pin ausgewählt ist
    possible_targets = set()
    remaining = sum(board)
    
    if selected is not None:
        for start, middle, end in moves:
            if (start == selected and 
                board[start] == 1 and board[middle] == 1 and board[end] == 0):
                possible_targets.add(end)

    for i, (x, y) in enumerate(positions):
        if board[i] == 1:
            color = 10 if i == selected else 9
        else:
            color = 8 if i in possible_targets else 5
        pyxel.circ(x, y, 5, color)
    
    # Zeige Anzahl verbliebener Pins
    pyxel.text(5, 5, f"Pins: {remaining}", 7)
    if remaining == 1:
        pyxel.text(5, 25, "YOU WIN!", 7)
        pyxel.text(5, 90, "R=Restart", 7)

pyxel.init(128, 96, title="Peg-Dreieck")
pyxel.mouse(True)
pyxel.run(update, draw)