import random
def afficher_plateau(n):
    '''
    La fonction affiche le plateau du jeu, sous forme de d'allumettes/batonnets
    n est un int inférieur ou égal à 20
    '''
    assert n <= 20, 'Entrez un nombre inferieur ou égale à 20'
    assert type(n) == int, 'Entrez un nombre entier'
    print(' | '*n)
    
def enregistrer_joueur():
    '''
    La fonction enregistre les joueurs et les place de façon aléatoirement dans un tuple, le joueur en premiere position commence la partie.
    joueur1 = str
    joueur2 = str
    '''
    joueur1=str(input("Prénom du joueur 1:"))
    joueur2=str(input("prénom du joueur 2:"))
    tuple_register=()
    x=random.randint(0,1)
    if x == 0:
        return tuple_register + (joueur1, joueur2)
    else:
        return tuple_register + (joueur1, joueur2)
    
def coup_possible(n,x):
    '''
    La fonction va renvoyer Vrai (True) si le coup que veut effectuer le joueur est possible sinon elle renvoie Faux (False)
    n int inférieur ou égale à 20
    x int compris entre 1 et 3 
    '''
    assert x >= 1 and x <= 3, 'Entrez un nombre entier compris entre 1 et 3'
    assert n <= 20, 'Entrez un nombre inférieur ou égale à 20'
    assert type(n) == int, 'Entrez un nombre entier'
    assert type(x) == int, 'Entrez un nombre entier'
    if 1 <= x <=3:
        while n-x >=0:
            return True
        else:
            return False
    else:
        return False
    
def jouer_humain():
    tuple_joueurs = enregistrer_joueur()
    print('Voici le plateau, il y a 20 allumettes \n')
    allumettes = 20
    joueur_actuel = 0 # 0 = joueur 1 et 1 = joueur 2
    premier_passage = True
    afficher_plateau(allumettes)
    print("")
    while allumettes != 0:
        if premier_passage == True: 
            premier_passage = False
        else:
            if joueur_actuel == 0:
                joueur_actuel = 1
            else:
                joueur_actuel = 0
        entree_valide = False
        while entree_valide == False:
            print("C'est à " + str(tuple_joueurs[joueur_actuel]) + " de jouer.")
            q_joueur = int(input("Combien d'allumettes voulez-vous retirer? (entre 1 et 3) : "))
            if coup_possible(allumettes,q_joueur) == True:
                
                entree_valide = True
                allumettes = allumettes - q_joueur
                if allumettes == 0:
                    if joueur_actuel == 0:
                        gagnant = 1
                    else:
                        gagnant = 0
                    print(str(tuple_joueurs[joueur_actuel]) + " a pris la/les dernière(s) allumette(s). Le jeu s'arrête et " + str(tuple_joueurs[gagnant]) + " gagne la partie.")
                else:
                    print(str(q_joueur) + " allumette(s) a/ont été retirée(s). Il reste donc " + str(allumettes) + " allumettes : ")
                    afficher_plateau(allumettes)
            else:
                print("Votre entrée est incorrecte, réessayez à nouveau")  
            
def enregistrer_humain_avec_machine():
    joueur = str(input("Quel est le nom du joueur? "))
    ordi = 'Natacha'           
    tuple_register = ()
    x = random.randint(0,1)
    if x == 0:
        return tuple_register + (joueur,ordi)
    else:
        return tuple_register + (ordi,joueur) 

    
def jouer_humain_machine():
    tuple_joueurs = enregistrer_humain_avec_machine()
    joueur_o_j = "joueur"
    print('Voici le plateau, il y a 20 allumettes \n')
    allumettes = 20
    joueur_actuel = 0 # 0 = joueur 1 et 1 = joueur 2
    premier_passage = True
    afficher_plateau(allumettes)
    print("")
    while allumettes != 0:
        if premier_passage == True: 
            premier_passage = False
        else:
            if joueur_actuel == 0:
                joueur_actuel = 1
            else:
                joueur_actuel = 0
        if tuple_joueurs[joueur_actuel] == "Natacha":
            joueur_o_j = "ordi"
        else:
            joueur_o_j = "joueur"
        if joueur_o_j == "joueur":
            entree_valide = False
            while entree_valide == False:
                print("C'est à " + str(tuple_joueurs[joueur_actuel]) + " de jouer.")
                q_joueur = int(input("Combien d'allumettes voulez-vous retirer? (entre 1 et 3) : "))
                if coup_possible(allumettes,q_joueur) == True:
                    entree_valide = True
                    allumettes = allumettes - q_joueur
                    if allumettes == 0:
                        if joueur_actuel == 0:
                            gagnant = 1
                        else:
                            gagnant = 0
                        print(str(tuple_joueurs[joueur_actuel]) + " a pris la/les dernière(s) allumette(s). Le jeu s'arrête et " + str(tuple_joueurs[gagnant]) + " gagne la partie.")
                    else:
                        print(str(q_joueur) + " allumette(s) a/ont été retirée(s). Il reste donc " + str(allumettes) + " allumettes : ")
                        afficher_plateau(allumettes)
                else:
                    print("Votre entrée est incorrecte, réessayez à nouveau")
        else:
            print("C'est à " + str(tuple_joueurs[joueur_actuel]) + " de jouer.")
            if allumettes >= 3:
                q_ordi = random.randint(1,3)
            else:
                q_ordi = random.randint(1,allumettes)
            print("Combien d'allumettes voulez-vous retirer? (entre 1 et 3) : " + str(q_ordi))
            allumettes = allumettes - q_ordi
            if allumettes == 0:
                if joueur_actuel == 0:
                    gagnant = 1
                else:
                    gagnant = 0
                    print(str(tuple_joueurs[joueur_actuel]) + " a pris la/les dernière(s) allumette(s). Le jeu s'arrête et " + str(tuple_joueurs[gagnant]) + " gagne la partie.")
            else:
                print(str(q_ordi) + " allumette(s) a/ont été retirée(s). Il reste donc " + str(allumettes) + " allumettes : ")
                afficher_plateau(allumettes)
                
