Livre pour apprendre les algo MinMax et Alpha/beta

fdiedler2000 Messages postés 383 Date d'inscription samedi 29 janvier 2005 Statut Membre Dernière intervention 1 décembre 2008 - 8 déc. 2007 à 10:43
fdiedler2000 Messages postés 383 Date d'inscription samedi 29 janvier 2005 Statut Membre Dernière intervention 1 décembre 2008 - 6 janv. 2008 à 22:50
Bonjour,

Je voudrais apprendre les bases des l'algorithmes Min/Max et Alpha/Beta avec un bon livre pour débutant !

Mon but et de comprendre comment réfléchie une IA pour en developper une dans le cadre d'un morpion ou puissance 4 dans un premier temps.

De plus, si vous connaissez des ressources sur le net qui explique vraiment pas à pas ces deux algos avec si possible un exemple en vb.net ca serait génial :)

Merci à tous
A voir également:

101 réponses

mstarsup5 Messages postés 527 Date d'inscription lundi 15 octobre 2007 Statut Membre Dernière intervention 10 octobre 2013 1
24 déc. 2007 à 20:24
Faut pas abandonner.
J'ai pas le temps de regarder ce soir, mais j'y jèterai un coup d'oeil plus tard si tu veux.

 Pourapprendretoujoursplus!
0
mstarsup5 Messages postés 527 Date d'inscription lundi 15 octobre 2007 Statut Membre Dernière intervention 10 octobre 2013 1
24 déc. 2007 à 20:42
Je reviens sur ce que j'ai dit, j'y ai jeté un coup d'oeil, ça m'a l'air bon comme ça (si tes fonction simulecoup, annulecoup et evalposition sont bonnes, si "If Grid1.Cell(i, j).BackColor = Color.White" ça veut bien dire qu'un coup est jouable, et si la syntaxe est bonne aussi (je programme pas en VB2005, donc je ne connais pas la syntaxe))

Te manque plus qu'à:
-Sauvegarder le meilleur coup à jouer pour ton IA là dedans (voir l'algo que je t'ai filé y'a quelques minutes, ça y est dedans et c'est exactement pareil)
-Lancer ton programme minmax avec les bons paramètres
-Faire que l'IA joue le coup sauvegardé

L'algo a l'air bon en tout cas, donc abandonner comme tu veux le faire, ça sert à rien :)

 Pourapprendretoujoursplus!
0
fdiedler2000 Messages postés 383 Date d'inscription samedi 29 janvier 2005 Statut Membre Dernière intervention 1 décembre 2008
24 déc. 2007 à 21:00
Justement j'ai des gros problèmes avec la fonction eval...

Voila l'algo complet :
    Private Const MINEVAL As Integer = -1000
    Private Const MAXEVAL As Integer = 1000

    Private Sub calculIA(ByVal prof As Integer)
        Dim maxcourant As Integer = MINEVAL
        Dim tmp, max_i, max_j As Integer
        Dim coup As PictureBox = Nothing

        'joueur courant
        Dim joueur As joueur = getcurrentjoueur()
        If Not prof 0 Or IsFinish() False Then
            For i As Integer = 0 To 2
                For j As Integer = 0 To 2
                    If Grid1.Cell(i, j).BackColor = Color.White Then
                        simuler(i, j, joueur.pion)
                        tmp = calcMin(prof - 1)
                        If tmp > maxcourant Then
                            maxcourant = tmp
                            max_i = i
                            max_j = j
                        End If
                        annuler(i, j, joueur.pion)
                    End If
                Next
            Next

            coup = convert1(max_i, max_j)
            PlacerPion(J2, coup)
            turn = 1
        End If
    End Sub
    Private Function calcMax(ByVal prof As Integer) As Integer
        Dim max As Integer = MINEVAL
        Dim tmp As Integer

        'joueur courant
        Dim joueur As joueur = getcurrentjoueur()
        If prof 0 Or IsFinish() True Then
            Return eval()
        Else
            For i As Integer = 0 To 2
                For j As Integer = 0 To 2
                    If Grid1.Cell(i, j).BackColor = Color.White Then
                        simuler(i, j, joueur.pion)
                        tmp = calcMin(prof - 1)
                        If tmp > max Then
                            max = tmp
                        End If
                        annuler(i, j, joueur.pion)
                    End If
                Next
            Next

            Return max
        End If
    End Function
    Private Function calcMin(ByVal prof As Integer) As Integer
        Dim min As Integer = MAXEVAL
        Dim tmp As Integer

        'joueur courant
        Dim joueur As joueur = getcurrentjoueur()
        If prof 0 Or IsFinish() True Then
            Return eval()
        Else
            For i As Integer = 0 To 2
                For j As Integer = 0 To 2
                    If Grid1.Cell(i, j).BackColor = Color.White Then
                        simuler(i, j, joueur.pion)
                        tmp = calcMax(prof - 1)
                        If tmp < min Then
                            min = tmp
                        End If
                        annuler(i, j, joueur.pion)
                    End If
                Next
            Next

            Return min
        End If
    End Function

