from Outils import Arbre
from Outils.Arbre import *
from Outils.Moteur_de_jeu import Joueur
from Outils.Moteur_de_jeu.Joueur import *
import math


def distance_bord (position) :
    return (min (position[0], 9-position[0]))

def lin_tout (plateau, num, cdistance, cbarrieres, cbord) :
    """on considère les coefficients associés à l'importance des barrières/...
    et on les affecte 'linéairement'"""
    b_num = plateau.barrieres_restantes[num]
    b_opp = plateau.barrieres_restantes[1-num]
    distance_num = plateau.longueur_chemin(num)
    distance_opp = plateau.longueur_chemin(1-num)
    dist_bord_num = distance_bord (plateau.pions[num])
    dist_bord_opp = distance_bord (plateau.pions[1-num])
    valeur_dist = cdistance*(distance_opp-distance_num)
    valeur_b = cbarrieres*(b_opp - b_num)
    valeur_bord = cbord*(dist_bord_opp-dist_bord_num)
    v = valeur_dist + valeur_b + valeur_bord
    return (v)


def lineaire_basique (cdistance, cbarrieres, cbord) :
    return (lambda bn, bo, dn, do, dbn, dbo : cdistance*(do-dn) + cbarrieres*(bo - bn) + cbord*(dbo-dbn))

def lineaires () :
    fonctions_lineaires = numpy.zeros (1000)
    for i in range (0, 10) :                #associé à cdistance = i ici
        for j in range (0, 10) :            #associé à cbarrieres = j*j ici
            for k in range (0, 10) :        #associé à cbord = sqrt k ici
                l = 100*i + 10*j + k
                fonctions_lineaires[l] = lineaire_basique (i+1, (j+1)*(j+1), math.sqrt(k+1))
    return (fonctions_lineaires)


"""on a 1000 fonctions"""

                
def expo_basique_coefs_internes (cdistance, cbarrieres, cbord) :
    return (lambda bn, bo, dn, do, dbn, dbo : math.exp(cdistance*do) - math.exp(cdistance*dn) + math.exp(cbarrieres*bo) - math.exp(cbarrieres*bn) + math.exp(cbord*dbo) - math.exp(cbord*dbn))

def exponentielles_coefs_dans_lexpo () :
    fonctions_expo1 = numpy.zeros (125)
    for i in range (0, 5) :                
        for j in range (0, 5) :            
            for k in range (0, 5) :        
                l = 25*i + 5*j + k
                fonctions_expo1[l] = expo_basique_coefs_internes ((i+1)/2, (j+1), 0.2*(k+1))
    return (fonctions_expo1)

"""on a 125 fonctions"""

def expo_basique_coefs_doubles (cdistance, cbarrieres, cbord) :
    return (lambda bn, bo, dn, do, dbn, dbo : cdistance*math.exp(cdistance*do) - cdistance*math.exp(cdistance*dn) + cbarrieres*math.exp(cbarrieres*bo) - cbarrieres*math.exp(cbarrieres*bn) + cbord*math.exp(cbord*dbo) - cbord*math.exp(cbord*dbn))


def exponentielles_coefs_doubles () :
    fonctions_expo2 = numpy.zeros (125)
    for i in range (0, 5) :                
        for j in range (0, 5) :            
            for k in range (0, 5) :        
                l = 25*i + 5*j + k
                fonctions_expo2[l] = expo_basique_coefs_doubles ((i+1)/3, (j+1), 0.15*(k+1))
    return (fonctions_expo2)

"""on a 125 fonctions"""

#test = lambda x : x*5

#test2 = lambda x,y : x*5 + y

#print (test2 (1, 2))

def lois_en_puissance (cdistance, cbarrieres, cbord) :
    return (lambda bn, bo, dn, do, dbn, dbo : do**cdistance - dn**cdistance + bo**cbarrieres - bn**cbarrieres + dbo**cbord - dbn**cbord)


def puissances () :
    fonction_puissance1 = numpy.zeros (1000)
    for i in range (0, 10) :                
        for j in range (0, 10) :            
            for k in range (0, 10) :        
                l = 100*i + 10*j + k
                fonctions_puissance1[l] = lois_en_puissance (i, j, k)
    return (fonctions_puissance1)


"""1000 fonctions"""