def choisieCoup(jeu):
    """ jeu -> coup
		Choisi le coup qui rapportera le plus de score
	"""
    # test tous les coups possibles avec une copie du jeu
    meilleur_score = 0
    jeu_test = game.getCopieJeu(jeu)
    joueur = game.getJoueur(jeu)
    for c in jeu.coups_possibles:
        game.joueCoup(jeu_test, c)
        if (game.getScore(jeu_test, joueur) >= meilleur_score):
            meilleur_score = game.getScore(jeu_test, joueur)
            meilleur_coup = c
        jeu_test = game.getCopieJeu(jeu)
    return meilleur_coup
def estimation(jeu, coup, p):
    global nbNoeuds
    nbNoeuds+=1

    copie = game.getCopieJeu(jeu)

    game.joueCoup(copie,coup)
    if game.finJeu(jeu):
        g=game.getGagnant(jeu)
        if g == moi:#si c'est moi le vainqueur alors estimation élevée
            return 12345
        else:
            if g == 0:#si c'est nul alors estimation moyenne
                return -123
            else:#pire cas estimation faible
                return -12345
    if p >= prof:
        liste_parcoursPlat= parcoursPlateau(jeu)
        return evaluation(copie,liste_parcoursPlat)
    
    coupsV=game.getCoupsValides(copie)
    mValue=0
    for c in coupsV:
        est =estimation(copie,c,p+1)
        if p%2 == 0:#MAX
            if est >= mValue:
                mValue= est
        else:#MIN
            if est <=mValue:
                    mValue = est
    return mValue
Beispiel #3
0
def joueplsr():
    nbrepartie = 0
    j1 = 0
    j2 = 0
    eg = 0
    tj1 = 0
    tj2 = 0
    tt = time.time()

    while (nbrepartie < NBPARTIE):
        if (nbrepartie == (NBPARTIE / 2)):
            global joueur2
            global joueur1

            print("score mi-temps(" + str(nbrepartie) + " partie):\nj1: " +
                  str(j1) + " \nscore j2: " + str(j2) + "\nnb d'equalite : " +
                  str(eg) + "\n")
            s = joueur1
            joueur1 = joueur2
            joueur2 = s
            a = j1
            j1 = j2
            j2 = a

            a = tj1
            tj1 = tj2
            tj2 = a

        jeu = game.initialiseJeu()
        it = 0

        while ((it < 100) and (not (game.finJeu(jeu)))):
            if (it < 4):
                coup = Random.saisieCoup(game.getCopieJeu(jeu))
                game.joueCoup(jeu, coup)
            else:
                t1 = time.time()
                coup = saisieCoup(jeu)
                if game.getJoueur(jeu) == 1:
                    tj1 += time.time() - t1
                else:
                    tj2 += time.time() - t1
                game.joueCoup(jeu, coup)
            it += 1
        g = game.getGagnant(jeu)
        tj1 = tj1 / it
        tj2 = tj2 / it

        if (g == 1):
            j1 += 1
        if (g == 2):
            j2 += 1
        if (g == 0):
            eg += 1
        nbrepartie += 1

    tt = time.time() - tt
    print("score final :\nj1: " + str(j2) + "temps/coup=" + str(tj2) +
          "\nj2: " + str(j1) + "temps/coup=" + str(tj2) +
          "\nnb d'equalite : " + str(eg))
def estimation(jeu, coup, prf, joueur):
    game.joueCoup(jeu, coup)
    #L= game.getCoupsValides(jeu)
    if game.finJeu(jeu):
        g = game.getGagnant(jeu)
        if g == joueur:
            return 100000
        elif g == 0:
            return -100
        else:
            return -100000
    elif prf >= 2:
        return evaluation(jeu, coup, joueur)

    else:
        L = game.getCoupsValides(jeu)
        m = []
        for i in L:
            jeu2 = game.getCopieJeu(jeu)
            #game.joueCoup(jeu2,i)
            m.append(estimation(jeu2, i, prf + 1, joueur))

        if game.getJoueur(jeu) == joueur:
            return max(m)
        else:
            return min(m)
Beispiel #5
0
def saisieCoupSimuMin(profondeur, jeu, coup):
    """ jeu -> coup
	Retourne un coup a jouer aleatoire 
	"""
    game.joueCoup(jeu, coup)

    if profondeur == 0:
        return eval(jeu)

    valides = game.getCoupsValides(jeu)

    if game.finJeu(jeu):

        return eval(jeu)

    else:

        global joueur

        imin = 0
        mini = 1000

        for i in range(len(jeu[2])):

            score = saisieCoupSimuMax(profondeur - 1, game.getCopieJeu(jeu),
                                      jeu[2][i])

            if score < mini:

                mini = score
                imin = i

    return jeu[2][imin]