Globalement, ca c'est bon je pense mais la fonction eval, je n'arrive pas à la faire ! Parce que je pense que mes fonctions "simulation" et "annuler" sont fausses.

Je ne sais pas à quel moment je dois simuler le joueur... enfin je comprends pas grand chose !

PS : Oui, si la couleur de la cellule est blanche alors c'est un coup possible, sinon la case est déjà occupé.

Merci pour tous en tout cas.
0
fdiedler2000 Messages postés 383 Date d'inscription samedi 29 janvier 2005 Statut Membre Dernière intervention 1 décembre 2008
24 déc. 2007 à 21:07
En fait, je crois que je me prends la tete. On va essayer de la faire en francais avant de le programmer !

Donc,
1) Que dois je faire dans la simulation du coup ?
2) Que dois je faire dans l'annulation du coup ?
3) Que dois je faire dans la fonction d'évaluation appelée lorsque le jeu est fini ou que la profondeur est atteinte ?

Je sais qu'a un moment, je dois changer le joueur courant (une fois c'est un coup de l'IA qui est simmulé et une fois c'est le coup du joueur qui est simulé).

Par convention dans mon programme,

3 types de cases :
-  Rouge ===> c'est le joueur qui joue les "rond" (humain)
-  Verte ===> celui qui joue les Croix (IA)
-  Blanche ====> la case est libre

Voila, si tu as un peu de temps pour m'aider, je t'en remercie par avance :)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
mstarsup5 Messages postés 527 Date d'inscription lundi 15 octobre 2007 Statut Membre Dernière intervention 10 octobre 2013 1
24 déc. 2007 à 23:11
Ben
-Là apparamment tu veux faire ta fonction eval pour le morpion, c'est simple:
si l'ordi gagne à la position de ton évaluation, ça fait +1 point.
si son adversaire gagne, ça fait -1
sinon, 0.
-Fonction simulation du coup, il faut que tu "joues le coup simulé": que ton plateau (pas graphiquement, mais dans tes données), le coup soit joué.
-Fonction d'annulation du coup: exactement l'inverse, le coup qui a été joué doit être annulé pour que la position redevienne exactement ce qu'elle était avant que le coup soit joué

Exemple:
Position de départ:
_ _O
XX_
_ _O 
simulation d'un coup:
_ XO
XX
_ O_
annulation du coup:
_ _O
XX_
_ O_
(on est revenu à la position précédente)

