# Participation au Jeu concours de Noël de Casio
"""
Catégorie Classe : Elèves du Lycée Louis Pasteur d'Avignon
Professeurs : Vincent ROBERT, Raphaël CLEMENTE
Elèves : 15 élèves citées dans ce document, sous la forme Prénom N.
(Le listing complet avec les prénoms et photos des carnets vous sera communiqué sur demande,
comme prévu à l'article 6 des modalités de participation.)
https://www.casio-education.fr/actualites/jeu-concours-casio-de-noel/
"""
# ------------------------------------------------------------


# Un projet de classe avec des objets paramétrables
"""
Ayant découvert ce concours par sur  site tiplanet.org,
que nous remercions de diffuser régulièrement les annonces des différents constructeurs de calculatrices,
nous avons demandé à nos élèves de programmer en python des "cadeaux de Noël".
Plus précisément, après la démonstration en classe de la construction d'un sapin de Noël,
ils avaient pour consigne de créer une fonction pour rendre la construction de leur cadeau paramétrable
afin que l'on puisse le positionner sur l'écran au coordonnées (x,y) et choisir la taille de l'objet.
"""
# ------------------------------------------------------------


# Importation des librairies nécessaires
# ----------------------------------------------------
from turtle import *
from math import *


# Une étoile par Rémi A.
# ----------------------------------------------------
def etoile(x, y, longueur, epaisseur, couleur_1=(0.81, 0.06, 0.06), couleur_2=(0.98, 0.93, 0.18)):
    compteur = int(longueur * 1.1)
    if compteur > 0:
        if compteur % 2 == 0:
            coul = couleur_2
        else:
            coul = couleur_1
        penup()
        goto(x, y)
        pensize(epaisseur)
        pencolor(coul)
        pendown()
        left(8)
        speed(0)
        for repetition in range(5):
            forward(longueur)
            left(54)
            forward(longueur)
            right(126)
        right(8)
        etoile(x + 1.45 * epaisseur, y - 0.5 * epaisseur, longueur - epaisseur, epaisseur + 1, couleur_1, couleur_2)


# Un cadeau ouvert par Rémi A.
# ----------------------------------------------------
def ruban(x, y, longueur, epaisseur, couleur=(1.0, 0.89, 0.08)):
    compteur = int(longueur * 0.2)
    if compteur > 0:
        penup()
        goto(x, y)
        pensize(epaisseur)
        pendown()
        speed(0)
        pencolor(couleur)
        for i in range(2):
            forward(4 * longueur)
            left(120)
            forward(longueur / 10)
            right(60)
            forward(longueur / 10)
            left(120)
        ruban(x + epaisseur, y, longueur - 0.5 * epaisseur, epaisseur, couleur)


def contour_cad(x, y, longueur, epaisseur, couleur=(0.81, 0.06, 0.06)):
    penup()
    goto(x, y)
    pensize(epaisseur)
    pendown()
    speed(0)
    pencolor(couleur)
    for i in range(4):
        forward(longueur)
        left(90)
    forward(longueur)
    left(45)
    forward(sqrt(longueur ** 2 / 3))
    left(45)
    forward(longueur)
    left(90)
    forward(longueur)
    left(45)
    forward(sqrt(longueur ** 2 / 3))
    left(45)
    forward(longueur)
    left(90)
    penup()
    goto(x + longueur, y + longueur)
    left(45)
    pendown()
    forward(sqrt(longueur ** 2 / 3))
    right(45)


def fond_cad(x, y, longueur, epaisseur, couleur=(0.94, 0.06, 0.06)):
    compteur = int(longueur * 1.1)
    if compteur > 0:
        penup()
        goto(x, y)
        pensize(epaisseur)
        pendown()
        speed(0)
        pencolor(couleur)
        for compteur in range(2):
            forward(longueur)
            left(45)
            forward(sqrt(longueur ** 2 / 3))
            left(45)
            forward(longueur)
            left(90)
        fond_cad(x + 0.5 * epaisseur, y + 0.5 * epaisseur, longueur - 0.5 * epaisseur, epaisseur + 1, couleur)


def carton(x, y, longueur, epaisseur, couleur=(0.45, 0.16, 0.07)):
    compteur = int(longueur * 1.1)
    if compteur > 0:
        penup()
        goto(x, y)
        pencolor((0.45, 0.16, 0.07))
        pendown()
        pensize(epaisseur)
        speed(0)
        for i in range(2):
            forward(longueur)
            left(45)
            forward(sqrt(longueur ** 2 / 4))
            left(135)
        carton(x, y, longueur - 0.5 * epaisseur, epaisseur, couleur)


def couvercle(x, y, longueur, epaisseur, couleur=(0.94, 0.06, 0.06)):
    compteur = int(longueur * 1.1)
    if compteur > 0:
        penup()
        goto(x, y)
        pensize(epaisseur)
        pendown()
        speed(0)
        pencolor(couleur)
        for compteur in range(2):
            left(45)
            forward(sqrt(longueur ** 2 / 3))
            left(100)
            forward(longueur)
            left(35)
        couvercle(x, y, longueur - 0.5 * epaisseur, epaisseur, couleur)