Beispiel #6
0
def estimation(jeu, coup, p):
    global nbNoeuds
    nbNoeuds += 1
    copie = game.getCopieJeu(jeu)
    game.joueCoup(copie, coup)
    if game.finJeu(jeu):
        g = game.getGagnant(jeu)
        if g == moi:
            return 100000
        else:
            if g == 0:
                return -100
            else:
                return -100000
    if p == prof:
        l = parcoursPlateau(jeu)
        return evaluation(copie, l)
    cp = game.getCoupsValides(copie)
    m = 0
    for c in cp:
        s = estimation(copie, c, p + 1)
        if p % 2 == 0:
            if s >= m:
                m = s
        else:
            if s <= m:
                m = s
    return m
Beispiel #7
0
def manger (jeu,coup):
    """
    jeu*coup->jeu
    mange les graines de l'adversaire si c'est possible et renvoie le jeu modifie
    """
    
    jeu_bis=game.getCopieJeu(jeu)
    case_val = game.getCaseVal(jeu,coup[0],coup[1])

    while (case_val== 2) or (case_val== 3) and jeu[0][1]==game.getAdversaire(jeu)-1 :
    	#print "valeur de la case a manger  : {}, coordonnees {}".format(case_val, coup)
        jeu[4][jeu[1]-1] += case_val #mise a jour du score
        #print "score : {}".format (jeu[4][jeu[1]-1])
        #game.setCaseVal(jeu_bis, coup_bis[0], coup_bis[1],0)
        jeu[0][coup[0]][coup[1]] = 0
        #print "case mangee?  : {}, coordonnees {}".format(jeu[0][coup[0]][coup[1]], coup)
        if coup[0]==0 : #cas ou le joueur 2 mange
            if coup[1]<5:
                coup[1]+=1
        else : #cas ou le joueur 1 mange
            if coup [1]>0:
                coup[1]-=1
        case_val = game.getCaseVal(jeu,coup[0],coup[1])
        #print "valeur de la nouvelle case a manger  : {}, coordonnees {}".format(case_val, coup) 
    
    if estAffame(jeu, game.getAdversaire(jeu)) :
        #print "on n'a pas pu manger"
        for i in range(5):
            jeu[i]=jeu_bis[i]
Beispiel #8
0
def estimation(jeu, coup, p):
    global nombreDeNoeuds
    nombreDeNoeuds += 1
    copie = game.getCopieJeu(jeu)
    game.joueCoup(copie, coup)
    if game.finJeu(copie):
        g = game.getGagnant(copie)
        if g == moi:  #si c'est moi le vainqueur alors estimation élevée
            return 12345
        else:
            if g == 0:  #si c'est nul alors estimation moyenne
                return -123
            else:  #pire cas estimation faible
                return -12345
    if p >= prof:
        #max profondeur donc on evalue
        return evaluation(jeu, copie)
    else:
        coupsV = game.getCoupsValides(copie)
        mValue = 0
        for c in coupsV:
            est = estimation(copie, c, p + 1)
            if p % 2 == 0:  #MAX
                if est >= mValue:
                    mValue = est
            else:  #MIN
                if est <= mValue:
                    mValue = est

    return mValue
Beispiel #9
0
def CoupMin(profondeur, jeu, coup):
    """ jeu -> coup
    Retourne un coup a jouer aleatoire
    """
    game.joueCoup(jeu, coup)
    valides = game.getCoupsValides(jeu)

    if profondeur == 0 or game.finJeu(jeu):
        return eval(jeu)

    else:

        global Alpha
        global Beta

        score = 10000

        for i in range(len(jeu[2])):

            score = min(
                score, CoupMax(profondeur - 1, game.getCopieJeu(jeu),
                               jeu[2][i]))

            if score <= Alpha:

                return score

            Beta = min(Beta, score)

    return score