Juste 3 trucs:
-le plateau du morpion a 9 cases, et peu de possibilités de coups, donc tu peux direct demander une profondeur de 9
-quand tu fais l'appel à l'IA, c'est toujours l'IA qui joue, donc tu commences toujours par une maximisation.
Ton sub CalculIA ne sert donc à rien, il suffit d'appeler Score=calcmax(9)  'Je t'ai dit qu'une profondeur de 9 était nécessaire ici)
-Dernière chose: nulle part il y a dans calcmax ou calcmin un bout de code enregistrant le coup à jouer. (sachant que le premier coup est une maximisation, je t'aide, il faut placer ça dans calcmax, cf le code que je t'ai donné en début de soirée). Sans ça, y'a pas moyen de savoir quel coup est le bon: calcmax et calcmin te donneront à la fin le score du meilleur coup, mais pas le coup lui même.

 Pourapprendretoujoursplus!
0
fdiedler2000 Messages postés 383 Date d'inscription samedi 29 janvier 2005 Statut Membre Dernière intervention 1 décembre 2008
25 déc. 2007 à 10:13
Salut,

- La meilleur coup est normalement enregistré dans la fonction  calcIA qui est necessaire à mon sens... Les coordonnées sont :
    max_i = i
    max_j = j

- Pour le coup simulé et l'annulation j'ai compris mais je voulais savoir à quel moment dois je changer de joueur ? (après avoir simulé le coup ?) et lorsque j'annule le coup , est ce que je dois rechanger le joueur courant ou alors je touche à rien ?

-  Ta fonction eval est trop simple je pense, car c'est l'évaluation en fin de partie que tu m'a donnée. En effet, en milieu de partie, je faut évaluer la position avec le nombre de pions...

Je te donne le lien sur lequel je travaille :
http://fearyourself.developpez.com/tutoriel/sdl/morpion/part6/#L3
0
mstarsup5 Messages postés 527 Date d'inscription lundi 15 octobre 2007 Statut Membre Dernière intervention 10 octobre 2013 1
25 déc. 2007 à 11:54
 La meilleur coup est normalement enregistré dans la fonction  calcIA qui est necessaire à mon sens... Les coordonnées sont :
    max_i = i
    max_j = j

<---- Ca je suis d'accord, tu mets ce même bout de code dans calcmax, quand prof=profondeurRecherchee, tu fais un simple appel sur Score=calcmax(9) dans ton sub d'IA principal, et tu peux virer ton calculIA qui ne sert strictement à rien d'autre qu'à alourdir le code.
D'autant plus que tu as fait cette fonction:    Private Sub calculIA(ByVal prof As Integer)
D'où mes questions:
1 - Où est l'initialisation?
2 - A quoi sert de vouloir faire une fonction récursive sur un sub qui va appeler ta fonction min max?
3 - Si tu fais une fonction récursive, où initialises tu l'appel de ta fonction? (en d'autres termes: à quoi elle sert, vu que tu pourrais au lieu d'initialiser calculIA, initialiser calcmax directement.
Il te suffit de faire un sub (j'insiste) et d'y mettre Score=calcmax(9), sans oublier d'enregistrer le coup dans calcmax.

- Pour le coup simulé et l'annulation j'ai compris mais je voulais savoir à quel moment dois je changer de joueur ? (après avoir simulé le coup ?) et lorsque j'annule le coup , est ce que je dois rechanger le joueur courant ou alors je touche à rien ?
Forcément, si un coup est joué, c'est à l'autre joueur de jouer...

-  Ta fonction eval est trop simple je pense, car c'est l'évaluation en fin de partie que tu m'a donnée. En effet, en milieu de partie, je faut évaluer la position avec le nombre de pions...
Si on y réfléchit 2 minutes, je t'ai bien dit qu'une profondeur de 9 au départ arrivait quoi qu'il arrive à trouver tous les chemins possibles (Morpion: 9 cases, donc au bout de 9 coups, le plateau est remplis...).
Dans ce cas là, soit tu gagnes, soit ton adversaire gagne, soit personne gagne, c'est pas plus compliqué...
Cela dit, si tu veux t'enquiquiner à essayer de trouver une autre fonction d'évaluation (comment vas tu évaluer, sur quels critères??), libre à toi :-)

Sur ce, bonne continuation et joyeux noël !!!

 Pourapprendretoujoursplus!