def jouer_humain_machine_intelligente():
    tuple_joueurs = enregistrer_humain_avec_machine()
    joueur_o_j = "joueur"
    print('Voici la plateau, il y a 20 allumettes \n')
    allumettes = 20 
    joueur_actuel = 0 # 0 = joueur 1 et 1 = joueur 2
    premier_passage = True
    afficher_plateau(allumettes)
    print("")
    while allumettes != 0:
        if premier_passage == True: 
            premier_passage = False
        else:
            if joueur_actuel == 0:
                joueur_actuel = 1
            else:
                joueur_actuel = 0
        if tuple_joueurs[joueur_actuel] == "Natacha":
            joueur_o_j = "ordi"
        else:
            joueur_o_j = "joueur"
        if joueur_o_j == "joueur":
            entree_valide = False
            print("C'est à " + str(tuple_joueurs[joueur_actuel]) + " de jouer.")
            while entree_valide == False:
                q_joueur = int(input("Combien d'allumettes voulez-vous retirer? (entre 1 et 3) : "))
                if coup_possible(allumettes,q_joueur) == True:
                    entree_valide = True
                    allumettes = allumettes - q_joueur
                    if allumettes == 0:
                        if joueur_actuel == 0:
                            gagnant = 1
                        else:
                            gagnant = 0
                        print(str(tuple_joueurs[joueur_actuel]) + " a pris la/les dernière(s) allumette(s). Le jeu s'arrête et " + str(tuple_joueurs[gagnant]) + " gagne la partie.")
                    else:
                        print(str(q_joueur) + " allumette(s) a/ont été retirée(s). Il reste donc " + str(allumettes) + " allumettes :")
                        afficher_plateau(allumettes)
                else:
                    print("Votre entrée est incorrecte, veuillez réessayer.")
        elif joueur_o_j == "ordi":
            if allumettes > 17:
                nb_batons_ordi = allumettes - 17
            elif allumettes > 13 and allumettes <= 16:
                nb_batons_ordi = allumettes - 13
            elif allumettes > 9 and allumettes <= 12:
                nb_batons_ordi = allumettes - 9
            elif allumettes > 5 and allumettes <= 8:
                nb_batons_ordi = allumettes - 5
            elif allumettes > 1 and allumettes <= 4:
                nb_batons_ordi = allumettes - 1
            else:
                nb_batons_ordi = 1
            print("C'est au tour de l'ordinateur de jouer. Il choisit une valeur entre 1 et 3 : " + str(nb_batons_ordi))
            if coup_possible(allumettes,nb_batons_ordi) ==  True: # impossible coup_possible != True sauf si exploitation
                allumettes = allumettes - nb_batons_ordi
                if allumettes == 0:
                    if joueur_actuel == 0:
                        gagnant = 1
                    else:
                        gagnant = 0
                    print(tuple_joueurs[joueur_actuel] + " a pris la/les derniere(s) allumette(s). Le jeu s'arrête et " + str(tuple_joueurs[gagnant]) + " gagne la partie.")
                else:
                    print(str(nb_batons_ordi) + " allumette(s) ont/a été retiré(s). Il reste donc " + str(allumettes) + " allumette(s) :")
                    afficher_plateau(allumettes)    
                            

def menu():
    reponse = 0
    while reponse == 0:
        print("------------------------------------")
        print("       Jeu des allumettes")
        print("------------------------------------")
        print("\n 1) Jeu -> Joueur contre Joueur")
        print(" 2) Jeu -> Joueur contre Ordinateur")
        print(" 3) Jeu -> Joueur contre Ordinateur intelligent")
        reponse = int(input(" => Choix : ")) # doit etre de type entier
        if int(reponse) == 1:
            print("\n Début du jeu joueur contre joueur.\n\n")
            jouer_humain()
            reponse = 1
        elif int(reponse) == 2:
            print("\n Début du jeu joueur contre ordinateur.\n\n")
            jouer_humain_machine()
            reponse = 1
        elif int(reponse) == 3:
            print("\n Début du jeu joueur contre ordinateur intelligent.\n\n")
            jouer_humain_machine_intelligente()
            reponse = 1
        else:
            print("\n L'entrée n'est pas valide, veuillez réesayer.\n")

menu()