def cadeau(x, y, longueur, epaisseur, couleur_fond=(0.94, 0.06, 0.06), couleur_contour=(0.81, 0.06, 0.06),
           couleur_ruban=(1.0, 0.89, 0.08)):
    ruban(x - longueur * 1.25, y + 0.15 * longueur, longueur, epaisseur, couleur_ruban)
    fond_cad(x, y, longueur, epaisseur, couleur_fond)
    contour_cad(x, y, longueur, epaisseur, couleur_contour)
    carton(x + 2 * epaisseur, y + longueur + epaisseur, longueur - 2 * epaisseur, epaisseur)
    couvercle(x + longueur, y + longueur, longueur, epaisseur, couleur_fond)
    pencolor(couleur_contour)
    pensize(epaisseur)
    for compteur in range(2):
        left(45)
        forward(sqrt(longueur ** 2 / 3))
        left(100)
        forward(longueur)
        left(35)
    penup()
    goto(x, y)


# Un bonhomme de neige par Alexandre B.
# ----------------------------------------------------
def bdn(x, y, taille, vitesse, col_bdn="black", col_nez="orange", remplissage="oui"):
    speed(0)
    if remplissage == "oui":
        penup()
        pencolor("white")
        goto(x, y + taille)
        pendown()
        pensize(taille * 2)
        circle(taille * 0.01)
    pensize(taille / 50)
    penup()
    goto(x, y)
    pendown()
    pencolor(col_bdn)
    pensize(taille / 50)
    """circle(taille) # rond 1
    if remplissage == "oui":
        penup()
        pencolor("white")
        goto(x, y + 2 * taille + taille * 0.8)
        pendown()
        pensize(taille * 2 * 0.8)
        circle(taille *0.01)
    pensize(taille / 50)"""
    penup()
    goto(x, y + 2 * taille)
    pendown()
    pencolor(col_bdn)
    circle(taille * 0.8)  # rond 2
    if remplissage == "oui":
        penup()
        pencolor("white")
        goto(x, y + 2 * taille + 2 * taille * 0.8 + taille * 0.6)
        pendown()
        pensize(taille * 2 * 0.6)
        circle(taille * 0.01)
    pensize(taille / 50)
    penup()
    goto(x, y + 2 * taille + 2 * taille * 0.8)
    pendown()
    pencolor(col_bdn)
    circle(taille * 0.6)  # rond 3
    penup()
    right(90)
    forward((2 * taille * 0.8) / 8)
    right(90)
    pendown()
    circle(taille * 0.1)  # bouton 1
    penup()
    left(90)
    forward((2 * taille * 0.8) / 4)
    right(90)
    pendown()
    circle(taille * 0.1)  # bouton 2
    penup()
    left(90)
    forward((2 * taille * 0.8) / 4)
    right(90)
    pendown()
    circle(taille * 0.1)  # bouton 3
    penup()
    goto(x, y + 2 * taille + 2 * taille * 0.8)
    forward((2 * taille * 0.6) / 4)
    right(90)
    forward((2 * taille * 0.6) / 4)
    pendown()
    circle(taille * 0.05)  # bouche 1
    penup()
    right(90)
    forward((2 * taille * 0.6) / 8)
    right(90)
    forward((2 * taille * 0.6) / 8)
    right(180)
    pendown()
    circle(taille * 0.05)  # bouche 2
    penup()
    right(90)
    forward((2 * taille * 0.6) / 6)
    right(90)
    forward((2 * taille * 0.6) / 16)
    right(180)
    pendown()
    circle(taille * 0.05)  # bouche 3
    penup()
    goto(x, y + 2 * taille + 2 * taille * 0.8)
    forward((2 * taille * 0.6) / 4)
    right(90)
    forward((2 * taille * 0.6) / 4)
    right(90)
    pendown()
    circle(taille * 0.05)  # bouche 4
    penup()
    forward((2 * taille * 0.6) / 8)
    right(90)
    forward((2 * taille * 0.6) / 8)
    left(90)
    pendown()
    circle(taille * 0.05)  # bouche 5
    penup()
    goto(x, y + 2 * taille + 2 * taille * 0.8)
    pencolor(col_nez)
    right(180)
    forward((2 * taille * 0.6) / 2.4)
    pendown()
    forward((2 * taille * 0.6) / 6)  # nez
    right(100)
    forward((2 * taille * 0.6) / 2)
    right(160)
    forward((2 * taille * 0.6) / 2)
    penup()
    pencolor(col_bdn)
    goto(x, y + 2 * taille + 2 * taille * 0.8)
    forward((2 * taille * 0.6) / 8)
    right(90)
    forward((2 * taille * 0.6) / (4 / 3))
    right(180)
    pendown()
    circle(taille * 0.05)  # oeil 1
    penup()
    goto(x, y + 2 * taille + 2 * taille * 0.8)
    left(90)
    forward((2 * taille * 0.6) / 4)
    left(90)
    forward((2 * taille * 0.6) / (24 / 17))
    right(180)
    pendown()
    circle(taille * 0.05)  # oeil 2
    penup()
    goto(x, y + 2 * taille + 2 * taille * 0.8 + 2 * taille * 0.6)
    right(100)
    forward((2 * taille * 0.6) / 2.4)
    right(180)
    pendown()
    forward((2 * taille * 0.6) / 1.2)  # chapeau
    left(90)
    forward((2 * taille * 0.6) / 7.5)
    left(90)
    forward((2 * taille * 0.6) / 1.2)
    left(90)
    forward((2 * taille * 0.6) / 7.5)
    right(180)
    forward((2 * taille * 0.6) / 7.5)
    right(90)
    forward((2 * taille * 0.6) / 12)
    left(90)
    forward((2 * taille * 0.6) / 3)
    right(90)
    forward((2 * taille * 0.6) / 1.5)
    right(90)
    forward((2 * taille * 0.6) / 3)
    penup()
    goto(x + taille * 0.8, y + 2 * taille + taille * 0.8)
    left(120)
    pensize(taille / (100 / 3))
    pendown()
    forward((2 * taille * 0.8) / 1.6)  # bras 1
    backward((2 * taille * 0.8) / 6.4)
    right(30)
    forward((2 * taille * 0.8) / (16 / 3))
    backward((2 * taille * 0.8) / (16 / 3))
    left(30)
    backward((2 * taille * 0.8) / 8)
    left(40)
    forward((2 * taille * 0.8) / (16 / 3))
    right(40)
    penup()
    goto(x - taille * 0.8, y + 2 * taille + taille * 0.8)
    left(120)
    pendown()
    forward((2 * taille * 0.8) / 1.6)  # bras 2
    backward((2 * taille * 0.8) / 6.4)
    right(35)
    forward((2 * taille * 0.8) / (16 / 3))
    backward((2 * taille * 0.8) / (16 / 3))
    left(35)
    backward((2 * taille * 0.8) / 8)
    left(35)
    forward((2 * taille * 0.8) / (16 / 3))
    right(185)