0
mstarsup5 Messages postés 527 Date d'inscription lundi 15 octobre 2007 Statut Membre Dernière intervention 10 octobre 2013 1
25 déc. 2007 à 12:04
Ah, et juste un truc: sur ton lien (j'ai trouvé ça en 20 secondes hein)

Pour résoudre ce problème, nous savons que nous devons utiliser la fonction d'évaluation. Comme évaluation basique nous allons définir:
<li>évaluation(jeu) 1000 si l'IA a gagné </li><li>évaluation(jeu) -1000 si l'IA a perdu </li><li>évaluation(jeu) = 0 sinon </li>Dans son algorithme après, le seul truc qu'il a rajouté, c'est pour s'il a deux chemins pour gagner il prendra le plus court.

Par contre, je remarque qu'il te donne la même chose pour calculIA, mais franchement, même s'il te donne ça, ça ne me fait pas changer d'avis sur le sujet: c'est inutile :)

 Pourapprendretoujoursplus!
0
mstarsup5 Messages postés 527 Date d'inscription lundi 15 octobre 2007 Statut Membre Dernière intervention 10 octobre 2013 1
25 déc. 2007 à 12:12
Private sub IA()

'Là tu initialises toutes tes données, comme tu l'as fait dans ta fonction calculIA

dim Score as integer

Score=calcmax(9) 'Ou une profondeur que tu veux, peu importe...
'La tu fais jouer le coup à ton IA

End Sub


Public Function calcMax(ByVal prof As Integer) As Integer
        Dim max As Integer = MINEVAL
        Dim tmp As Integer
        'joueur courant
        Dim joueur As joueur = getcurrentjoueur()        If prof 0 Or IsFinish() True Then
            Return eval()
        Else
            For i As Integer = 0 To 2
                For j As Integer = 0 To 2
                    If Grid1.Cell(i, j).BackColor = Color.White Then
                        simuler(i, j, joueur.pion)
                        tmp = calcMin(prof - 1)
                        If tmp > max Then
                            max = tmp
                            If prof=profondeurdepart then
                              max_i = i
                              max_j = j
                            EndIf
                        End If
                        annuler(i, j, joueur.pion)
                    End If
                Next
            Next
            Return max
        End If
    End Function

    Public Function calcMin(ByVal prof As Integer) As Integer
        Dim min As Integer = MAXEVAL
        Dim tmp As Integer
        'joueur courant
        Dim joueur As joueur = getcurrentjoueur()        If prof 0 Or IsFinish() True Then
            Return eval()
        Else
            For i As Integer = 0 To 2
                For j As Integer = 0 To 2
                    If Grid1.Cell(i, j).BackColor = Color.White Then
                        simuler(i, j, joueur.pion)
                        tmp = calcMax(prof - 1)
                        If tmp < min Then
                            min = tmp
                        End If
                        annuler(i, j, joueur.pion)
                    End If
                Next
            Next
            Return min
        End If
    End Function

Une Fonction Eval

Une fonction Simule coup

Une fonction Annule coup

Et c'est gagné :D

 Pourapprendretoujoursplus!
0
fdiedler2000 Messages postés 383 Date d'inscription samedi 29 janvier 2005 Statut Membre Dernière intervention 1 décembre 2008
25 déc. 2007 à 13:09
Je suis peut etre très bete mais je ne vois pas du tout comment supprimer la fonction CalcIA !

    Private Sub mz()
        'calculIA(9)
        Dim maxcourant As Integer = MINEVAL
        Dim tmp, max_i, max_j As Integer

        tmp = calcMin(9)
        If tmp > maxcourant Then
            maxcourant = tmp
        End If

        'et comment récupérer les coordonnées de la meilleur case ?
    End Sub

Je n'arrive pas à récupérer les bonnes coordonnées et puis il faut pas les sauvegarder dans la fonction MAX ou MIN d'où l'interet du sub CalcIA.

