import random
import matplotlib.pyplot as plt

def effectif_initial(nom_allele):
    effectif=input("Combien d'allèles %s à la génération 0 ? " % nom_allele)
    effectif=int(effectif)
    return effectif

def nombre_generations_initial():
    nombre=input("Sur combien de générations souhaitez-vous étudier l'évolution des différents allèles dans cette population ? ")
    nombre=int(nombre) 
    return nombre

def effectif_generation_suivante(effectif):
    nouvel_effectif=0
    for i in range(1,effectif+1):
        nouvel_effectif=nouvel_effectif+random.randint(0,2)
    return nouvel_effectif
    
def trace_points(effectifA,effectifB,effectifO,n):
    effectif_total=effectifA+effectifB+effectifO
    plt.plot([n],[100*effectifA/effectif_total],'b.')
    plt.plot([n],[100*effectifB/effectif_total],'g.')
    plt.plot([n],[100*effectifO/effectif_total],'r.')
    
def afficher_graphique(n):
    plt.axis([0,n,0,100])
    plt.grid()
    plt.show()
    
def affichage_effectifs(n,effectifA,effectifB,effectifO):
    print("Après %s générations, l'effectif de l'allèle A est %s, l'effectif de l'allèle B est %s et l'effectif de l'allèle O est %s." % (n,effectifA,effectifB,effectifO))



#Saisie par l'utilisateur des effectifs des porteurs de chacun des trois allèles et du nombre de générations sur lequel porte l'étude

effectif_alleleA=effectif_initial("A")
effectif_alleleB=effectif_initial("B")
effectif_alleleO=effectif_initial("O")
nombre_generations=nombre_generations_initial()


#Placement des points du graphique correspondants aux fréquences de chaque allèle dans la population de départ c'est-à-dire de coordonnées (0;fréquence_alleleA), (0;fréquence_alleleB) et (0;fréquence_alleleO)

trace_points(effectif_alleleA,effectif_alleleB,effectif_alleleO,0)

#Calculs des effectifs de chaque génération et placement des points correspondants

#Attention quand i=0, on est à la génération 1 ; quand i=1 on est à la génération 2 ; ... ; 
#quand i=nombre_generations-1 (le dernier) on est à la génération nombre_generations

for i in range(0,nombre_generations):
    effectif_alleleA=effectif_generation_suivante(effectif_alleleA)
    effectif_alleleB=effectif_generation_suivante(effectif_alleleB)
    effectif_alleleO=effectif_generation_suivante(effectif_alleleO)
    trace_points(effectif_alleleA,effectif_alleleB,effectif_alleleO,i+1)
    
#Affichage du nuage de points

afficher_graphique(nombre_generations)

#Affichage des effectifs finaux

affichage_effectifs(nombre_generations,effectif_alleleA,effectif_alleleB,effectif_alleleO)