# Une montre par Alexandre B.
# ----------------------------------------------------
def montre(x, y, taille, vitesse, col1="black", col2="black", col3="black"):
    pencolor(col1)
    speed(0)
    pensize(taille / 50)
    penup()
    goto(x, y - taille * 2 * 0.4)
    pendown()
    forward(taille / (10 / 3))
    left(90)
    forward(taille / (2 / 7))
    left(90)
    forward(taille / (5 / 3))
    left(90)
    forward(taille / (2 / 7))
    left(90)
    forward(taille / (10 / 3))
    penup()
    goto(x, y - taille * 2 * 0.4)
    backward(taille / 5)
    left(90)
    for i in range(6):
        penup()
        forward(taille / 10)
        pendown()
        circle(taille * 0.025)
    penup()
    goto(x, y - taille * 2 * 0.4)
    right(90)
    forward(taille / 5)
    left(90)
    for i in range(6):
        penup()
        forward(taille / 10)
        pendown()
        right(180)
        circle(taille * 0.025)
        right(180)
    penup()
    goto(x, y - taille * 2 * 0.4 + taille / (2 / 7))
    right(90)
    backward(taille / 5)
    right(90)
    for i in range(6):
        penup()
        forward(taille / 10)
        pendown()
        right(180)
        circle(taille * 0.025)
        right(180)
    penup()
    goto(x, y - taille * 2 * 0.4 + taille / (2 / 7))
    left(90)
    forward(taille / 5)
    right(90)
    for i in range(6):
        penup()
        forward(taille / 10)
        pendown()
        circle(taille * 0.025)
    left(90)
    penup()
    goto(x, y + taille)
    pensize(taille * 2 + taille * 2 * 0.1)
    pencolor("white")
    pendown()
    circle(taille * 0.01)
    penup()
    goto(x, y)
    pendown()
    pensize(2)
    pencolor(col2)
    circle(taille)
    penup()
    goto(x, y - taille * 0.1)
    pendown()
    circle(taille + taille * 0.1)
    penup()
    goto(x, y)
    left(90)
    forward(taille / 10)
    pensize(taille / 20)
    right(90)
    forward(taille / (20 / 3))
    left(90)
    pencolor(col3)
    for i in range(12):
        pendown()
        forward(taille / 5)
        right(60)
        penup()
        forward(taille / (20 / 7))
        left(90)
        pendown()
        backward(taille / 5)
    penup()
    goto(x, y + taille)
    left(60)
    pendown()
    backward(taille / 10)
    forward(taille / 2.5)
    backward(taille / (10 / 3))
    left(70)
    backward(taille / 10)
    forward(taille / 2)
    right(220)


# Un cadeau fermé par Raphaël C.
"""Presque un homonyme de l'enseignant, c'est néanmoins un élève"""
# ----------------------------------------------------