SInon effectivement, si on met une profondeur de 9 alors ta fonction eval est correcte mais si on met 7 (pour un computer niveau moyen ca ne marche plus !) Bref de toute manière on va deja essayer de le faire marcher avec une profondeur de 9 et donc voici ma fonction eval :

 If WhoWin() = "CROIX" Then ' IA a gagné
                Return 1000
            ElseIf WhoWin() = "ROND" Then 'joueur a gagné
                Return -1000
            Else 'partie nulle
                Return 0
            End If

Une autre question, dans ma fonction "simulation", je vérifie à l'aide d'un boolean si quelqu'un à gagné. Cependant, je ne sais pas quoi faire de ce résultat...

Voici la fonction SImulation :

Private Sub Grid1_CellClick(ByVal Row As Integer, ByVal Col As Integer, ByVal Header As LameGrid.HeaderInfo) Handles Grid1.CellClick
        If Grid1.Cell(Row, Col).BackColor = Color.White Then 'si le coup est possible
            Grid1.Cell(Row, Col).BackColor = couleur 'on le joue

            If IsWinner(couleur) = True Then 'vérifie si qq1 à gagné
                '  MsgBox(WhoWin)
            End If

            If couleur = Color.Red Then 'si c'est le joueur ROND alors c'est aux CROIX de jouer
                couleur = Color.Green
            ElseIf couleur = Color.Green Then 'et vice versa
                couleur = Color.Red
            End If
        Else
            MsgBox("impossible case non vide")
        End If
    End Sub

Voici la fonction "annuler"

    Private Sub annuler(ByVal row As Integer, ByVal col As Integer)
        Grid1.Cell(row, col).BackColor = Color.White 'on annule le coup

        If couleur = Color.Red Then 'et on change de nouveau dans l'autre sens le tour du joueur
            couleur = Color.Green
        ElseIf couleur = Color.Green Then
            couleur = Color.Red
        End If
    End Sub

Normalement avec tout ca, ca devrait marcher pourtant l'IA parfois joue bien ! et parfois joue mal !! J'ai l'impression qu'il préfère me contrer que de gagner directement. (je joue mal exprès).
0
fdiedler2000 Messages postés 383 Date d'inscription samedi 29 janvier 2005 Statut Membre Dernière intervention 1 décembre 2008
25 déc. 2007 à 13:17
Si tu as Visual Studio Express (gratuit), je peux te donner mon projet en vb.net 2005 et puis je te commente toutes les lignes pour que tu comprennes le code, ca sera peut etre plus facile non ?
0
mstarsup5 Messages postés 527 Date d'inscription lundi 15 octobre 2007 Statut Membre Dernière intervention 10 octobre 2013 1
25 déc. 2007 à 13:20
désolé, je n'ai pas visual studio express, et je n'ai jamais programmé en vb.net, donc je ne pense pas être plus utile qu'ici sur le forum malheureusement :/

 Pourapprendretoujoursplus!
0
mstarsup5 Messages postés 527 Date d'inscription lundi 15 octobre 2007 Statut Membre Dernière intervention 10 octobre 2013 1
25 déc. 2007 à 13:23
Re salut,

Je suis peut etre très bete mais je ne vois pas du tout comment supprimer la fonction CalcIA !
<--- Je t'ai donné la fonction dans mon précédent post: le sub IA.
Il te dit comment appeler la fonction (par un calcmax, et non pas un calcmin comme je le vois ici), et comment implémenter la récupération des données dans ton calcmax.
Si tu récupères les données dans le calcmax et lances tout d'abord un calcmin, ça pose problème, tu ne trouves pas?
De plus:
Private Sub mz()
        'calculIA(9)
        Dim maxcourant As Integer = MINEVAL
        Dim tmp, max_i, max_j As Integer

        tmp = calcMin(9)
        If tmp > maxcourant Then
            maxcourant = tmp
        End If

        'et comment récupérer les coordonnées de la meilleur case ?
    End Sub