def getCoupsValides(jeu):
    """jeu -> List[coup]
		retourne la liste des coups valide a partir du plateau du jeu awele
	"""
    liste_coups_valides = []
    camp_joueur = jeu.joueur - 1
    # Boucle qui parcourt chaque trou du joueur qui va jouer
    for t in range(colonnes):
        # Si il y a des graines
        if (jeu.plat.plateau[camp_joueur][t] > 0):
            # test si le coup affame l'autre joueur
            jeu_test = game.getCopieJeu(jeu)
            Coup = game.coup(camp_joueur, t)
            updatePlateauScore(jeu_test, Coup)
            game.changeJoueur(jeu_test)
            LautreCamp = jeu_test.joueur - 1
            C = 0
            compteur = 0
            while (C < colonnes and jeu_test.plat.plateau[LautreCamp][C] == 0):
                compteur += 1
                C += 1
            # si il ne l'affame pas alors c'est un coup valide
            if (compteur != colonnes):
                liste_coups_valides.append(Coup)
    return liste_coups_valides

    #def finJeu(jeu):
    """ jeu -> bool
		Retourne vrai si c'est la fin du jeu
    	"""
    #test si un des deux camps n'est pas vide
    """res = [0,0]
Beispiel #11
0
def saisieCoup(jeu):
    """ jeu -> coup
	Retourne un coup a jouer aleatoire 
	"""
    global joueur
    joueur = jeu[1]

    maxi = -10000
    imax = 0

    score = -10000
    leftest = True

    for i in range(len(jeu[2])):

        score = CoupMin(5, game.getCopieJeu(jeu), jeu[2][i], leftest)

        leftest = False

        if score > maxi:

            maxi = score
            imax = i

    return jeu[2][imax]
Beispiel #12
0
def CoupMax(profondeur, jeu, coup, leftest):
    """ jeu -> coup
	Retourne un coup a jouer aleatoire 
	"""
    game.joueCoup(jeu, coup)

    valides = game.getCoupsValides(jeu)

    if game.finJeu(jeu) or profondeur == 0:

        return eval(jeu, coup, leftest)

    else:

        global Alpha
        global Beta

        score = -10000
        leftest = True

        for i in range(len(jeu[2])):

            score = max(
                score,
                CoupMin(profondeur - 1, game.getCopieJeu(jeu), jeu[2][i],
                        leftest))
            leftest = False

            if score >= Beta:

                return score

            Alpha = max(Alpha, score)

    return score
def estimation(jeu,coup,prof):
    """ jeu * coup * prof -> number
        Estime la valeur d'un coup
    """
    
    global nbNoeuds
    
    nbNoeuds+=1
    copie=game.getCopieJeu(jeu)
    game.joueCoup(copie,coup)
    
    if(game.finJeu(copie)):
        #A Completer
        
    return evaluation(copie)

    
def evaluation(jeu):
    """ jeu->number
        evalue une situation de jeu pour le joueur moi
    """
    l=getEvals(jeu)
    return dotProduct(l,params)
    

def dotProduct(l1,l2):
    #A Completer
    

def getEvals(jeu):
    return [evalScores(jeu),evalPos(jeu)]

def evalScores(jeu):
    """ jeu -> List[number}
        evalue une situation de jeu en faisant la difference entre le score de moi et le score de l'adversaire
    """
    autre=moi%2+1
    sc=game.getScores(jeu)
    return sc[moi-1]-sc[autre-1]


def evalPos(jeu):
    diffExtr = 0
    
    p = 0.8
    plateau=game.getPlateau(jeu)
    j1=0
    j2=0
    ligne=plateau[0]
    ligne2=plateau[1]
    for i in range(6):
        j1 += p * ligne[i]
        j2 += p * ligne2[-i-1]
        p-=0.1

    diffExtr=j1-j2
    if(moi==2):
       diffExtr=-diffExtr
       
    return diffExtr
Beispiel #14
0
def saisieCoupSimuMax(profondeur, jeu, coup):
    """ jeu -> coup
    Retourne un coup a jouer aleatoire
    """
    game.joueCoup(jeu, coup)
    valides = game.getCoupsValides(jeu)

    if profondeur == 0 or game.finJeu(jeu):
        return eval(jeu)
    else:

        global joueur

        maxi = -1000

        for i in range(len(jeu[2])):

            score = saisieCoupSimuMin(profondeur - 1, game.getCopieJeu(jeu),
                                      jeu[2][i])

            if score > maxi:

                maxi = score

    return maxi
Beispiel #15
0
def estimation(jeu, coup, p):
    #retourne le score d'utilite pour un coup donne
    copie = game.getCopieJeu(jeu)
    game.joueCoup(copie, coup)
    if game.finJeu(copie):
        g = game.getGagnant(copie)
        if g == moi:
            return 100000000
        else:
            if g == 0:
                return -500
            else:
                return -100000000

    if p == prof:
        return evaluation(copie)

    if p < prof:
        coups = game.getCoupsValides(copie)
        max_min = estimation(copie, coups[0], p + 1)
        for c in coups[1:]:
            s = estimation(copie, c, p + 1)
            if p % 2 == 0 and s > max_min:
                max_min = s
            if p % 2 != 0 and s < max_min:
                max_min = s
        return max_min
def decision(jeu, ev):
    joueur = game.getJoueur(jeu)
    L = game.getCoupsValides(jeu)
    J = []
    alpha = -5000000
    beta = 5000000
    challenger = 0

    i = 0
    if (joueur == 1):
        i = len(L) - 1
    ok = 0
    while (ok == 0):
        l = estimation(game.getCopieJeu(jeu), L[i], 1, joueur, alpha, beta, ev)
        if (l > alpha):
            alpha = l
            challenger = i
        if (joueur == 1):
            i -= 1
            if (i < 0):
                ok = 1
        else:
            i += 1
            if (i >= len(L)):
                ok = 1
        #J.append(l)
        #jeu2=game.getCopieJeu(jeu)

    #while i< len (J):
    #    if(J[challenger]<J[i]):
    #        challenger=i
    #    i=i+1

    return L[challenger]
def estimation(jeu, coup, p, a, b):
    copie = game.getCopieJeu(jeu)
    game.joueCoup(copie, coup)
    if game.finJeu(copie):
        g = game.getGagnant(copie)
        if g == moi:
            return 12345
        else:
            if g == 0:
                return -123
            else:
                return -12345
    if p == prof:
        return evaluation(copie)
    else:
        cp = game.getCoupsValides(copie)
        if p % 2 == 0:
            m = a
        else:
            m = b
        for c in cp:
            s = estimation(copie, c, p + 1, a, b)
            if p % 2 == 0:
                if s >= m:
                    a = s
                    m = s
                if s > b:
                    return b
            else:
                if s <= m:
                    b = s
                    m = s
                if s < a:
                    return a
        return m
Beispiel #18
0
def decision(jeu):
    joueur = game.getJoueur(jeu)
    L = game.getCoupsValides(jeu)
    J = []
    alpha = -5000000
    beta = 5000000
    challenger = 0

    i = 0
    if (joueur == 1):
        i = len(L) - 1
    ok = 0
    while (ok == 0):
        l = estimation(game.getCopieJeu(jeu), L[i], 1, joueur, alpha, beta)
        if (l > alpha):
            alpha = l
            challenger = i
        if (joueur == 1):
            i -= 1
            if (i < 0):
                ok = 1
        else:
            i += 1
            if (i >= len(L)):
                ok = 1

    return L[challenger]
Beispiel #19
0
def estimation(jeu, coup, profondeur):
    copie = game.getCopieJeu(jeu)
    game.joueCoup(copie, coup)
    if game.finJeu(copie):
        gagnant = game.getGagnant(copie)
        if gagnant == moi:
            return 10000
        elif gagnant == 0:
            return -100
        else:
            return -10000

    if profondeur == PMAX:
        return evaluation(copie)

    listeCoups = game.getCoupsValides(copie)
    if profondeur % 2 == 0:
        scoremax = -10000
        for c in listeCoups:
            score_estime = estimation(copie, c, profondeur + 1)

            if score_estime > scoremax:
                scoremax = score_estime
        return scoremax

    if profondeur % 2 == 1:
        scoremin = 10000
        for c in listeCoups:
            score_estime = estimation(copie, c, profondeur + 1)
            if score_estime < scoremin:
                scoremin = score_estime
        return scoremin
Beispiel #20
0
def estimationMIN(jeu, p=1):
    Vmin = float("inf")
    if game.finJeu(jeu):
        g = game.getGagnant(jeu)
        if g == monJoueur:
            return 1000
        else:
            return -1000
    if p == Pmax:
        #print("VMIN:",Vmin)
        return evaluation(jeu)

    #game.changeJoueur(jeu)
    coups = game.getCoupsValides(jeu)

    for cp in coups:
        j = game.getCopieJeu(jeu)
        game.joueCoup(j, cp)

        v = estimationMAX(j, p + 1)
        #print(cp," ",v," ", p)

        if Vmin > v:
            Vmin = v

# print("VMIN:",Vmin)

    return Vmin
Beispiel #21
0
def joue():
    jeu = game.initialiseJeu()
    while (not game.finJeu(jeu)):
        game.affiche(jeu)
        c = game.saisieCoup(game.getCopieJeu(jeu))
        jeu = game.joueCoup(jeu, c)
    g = game.getGagnant(jeu)
    return g
Beispiel #22
0
def saisieCoupTr(jeu, ev):
    j = game.getJoueur(jeu)
    if (j == 1):
        j = joueur1
    else:
        j = joueur2

    coup = j.saisieCoup(game.getCopieJeu(jeu), ev)
    return coup
Beispiel #23
0
def decision(jeu):
    L = game.getCoupsValides(jeu)
    J = []
    jeu2 = game.getCopieJeu(jeu)

    for i in range(0, len(L)):
        game.joueCoup(jeu2, L[i])
        l = evaluation(game.getCopieJeu(jeu), L[i])
        J.append(l)
        jeu2 = game.getCopieJeu(jeu)

    challenger = 0
    i = 1

    while i < len(J):
        if (J[challenger] < J[i]):
            challenger = i
        i = i + 1

    return L[challenger]
Beispiel #24
0
def estimation(jeu, coup, prf, joueur, alpha, beta):
    global n
    game.joueCoup(jeu, coup)
    if game.finJeu(jeu):
        n = n + 1
        g = game.getGagnant(jeu)
        if g == joueur:
            return 100000
        elif g == 0:
            return -100
        else:
            return -100000
    elif prf >= PRONF:
        n = n + 1
        return evaluation(jeu, coup, joueur)

    else:
        L = game.getCoupsValides(jeu)

        if (joueur == game.getJoueur(jeu)):
            val = -5000000
            for i in L:
                n = n + 1
                jeu2 = game.getCopieJeu(jeu)
                val = max(val, estimation(jeu2, i, prf + 1, joueur, alpha,
                                          beta))
                if val >= beta:
                    return val + 1
                alpha = max(val, alpha)
            return val
        else:
            val = 5000000
            for i in L:
                n = n + 1
                jeu2 = game.getCopieJeu(jeu)
                val = min(val, estimation(jeu2, i, prf + 1, joueur, alpha,
                                          beta))
                if val <= alpha:
                    return val - 1
                beta = min(val, beta)
            return val
Beispiel #25
0
def decision(jeu):
    valMax = None
    cpMax = None

    for cp in game.getCoupsValides(jeu):
        j = game.getCopieJeu(jeu)
        game.joueCoup(j, cp)

        val = estimation(j)
        if valMax is None or val > valMax:
            valMax = val
            cpMax = cp

    return cpMax
Beispiel #26
0
def jouentrainement(ev):
    global joueur2
    global joueur1
    nbrepartie=0
    j1=0
    j2=0
    eg=0
    switch=1
    
    while(nbrepartie<NBPARTIE):
        if (nbrepartie==(NBPARTIE/2)):    
            s=joueur1
            joueur1=joueur2
            joueur2=s
            a=j1
            j1=j2
            j2=a
            switch=2
            
        jeu=game.initialiseJeu()
        it=0
        
        while((it<100)and (not(game.finJeu(jeu)))):
            if (it<4):
                coup=joueur_alea.saisieCoup(game.getCopieJeu(jeu))
                game.joueCoup(jeu,coup)
            else :
                if(game.getJoueur(jeu)==switch):
                    coup=saisieCoupTr(jeu,ev)
                else:
                    coup=saisieCoup(jeu)
                game.joueCoup(jeu,coup)
            it+=1
        g=game.getGagnant(jeu)
        
        if (g==1):
            j1+=1
        if(g==2):
            j2+=1
        if(g==0):
            eg+=1    
        nbrepartie+=1

        if (nbrepartie==NBPARTIE):
            s=joueur2   
            joueur2=joueur1
            joueur1=s
            

    return j2
Beispiel #27
0
def Entrainement(ev, alpha):
    nbrepartie = 0
    j1 = 0
    j2 = 0
    it = 0
    j = 1
    while (nbrepartie < NBPARTIE):
        if (nbrepartie == NBPARTIE / 2):
            j = 2
        jeu = game.initialiseJeu()

        while (it < 100 or game.finJeu(jeu)):
            if (game.getJoueur == j):
                coupElv = eleve.saisieCoup(game.getCopieJeu(jeu), ev)
                coupM = maitre.saisieCoup(game.getCopieJeu(jeu))
                if (coupElv == coupM):
                    game.saisieCoup(coupElv)
                else:
                    print "mauvais"

                game.saisiecoup(eleve.saisieCoup(game.getCopieJeu(jeu), ev))
            else:
                game.saisieCoup(sparing.saisieCoup(jeu))
            it += 1

        j = 1
        nbrepartie += 1
        if (g == 1):
            j1 += 1
        if (g == 2):
            j2 += 1
        if (g == 0):
            eg += 1
        nbrepartie += 1
    print("score final :\nj1: " + str(j2) + "\nj2: " + str(j1) +
          "\nnb d'equalite : " + str(eg))
    print ev
Beispiel #28
0
def joueCoup(jeu, coup):

    save = game.getCopieJeu(
        jeu
    )  #on simule d'abord le coup pour vérifier que celui-ci ne va pas affamer l'adversaire
    v = game.getCaseVal(save, coup[0], coup[1])
    game.setCaseVal(save, coup[0], coup[1], 0)
    case = distribue(
        save, coup, v
    )  #la fonction distribue renvoie la derniere case ou une graine a ete depose
    score = game.getScore(save, game.getJoueur(save))
    while case[0] == game.getJoueurAdverse(save) - 1 and (
            save[0][case[0]][case[1]] == 2 or save[0][case[0]][case[1]] == 3):
        score = score + recolte(save, case)
        case = nextCase(save, case)
def joue(ev1, ev2):
    it = 0
    jeu = game.initialiseJeu()
    while ((it < 100) and (not (game.finJeu(jeu)))):
        if (it < 4):
            coup = Random.saisieCoup(game.getCopieJeu(jeu))
            game.joueCoup(jeu, coup)
        else:
            if (game.getJoueur(jeu) == 1):
                coup = Alpha_Beta_Train.saisieCoup(jeu, ev1)
            else:
                coup = Alpha_Beta_Train.saisieCoup(jeu, ev2)
            game.joueCoup(jeu, coup)
        it += 1
    return game.getGagnant(jeu)
Beispiel #30
0
def play():

    global W
    global Alpha

    jeu = game.initialiseJeu()
    print(game.joueur1)

    while True:

        #game.affiche(jeu)
        valides = game.getCoupsValides(jeu)
        print(EvalCoupHorizon1(game.getCopieJeu(jeu), valides[0]))
        print(oracle.scorescoups(jeu)[0])
        """if jeu[2] !=None:
            scoresoracle= oracle.scorescoups(jeu)


            o=EvalCoupHorizon1(game.getCopieJeu(jeu),oracle.saisieCoup(jeu))

            for i in range(len(valides)):
                if scoresoracle[i] < max(scoresoracle):
                    if (o-EvalCoupHorizon1(game.getCopieJeu(jeu),valides[i]))<1:

                        W[0]= W[0]-Alpha*(h1CoupHorizon1(game.getCopieJeu(jeu),valides[i])-h1CoupHorizon1(game.getCopieJeu(jeu),oracle.saisieCoup(jeu)))
                            
                        W[1]= W[1]-Alpha*(h2CoupHorizon1(game.getCopieJeu(jeu),valides[i])-h2CoupHorizon1(game.getCopieJeu(jeu),oracle.saisieCoup(jeu)))

                        W[2]= W[2]-Alpha*(h3CoupHorizon1(game.getCopieJeu(jeu),valides[i])-h3CoupHorizon1(game.getCopieJeu(jeu),oracle.saisieCoup(jeu)))

                        W[3]= W[3]-Alpha*(h4CoupHorizon1(game.getCopieJeu(jeu),valides[i])-h4CoupHorizon1(game.getCopieJeu(jeu),oracle.saisieCoup(jeu)))

                        W[4]= W[4]-Alpha*(h5CoupHorizon1(game.getCopieJeu(jeu),valides[i])-h5CoupHorizon1(game.getCopieJeu(jeu),oracle.saisieCoup(jeu)))

                        W[5]= W[5]-Alpha*(h6CoupHorizon1(game.getCopieJeu(jeu),valides[i])-h6CoupHorizon1(game.getCopieJeu(jeu),oracle.saisieCoup(jeu)))
        """

        if game.finJeu(jeu):

            break

        elif valides != None:

            coup = game.saisieCoup(jeu)

        game.joueCoup(jeu, coup)

    return game.getGagnant(jeu)