def contour(x, y, longueur, epaisseur, couleur=(0.81, 0.06, 0.06)):
    penup()
    goto(x, y)
    pensize(epaisseur)
    pendown()
    speed(0)
    pencolor(couleur)
    for i in range(4):
        forward(longueur)
        left(90)
    forward(longueur)
    left(45)
    forward(sqrt(longueur ** 2 / 3))
    left(45)
    forward(longueur)
    left(90)
    forward(longueur)
    left(45)
    forward(sqrt(longueur ** 2 / 3))
    left(45)
    forward(longueur)
    left(90)
    penup()
    goto(x + longueur, y + longueur)
    left(45)
    pendown()
    forward(sqrt(longueur ** 2 / 3))
    right(45)


def fond(x, y, longueur, epaisseur, couleur=(0.94, 0.06, 0.06)):
    compteur = int(longueur * 1.1)
    if compteur > 0:
        penup()
        goto(x, y)
        pensize(epaisseur)
        pendown()
        speed(0)
        pencolor(couleur)
        for compteur in range(2):
            forward(longueur)
            left(45)
            forward(sqrt(longueur ** 2 / 3))
            left(45)
            forward(longueur)
            left(90)
        fond(x + 0.5 * epaisseur, y + 0.5 * epaisseur, longueur - 0.5 * epaisseur, epaisseur + 1, couleur)