<---- Tout ça je l'ai mis dans le sub IA, sauf la récupération de la meilleure case qui se fait au premier étage de la fonction calcmax.

SInon effectivement, si on met une profondeur de 9 alors ta fonction eval est correcte mais si on met 7 (pour un computer niveau moyen ca ne marche plus !)
<--- Si si  :)

 Pourapprendretoujoursplus!
0
mstarsup5 Messages postés 527 Date d'inscription lundi 15 octobre 2007 Statut Membre Dernière intervention 10 octobre 2013 1
25 déc. 2007 à 13:31
Si tu veux, je vais essayer de l'expliquer différemment, ton algo de calcul est bon. Si tes algorithmes pour simuler et annuler sont bons, et si la fonction qui vérifie si un coup est jouable ou non est bon (à toi de vérifier que ça marche en faisant par exemple des temps morts dans ta fonction), il te suffit de lancer cet algorithme.
Quand c'est à l'IA de jouer, il faut:
-initialiser les données (ça tu l'as fait)
-lancer l'algorithme (c'est à l'IA de jouer, donc il faut que tu maximises, et pas que tu minimises comme tu le proposes plus haut), soit faire un calcmax(ProfondeurSouhaitee)
les fonctions calcmax et calcmin te trouvent alors le meilleur chemin, et le premier calcmax lancé va te renvoyer le meilleur coup à jouer.
-Il ne te reste plus qu'à jouer ce coup, et c'est gagné.


(Et ta fonction Eval est bonne, (en supposant que Whowin te renvoie le bon résultat, bien sûr :) ))

 Pourapprendretoujoursplus!
0
fdiedler2000 Messages postés 383 Date d'inscription samedi 29 janvier 2005 Statut Membre Dernière intervention 1 décembre 2008
25 déc. 2007 à 19:58
Bon, donc pour l'initialisation de l'IA :

Private Sub mz()
        Dim maxcourant As Integer = MINEVAL
        Dim tmp, max_i, max_j As Integer

        tmp = calcMax(9) 'lance l'algo avec profondeur 9
        If tmp > maxcourant Then
            maxcourant = tmp
        End If
    End Sub

Le soucis, c'est que CalcMAX et calcMIN sont des fonctions et retournent un Integer. Il est donc impossible de récupérer le meilleur coup sous forme de coordonnées (row et col)... De plus je récupère dans mon sub "mz", un integer MAXCOURANT mais il sert à rien ?

Mais pourquoi alors sur le lien :
http://fearyourself.developpez.com/tutoriel/sdl/morpion/part6/#L5.3.b

il lance d'abord un CalcMIN et puis il boucle sur tous les coups possibles alors que ta solution propose de lancer un CalcMAX sans lister les coups possibles...

J'y pert mon latin ! :(

Sinon les algos sont correctes, je les ai testé avec une partie humain VS humain. Cependant, dans ma fonction "SIMULER COUP" :

If Grid1.Cell(Row, Col).BackColor = Color.White Then 'si le coup est possible
            Grid1.Cell(Row, Col).BackColor = couleur 'on le joue

            If IsWinner(couleur) = True Then 'vérifie si qq1 à gagné
                MsgBox(WhoWin)
            End If

            If couleur = Color.Red Then 'si c'est le joueur ROND alors c'est aux CROIX de jouer
                couleur = Color.Green
            ElseIf couleur = Color.Green Then 'et vice versa
                couleur = Color.Red
            End If
        Else
            MsgBox("impossible case non vide")
        End If

Est ce que la partie en rouge, est nécessaire ? et qu'est ce que je dois en faire lors de la simulation de l'IA ?

Désolé mais je suis très débutant !
0
mstarsup5 Messages postés 527 Date d'inscription lundi 15 octobre 2007 Statut Membre Dernière intervention 10 octobre 2013 1
25 déc. 2007 à 20:23
Bon...
On va (re)faire étape par étape...