def noeud(x, y, longueur, epaisseur, couleur_n=(0.44, 0.44, 0.44)):
    penup()
    pensize(epaisseur * 1.15)
    pencolor(couleur_n)
    goto(x + longueur // 2, y)
    right(270)
    pendown()
    forward(longueur // 2)
    right(90)
    forward(longueur // 2)
    right(180)
    forward(longueur)
    right(180)
    forward(longueur // 2)
    left(90)
    forward(longueur // 2)
    right(45)
    forward(sqrt(longueur ** 2 / 3))
    right(180)
    forward((sqrt(longueur ** 2 / 3)) // 2)
    right(45)
    forward((sqrt(longueur ** 2 / 3)) * 0.85)
    right(180)
    forward(sqrt(longueur ** 2))
    right(90)
    forward(sqrt(longueur ** 2))
    right(180)
    forward((sqrt(longueur ** 2 / 3)) * 0.85)
    right(45)
    forward((sqrt(longueur ** 2 / 3)) // 2)
    right(180)
    forward(sqrt(longueur ** 2 / 3))


def curve(longueur):
    for i in range(200):
        right(1)
        forward(longueur / 200)


def heart(x, y, longueur):
    penup()
    goto(x + longueur // 8 + (sqrt(longueur ** 2 / 3)), y + longueur + (sqrt(longueur ** 2 / 3) // 2))
    right(225)
    pendown()
    left(140)
    forward(longueur // 2)
    curve(longueur)
    left(120)
    curve(longueur)
    forward(longueur // 2)


def cadeauf(x, y, longueur, epaisseur, couleur_n=(0.44, 0.44, 0.44), couleur_fond=(0.94, 0.06, 0.06),
            couleur_contour=(0.81, 0.06, 0.06)):
    speed(0)
    fond(x, y, longueur, epaisseur, couleur_fond)
    contour(x, y, longueur, epaisseur, couleur_contour)
    noeud(x, y, longueur, epaisseur, couleur_n)
    heart(x, y, longueur)
    penup()
    right(225)
    setheading(0)


# Une bougie par Raphaël C.
"""Presque un homonyme de l'enseignant, c'est néanmoins un élève"""
# ----------------------------------------------------
def rect(x, y, long, epai, couleur_r=(0.66, 0.02, 0.02)):
    penup()
    goto(x, y)
    pendown()
    long2 = 3 * long
    pencolor(couleur_r)
    pensize(epai)
    for i in range(long // 4):
        for j in range(4):
            if j % 2 == 0:
                forward(long)
                left(90)
            else:
                forward(long2)
                left(90)
        long -= 4
        long2 -= 4


def c_beige(x, y, long, epai, couleur_c=(1, 0.96, 0.83)):
    c = long // 3.846
    pensize(epai * (long / 67.5))
    penup()
    goto(x + long // 2, y + long * 3.06)
    pendown()
    pencolor(couleur_c)
    while c > 1:
        circle(c)
        penup()
        goto(x + long // 2, y + long * 3.1)
        pendown()
        c -= 1


def bord_fla(x, y, long, epai, couleur_bf=(0.94, 0, 0.008)):
    pensize(epai * (long / 100))
    penup()
    goto(x + long // 1.25, y + long * 3.38)
    pendown()
    pencolor(couleur_bf)
    left(90)
    circle(long / 0.7, long // 1.25)
    penup()
    goto(x + long // 5, y + long * 3.38)
    pendown()
    right(40)
    circle(-(long / 0.7), long // 1.25)


def int_fla(x, y, long, epai, couleur_if=(1, 0.54, 0.08)):
    penup()
    goto(x + long // 2, y + long * 3.64)
    pendown()
    pensize(epai * (long / 41.6))
    pencolor(couleur_if)
    right(45)
    circle(long / 8.3)


def int_fla_bleu(x, y, long, epai, couleur_ifb=(0.31, 0.49, 0.82)):
    penup()
    goto(x + long // 2, y + long * 3.06)
    pendown()
    pensize(epai * (long / 41.6))
    pencolor(couleur_ifb)
    circle(long / 16.67)


def mech(x, y, long, epai, couleur_m=(0, 0, 0)):
    penup()
    goto(x + long // 2, y + long * 3)
    pendown()
    pencolor(couleur_m)
    pensize(epai * (long // 250))
    left(85)
    forward(long * 0.5)


def bougie_finale(x, y, long, epai):
    speed(0)
    rect(x, y, long, epai, couleur_r=(0.66, 0.02, 0.02))
    c_beige(x, y, long, epai, couleur_c=(1, 0.96, 0.83))
    bord_fla(x, y, long, epai, couleur_bf=(0.94, 0, 0.008))
    int_fla(x, y, long, epai, couleur_if=(1, 0.54, 0.08))
    int_fla_bleu(x, y, long, epai, couleur_ifb=(0.31, 0.49, 0.82))
    mech(x, y, long, epai, couleur_m=(0, 0, 0))
    penup()
    right(90)


# Un flocon par Ethan G.
# ----------------------------------------------------
def flocon(x, y, longueur1, longueur2, epaisseur, angle, couleur):
    pencolor(couleur)
    pensize(epaisseur)
    for i in range(9):
        penup()
        goto(x, y)
        pendown()
        left(angle)
        forward(longueur1)
        left(20)
        forward(longueur2)
        backward(longueur2)
        right(40)
        forward(longueur2)
        left(60)


# Une cheminée par Aël D.
# ----------------------------------------------------
def flamme(x=0, y=0, taille=100, angle=0, couleur="orange", epaisseur=5):
    right(angle)
    pensize(epaisseur)
    pencolor(couleur)
    penup()
    goto(x, y)
    pendown()
    for i in range(floor(taille / 2)):
        forward(i)
        forward(-i)
        penup()
        left(90)
        forward(1)
        right(90)
        pendown()
    for j in range(floor(taille)):
        forward(floor(taille / 2) - floor(j / 2))
        forward(-(floor(taille / 2) - floor(j / 2)))
        penup()
        left(90)
        forward(1)
        right(90)
        pendown()
    penup()
    goto(0, 0)
    right(-angle)


def flamme2(x=0, y=0, taille=100, angle=0, couleur="orange", epaisseur=5):
    right(angle)
    pensize(epaisseur)
    pencolor(couleur)
    penup()
    goto(x, y)
    pendown()
    for i in range(floor(taille / 2)):
        forward(-i)
        forward(i)
        penup()
        left(90)
        forward(1)
        right(90)
        pendown()
    for j in range(floor(taille)):
        forward(-(floor(taille / 2) - floor(j / 2)))
        forward((floor(taille / 2) - floor(j / 2)))
        penup()
        left(90)
        forward(1)
        right(90)
        pendown()
    penup()
    goto(x, y)
    right(-angle)


def buche(x=0, y=0, taille=100, angle=0, epaisseur=20, couleur="brown"):
    right(angle)
    pencolor(couleur)
    pensize(floor(epaisseur))
    penup()
    goto(x, y)
    pendown()
    forward(taille)
    penup()
    right(-angle)
    goto(x, y)
    pendown()


# pour mettre une valeur à l'échelle
def ech(taille, x):
    return x / 150 * taille


def feu(x=0, y=0, taille=150, angle=0, couleurbuche1="#4f0000", couleurbuche2="#591909", couleurfeu1="#de910d",
        couleurfeu2="#d15000"):
    penup()
    goto(x, y)
    pendown()
    right(angle)
    epaisseur = ech(taille, 20)
    buche(x - ech(taille, 100), y - ech(taille, 10), taille, angle + 10, epaisseur, couleurbuche1)
    buche(x + ech(taille, 100), y - ech(taille, 10), -taille, angle - 10, epaisseur, couleurbuche2)
    flamme2(x - ech(taille, 35), y, floor(taille / 2), angle - 40, couleurfeu1, floor(epaisseur / 4))
    flamme(x + ech(taille, 35), y, floor(taille / 2), angle + 40, couleurfeu2, floor(epaisseur / 4))
    flamme2(x - ech(taille, 75), y, floor(taille / 4), angle - 42, couleurfeu2, floor(epaisseur / 4))
    flamme(x + ech(taille, 75), y, floor(taille / 4), angle + 42, couleurfeu1, floor(epaisseur / 4))
    flamme2(x + 0, y + 0, taille, angle - 5, couleurfeu2, floor(epaisseur / 4))
    flamme(x + 0, y + 0, taille, angle + 5, couleurfeu2, floor(epaisseur / 4))
    flamme2(x - ech(taille, 70), y + ech(taille, 60), floor(taille / 4), angle - 17, couleurfeu1, floor(epaisseur / 4))
    flamme(x + ech(taille, 70), y + ech(taille, 60), floor(taille / 4), angle + 17, couleurfeu1, floor(epaisseur / 4))


def cheminee(x=0, y=0, taille=150, angle=0, couleur1=(92 / 255, 16 / 255, 6 / 255),
             couleurbuche1=(69 / 255, 33 / 255, 25 / 255), couleurbuche2=(79 / 255, 31 / 255, 21 / 255),
             couleurfeu1=(222 / 255, 145 / 255, 13 / 255), couleurfeu2=(209 / 255, 80 / 255, 0)):
    pencolor(couleur1)
    for i in range(floor(taille / 10)):
        left(90)
        penup()
        goto(x - floor(taille / 2) + i, y)
        pendown()
        forward(taille + i)
        for j in range(2):
            right(angle + 90)
            forward(taille + j)  ## modif avant i
        penup()
        left(90)
    left(90)
    penup()
    goto(x - floor(taille / 2), y)

    forward(ech(taille, 20))
    right(angle + 90)
    pendown()
    feu(position()[0] + ech(taille, 75), position()[1], ech(taille, 60), angle, couleurbuche1, couleurbuche2,
        couleurfeu1, couleurfeu2)
    penup()


# Un bonnet de Noël par Aël D.
# ----------------------------------------------------
def bonnet(x: object = 0, y: object = 0, angle: object = 0, taille: object = 42, couleur1: object = "red", couleur2: object = (0.80859375, 0.8984375, 0.88671875)) -> object:
    right(angle)
    pencolor(couleur1)
    penup()
    goto(x, y)
    pendown()
    for j in range(taille, 0, -1):
        forward(j)
        forward(-j)
        penup()
        left(90)
        forward(1)
        right(90)
        pendown()
    left(-90)

    right(90)
    for i in range(floor(taille / 2), 0, -1):
        forward(i)
        if i == floor(taille / 2):
            x0, y0 = position()
        forward(-i)
        penup()
        left(90)
        forward(1)
        right(90)
        pendown()

    goto(x0, y0)
    pencolor(couleur2)
    pensize(floor(taille / 5))
    circle(1)
    penup()
    goto(x, y)
    right(180)
    pendown()
    forward(taille)


# Une guirlande avec des boules par Gabin P.
# ----------------------------------------------------
class Boule:
    def __init__(self, x, y, t, t_pen=1, col_boule="black", col_carre="black", col_triangle="black"):
        self.x_abs = x
        self.y_ord = y
        self.couleur_boule = col_boule
        self.couleur_carre = col_carre
        self.couleur_triangle = col_triangle
        self.taille = t
        self.taille_pen = t_pen

    def carre_boule(self):
        pensize(self.taille_pen)
        pencolor(self.couleur_carre)
        goto(self.x_abs - self.taille, self.y_ord + self.taille)
        goto(self.x_abs, self.y_ord + 2 * self.taille)
        goto(self.x_abs + self.taille, self.y_ord + self.taille)
        goto(self.x_abs, self.y_ord)
        pencolor(self.couleur_boule)

    def triangle_boule(self):
        pencolor(self.couleur_triangle)
        pensize(self.taille_pen)
        goto(self.x_abs - 0.5 * self.taille, self.y_ord + 1.5 * self.taille)
        goto(self.x_abs + self.taille, self.y_ord + self.taille)
        goto(self.x_abs - 0.5 * self.taille, self.y_ord + 0.5 * self.taille)
        goto(self.x_abs + 0 * self.taille, self.y_ord + 2 * self.taille)
        goto(self.x_abs + 0.5 * self.taille, self.y_ord + 0.5 * self.taille)
        goto(self.x_abs - self.taille, self.y_ord + self.taille)
        goto(self.x_abs + 0.5 * self.taille, self.y_ord + 1.5 * self.taille)
        goto(self.x_abs, self.y_ord)
        pencolor(self.couleur_boule)

    def affiche_boule(self):
        pencolor(self.couleur_boule)
        penup()
        goto(self.x_abs, self.y_ord)
        pendown()
        pensize(self.taille_pen)
        circle(self.taille)
        self.carre_boule()
        self.triangle_boule()
        penup()
        goto(self.x_abs - 4, self.y_ord + 2 * self.taille)
        pendown()
        goto(self.x_abs - 4, self.y_ord + 2 * self.taille + 4)
        left(90)
        circle(-4, 180)
        goto(self.x_abs + 4, self.y_ord + 2 * self.taille + 4)
        goto(self.x_abs + 4, self.y_ord + 2 * self.taille)
        setheading(0)
        penup()
        goto(self.x_abs, self.y_ord + 0.675 * self.taille)
        pendown()
        circle(self.taille * 0.32)
        penup()

    def allume_boule(self, couleur):
        penup()
        pencolor(couleur)
        goto(self.x_abs, self.y_ord + 0.675 * self.taille)
        pensize(5)
        rayon_petit_cercle = self.taille * 0.32
        goto(self.x_abs, self.y_ord + 0.675 * self.taille + 0.5 * rayon_petit_cercle)
        pensize(rayon_petit_cercle - 1)
        pendown()
        circle(0.5 * rayon_petit_cercle)
        penup()

    def eteint_boule(self):
        pencolor("white")
        goto(self.x_abs, self.y_ord + 0.675 * self.taille)
        pensize(5)
        rayon_petit_cercle = self.taille * 0.32
        goto(self.x_abs, self.y_ord + 0.675 * self.taille + 0.5 * rayon_petit_cercle)
        pensize(rayon_petit_cercle - 1)
        pendown()
        circle(0.5 * rayon_petit_cercle)
        penup()


class Guirlande:
    def __init__(self, boule):
        self.boule = boule
        self.boule_prec = None
        self.boule_suiv = None

    def ajoute_boule(self, boule):
        self.boule_suiv = Guirlande(boule)
        self.boule_suiv.boule_prec = self

    def affiche_guirlande(self):
        pendown()
        self.boule.affiche_boule()
        if type(self.boule_suiv) is not Guirlande:
            penup()
        else:
            self.boule_suiv.affiche_guirlande()

    def clignotement_guirlande(self, couleur, repetition=2):
        pendown()
        sens = 0
        temp_self = self
        while repetition != 0:
            if sens == 0:
                self.boule.allume_boule(couleur)
                temp_self = self
                self = self.boule_suiv
                for i in range(9999):
                    pass
            elif sens == 1:
                self.boule.eteint_boule()
                temp_self = self
                self = self.boule_prec

            if type(self) is not Guirlande and sens == 0:
                sens = 1
                repetition -= 1
                self = temp_self
            elif type(self) is not Guirlande and sens == 1:
                repetition -= 1
                self = temp_self
                sens = 0


# Un sapin  par Gabin P.
# ----------------------------------------------------
def sapin(x_dep, y_dep):
    penup()
    goto(x_dep, y_dep)
    pendown()
    pensize(5)
    pencolor((0.03, 0.32, 0.165))
    left(135)
    forward(22)
    left(90)
    forward(42)
    temp_guirlande = Guirlande(
        Boule(xcor(), ycor() - 20, 10, 1, (0.835, 0.627, 0.129), (0.835, 0.627, 0.129), (0.498, 0.172, 0.796)))
    left(135)
    forward(20)
    left(225)
    forward(42)
    temp_guirlande.ajoute_boule(
        (Boule(xcor(), ycor() - 20, 10, 1, (0.835, 0.627, 0.129), (0.835, 0.627, 0.129), (0.498, 0.172, 0.796))))
    left(135)
    forward(20)
    left(225)
    forward(42)
    temp_guirlande.boule_suiv.ajoute_boule(
        (Boule(xcor(), ycor() - 20, 10, 1, (0.835, 0.627, 0.129), (0.835, 0.627, 0.129), (0.498, 0.172, 0.796))))
    left(135)
    forward(62)
    penup()
    pencolor((0.325, 0.207, 0.039))
    goto(xcor() - 13, ycor())
    pendown()
    left(-90)
    forward(42)
    goto(xcor() - 5, ycor())
    left(180)
    forward(42)
    setheading(0)
    #temp_guirlande.affiche_guirlande()


# Une fenêtre par le prof, les élèves ayant choisi des items plus complexes il me restait la fenêtre !
# ----------------------------------------------------
def fenetre(x, y, longueur=90, hauteur=80, epaisseur=5, couleur=(155 / 256, 114 / 256, 49 / 256)):
    penup()
    goto(x, y)
    pendown()
    pensize(epaisseur)
    pencolor(couleur)
    for _ in range(2):
        left(90)
        forward(hauteur)
        left(90)
        forward(longueur)
    left(180)
    forward(longueur // 2)
    right(90)
    forward(hauteur)
    setheading(0)


# Une haltère par Marius L.
# ----------------------------------------------------
def poids(l, Largeur):
    for i in range(2):
        forward(l)
        left(90)
        forward(Largeur)
        left(90)


def depart(depassement, l):
    left(180)
    forward(depassement)
    penup()
    left(90)
    forward(l)
    right(90)
    forward(l - l / 3)
    pendown()
    left(180)


def haltere(l, Largeur, depassement, barre, taille, coord1, coord2):
    pencolor((0.42, 0.42, 0.42))
    pensize(taille)
    penup()
    goto(coord1, coord2)
    pendown()
    depart(depassement, l)
    poids(l - l / 3, Largeur / 2)
    left(90)
    forward(l)
    left(180)
    forward(Largeur / 2)
    right(90)
    forward(l)
    left(180)
    poids(l, Largeur)
    penup()
    left(90)
    forward(Largeur / 2)
    pendown()
    left(90)
    forward(barre)
    penup()
    forward(l)
    pendown()
    penup()
    left(90)
    forward(Largeur / 2)
    left(90)
    pendown()
    poids(l, Largeur)
    penup()
    left(90)
    forward(Largeur - l)
    left(90)
    pendown()
    poids(l - l / 3, Largeur / 2)
    penup()
    forward(l - l / 3)
    left(90)
    forward(l)
    right(90)
    pendown()
    forward(depassement)
    setheading(0)


# Par Lili G.
# ----------------------------------------------------
def mug(x, y, longueur, epaisseur, couleur, couleur2):
    penup()
    speed(100)
    pensize(epaisseur)
    pencolor(couleur)
    goto(x, y)
    pendown()
    v = epaisseur / 2
    while v < longueur * 0.66:
        for i in range(2):
            forward(longueur * 0.66 - v)
            left(90)
            forward(longueur - v)
            left(90)
        v += epaisseur / 2
    penup()
    x += longueur * 0.8
    y += longueur * 0.33
    goto(x, y)
    pendown()
    left(45)
    circle(longueur / 3)
    right(45)
    penup()
    x -= longueur * 0.8
    y = y - longueur * 0.33 + longueur
    x += longueur / 12
    y -= longueur / 3
    pencolor(couleur2)
    goto(x, y)
    pendown()
    for i in range(5):
        forward(longueur / 2)
        right(144)


hideturtle()

def trace_boule_complet():
    guirlande_tout = Guirlande(Boule(145.745, 35.857 - 20, 10, 1, (0.835, 0.627, 0.129), (0.835, 0.627, 0.129), (0.498, 0.172, 0.796)))
    guirlande_tout.ajoute_boule(Boule(136.046, 6.159 - 20, 10, 1, (0.835, 0.627, 0.129), (0.835, 0.627, 0.129), (0.498, 0.172, 0.796)))
    guirlande_tout.boule_suiv.ajoute_boule(Boule(126.348, -23.539 - 20, 10, 1, (0.835, 0.627, 0.129), (0.835, 0.627, 0.129), (0.498, 0.172, 0.796)))
    guirlande_tout.boule_suiv.boule_suiv.ajoute_boule(Boule(-60, 55, 15, 1, (0.835, 0.627, 0.129), (0.835, 0.627, 0.129), (0.498, 0.172, 0.796)))
    guirlande_tout.boule_suiv.boule_suiv.boule_suiv.ajoute_boule(Boule(-20, 50, 15, 1, (0.835, 0.627, 0.129), (0.835, 0.627, 0.129), (0.498, 0.172, 0.796)))
    penup()
    goto(-60, 95)
    pendown()
    pensize(1)
    pencolor("black")
    left(-90)
    circle(21, 180)
    setheading(0)
    guirlande_tout.affiche_guirlande()
    guirlande_tout.clignotement_guirlande((154 / 255, 76 / 255, 159 / 255), 42)


# Propositions non retenue
# ----------------------------------------------------
"""
Parfois les élèves ont rendu un dessin non paramétrable, que l'on ne peut pas redimensionner.
Ils ont participé leur production n'a juste pas été sélectionné pour le dessin final.
"""
# Marie L. : Le doudou chien & Le sapin de Noël
# Baptiste M : Des boules de noël et un bonhomme de Neige
# Thomas V. : Une fleur, une voiture
# Raphaël M : Une carte mère d'ordinateur
# Margot S. : Des livres multicolores fermés
# Maxence H. : Yin-Yang
# Adam Y. : Une chausette de Noël


# Assemblage final
# ----------------------------------------------------
"""
Plusieurs secondes sont requises pour réaliser l'assemblage final.
En plus du fichier .py, vous ont été fourni :
- Une capture d'écran du rendu final
- Une vidéo de la construction sur une calculatrice Casio Graph 90+E
- Une vidéo de la scène finale
"""

bdn(91, -25, 20, 11, "black", "orange", "non")
flocon(60, 70, 5, 3, 1, 0, (2 * 42 / 255, 5 * 42 / 255, 242 / 255))
flocon(107, 80, 3, 3, 1, 0, (4 * 42 / 255, 5 * 42 / 255, 242 / 255))
flocon(117, 55, 3, 3, 1, 0, (3 * 42 / 255, 4 * 42 / 255, 242 / 255))
flocon(75, 40, 5, 3, 1, 0, (4 * 42 / 255, 3 * 42 / 255, 242 / 255))
flocon(50, 20, 3, 3, 1, 0, (4 * 42 / 255, 4 * 42 / 255, 242 / 255))
fenetre(124, 12)
cheminee(-145, -35, 75)
bougie_finale(-145, 48, 10, 10)
bonnet(-80, 0, 0, 42 - 12)
sapin(191, 50)
etoile(160, 80, 10, 4)
cadeauf(140, -75, 32, 2, (204 / 255, 164 / 255, 59 / 255), (154 / 255, 76 / 255, 159 / 255),
        (154 / 255, 76 / 255, 159 / 255))
cadeauf(128, -87, 24, 2, (204 / 255, 164 / 255, 59 / 255), (7 / 255, 113 / 255, 135 / 255),
        (7 / 255, 113 / 255, 135 / 255))
cadeauf(155, -92, 20, 2, (204 / 255, 164 / 255, 59 / 255), (196 / 255, 73 / 255, 0 / 255),
        (196 / 255, 73 / 255, 0 / 255))
cadeau(-170, -90, 25, 2, (154 / 255, 76 / 255, 159 / 255), (2 * 42 / 255, 2 * 42 / 255, 2 * 42 / 255),
       (204 / 255, 164 / 255, 59 / 255))
haltere(10, 40, 5, 50, 5, -35, -70)
mug(50, -90, 50, 4, (157 / 255, 92 / 255, 99 / 255), (214 / 255, 227 / 255, 248 / 255))
montre(0, -60, 42 - 2, 11, "grey", "black", "black")
trace_boule_complet()

hideturtle()