Je t'ai écrit (copier coller):

Private sub IA()
'Là tu initialises toutes tes données, comme tu l'as fait dans ta fonction calculIA
dim Score as integer
Score=calcmax(9) 'Ou une profondeur que tu veux, peu importe...
'La tu fais jouer le coup à ton IA
End Sub

(ou encore écrit (copier coller)):

Quand c'est à l'IA de jouer, il faut:
-initialiser les données (ça tu l'as fait)
-lancer l'algorithme (c'est à l'IA de jouer, donc il faut que tu maximises, et pas que tu minimises comme tu le proposes plus haut), soit faire un calcmax(ProfondeurSouhaitee)
les fonctions calcmax et calcmin te trouvent alors le meilleur chemin, et le premier calcmax lancé va te renvoyer le meilleur coup à jouer.
-Il ne te reste plus qu'à jouer ce coup, et c'est gagné.

Toi tu me réponds:

Private Sub mz()
        Dim maxcourant As Integer = MINEVAL
        Dim tmp, max_i, max_j As Integer
        tmp = calcMax(9) 'lance l'algo avec profondeur 9
        If tmp > maxcourant Then
            maxcourant = tmp
        End If
    End Sub

Alors ce qu'il y a en rouge ne sert à rien: tu fais un appel sur calcmax et c'est tout, pas besoin de comparer quoi que ce soit. Et surtout, chose flagrante dans ton sub: tu ne joues pas de coup...
Ce qu'il y a en rose, mets le en variables globales, sinon tu vas avoir du mal à sauvegarder les coordonnées du meilleur coup.

Ensuite, tu me dis:

Le soucis, c'est que CalcMAX et calcMIN sont des fonctions et retournent un Integer. Il est donc impossible de récupérer le meilleur coup sous forme de coordonnées (row et col)... De plus je récupère dans mon sub "mz", un integer MAXCOURANT mais il sert à rien ?

Alors là, je te renvoie à un truc que je t'ai déjà dit et fait:
(Ancien post, page 3...):

Public Function calcMax(ByVal prof As Integer) As Integer
        Dim max As Integer = MINEVAL
        Dim tmp As Integer
        'joueur courant
        Dim joueur As joueur = getcurrentjoueur()        If prof 0 Or IsFinish() True Then
            Return eval()
        Else
            For i As Integer = 0 To 2
                For j As Integer = 0 To 2
                    If Grid1.Cell(i, j).BackColor = Color.White Then
                        simuler(i, j, joueur.pion)
                        tmp = calcMin(prof - 1)
                        If tmp > max Then
                            max = tmp
                            If prof=profondeurdepart then
                              max_i = i
                              max_j = j
                            EndIf
                        End If
                        annuler(i, j, joueur.pion)
                    End If
                Next
            Next
            Return max
        End If
    End Function

(Remarque bien ce qu'il y a écrit en rouge... La récupération des coordonnées du coup se fait là, au premier étage de l'algorithme... profondeurdepart vaut ici 9 puisque tu le fais sur une profondeur de 9 au lancement..)


Pour ta dernière question:

Est ce que la partie en rouge, est nécessaire ? et qu'est ce que je dois en faire lors de la simulation de l'IA ?

Non, pas nécessaire pour cette partie de l'IA puisque ça serait quand même chiant que tu reçoives un message à chaque fois que l'IA a trouvé un chemin menant à la victoire de quelqu'un... (ce qui arrive assez souvent)

Et juste un dernier truc que j'ai remarqué:
tes MINEVAL et MAXEVAL doivent être strictement inférieur (respectivement supérieur) au min (resp. au max) de l'évaluation possible.
En réalité, il faudrait leur donner pour valeur -infini et +infini.

 Pourapprendretoujoursplus!
0
fdiedler2000 Messages postés 383 Date d'inscription samedi 29 janvier 2005 Statut Membre Dernière intervention 1 décembre 2008
25 déc. 2007 à 20:51
Donc au final :

    Private Sub mz()
        'calculIA(9)
        Dim maxcourant As Integer = MINEVAL
        calcMax(9) 'lance l'algo avec profondeur 9
        Grid1_CellClick(max_i, max_j, Nothing) 'joue le coup meilleur
    End Sub

    Private Function calcMax(ByVal prof As Integer) As Integer
        Dim max As Integer = MINEVAL
        Dim tmp As Integer
        If prof 0 Or IsFinish() True Then
            Return eval()
        Else
            For row As Integer = 0 To 2
                For col As Integer = 0 To 2
                    If Grid1.Cell(row, col).BackColor = Color.White Then
                        Simuler(row, col)
                        ' MsgBox("simulé calcMAX")
                        tmp = calcMin(prof - 1)
                        If tmp > max Then
                            max = tmp
                            If prof = 9 Then
                                max_i = row
                                max_j = col
                            End If
                        End If
                        annuler(row, col)
                        ' MsgBox("annulé calcMAX")
                    End If
                Next
            Next

            Return max
        End If
    End Function
    Private Function calcMin(ByVal prof As Integer) As Integer
        Dim min As Integer = MAXEVAL
        Dim tmp As Integer
        If prof 0 Or IsFinish() True Then
            Return eval()
        Else
            For row As Integer = 0 To 2
                For col As Integer = 0 To 2
                    If Grid1.Cell(row, col).BackColor = Color.White Then
                        Simuler(row, col)
                        ' MsgBox("simulé calcMIN")
                        tmp = calcMax(prof - 1)
                        If tmp < min Then
                            min = tmp
                        End If
                        annuler(row, col)
                        '  MsgBox("annulé calcMIN")
                    End If
                Next
            Next

            Return min
        End If
    End Function

Pourtant ca marche toujours pas... l'IA est assez bizarre...

Ya t-il un moyen de voir ou ca bloque ?

PS : Dans ma fonction "simuler", je me contente seulement de jouer le coup et je ne vérifie pas la position ce qui me parair bizarre :

Private Sub Simuler(ByVal row As Integer, ByVal col As Integer)
        If Grid1.Cell(row, col).BackColor = Color.White Then 'si le coup est possible
            Grid1.Cell(row, col).BackColor = couleur 'on le joue

            If couleur = Color.Red Then 'si c'est le joueur ROND alors c'est aux CROIX de jouer
                couleur = Color.Green
            ElseIf couleur = Color.Green Then 'et vice versa
                couleur = Color.Red
            End If
        Else
            MsgBox("impossible case non vide")
        End If
    End Sub

Merci pour le temps passé sur mon problème !
0
mstarsup5 Messages postés 527 Date d'inscription lundi 15 octobre 2007 Statut Membre Dernière intervention 10 octobre 2013 1
25 déc. 2007 à 21:21
Re,

Mets tes msgbox sans le " ' " pour voir déjà si l'ordi essaie toutes les possibilités.
(On va regarder pas à pas si tout va bien)

 Pourapprendretoujoursplus!
0
fdiedler2000 Messages postés 383 Date d'inscription samedi 29 janvier 2005 Statut Membre Dernière intervention 1 décembre 2008
25 déc. 2007 à 23:31
Oui ca teste plein de truc mais impossible de savoir si c'est correcte ou pas. En mettant les MSGBOX seulement dans le MAX, j'obtient les schemas :

J'ai joué en (0,0) (la case rouge).

LE CPU à la couleur verte. Le reste est de la simulation.

Ensuite, il commance à annulé les coups puis à simuler... Aucun moyen de savoir. Je peux te compiler l'exe et la dll pour que tu vois si tu veux ?
0
mstarsup5 Messages postés 527 Date d'inscription lundi 15 octobre 2007 Statut Membre Dernière intervention 10 octobre 2013 1
25 déc. 2007 à 23:32
Ok :)

 Pourapprendretoujoursplus!
0
Rejoignez-nous