Livre pour apprendre les algo MinMax et Alpha/beta
fdiedler2000
Messages postés383Date d'inscriptionsamedi 29 janvier 2005StatutMembreDernière intervention 1 décembre 2008
-
8 déc. 2007 à 10:43
fdiedler2000
Messages postés383Date d'inscriptionsamedi 29 janvier 2005StatutMembreDerniè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 :)
mstarsup5
Messages postés527Date d'inscriptionlundi 15 octobre 2007StatutMembreDernière intervention10 octobre 20131 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 :)
fdiedler2000
Messages postés383Date d'inscriptionsamedi 29 janvier 2005StatutMembreDerniè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é.
fdiedler2000
Messages postés383Date d'inscriptionsamedi 29 janvier 2005StatutMembreDerniè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 :)
Vous n’avez pas trouvé la réponse que vous recherchez ?
mstarsup5
Messages postés527Date d'inscriptionlundi 15 octobre 2007StatutMembreDernière intervention10 octobre 20131 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.
fdiedler2000
Messages postés383Date d'inscriptionsamedi 29 janvier 2005StatutMembreDerniè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...
mstarsup5
Messages postés527Date d'inscriptionlundi 15 octobre 2007StatutMembreDernière intervention10 octobre 20131 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 :-)
mstarsup5
Messages postés527Date d'inscriptionlundi 15 octobre 2007StatutMembreDernière intervention10 octobre 20131 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 :)
mstarsup5
Messages postés527Date d'inscriptionlundi 15 octobre 2007StatutMembreDernière intervention10 octobre 20131 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
fdiedler2000
Messages postés383Date d'inscriptionsamedi 29 janvier 2005StatutMembreDerniè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).
fdiedler2000
Messages postés383Date d'inscriptionsamedi 29 janvier 2005StatutMembreDerniè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 ?
mstarsup5
Messages postés527Date d'inscriptionlundi 15 octobre 2007StatutMembreDernière intervention10 octobre 20131 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 :/
mstarsup5
Messages postés527Date d'inscriptionlundi 15 octobre 2007StatutMembreDernière intervention10 octobre 20131 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 :)
mstarsup5
Messages postés527Date d'inscriptionlundi 15 octobre 2007StatutMembreDernière intervention10 octobre 20131 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 :) ))
fdiedler2000
Messages postés383Date d'inscriptionsamedi 29 janvier 2005StatutMembreDerniè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 ?
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 ?
mstarsup5
Messages postés527Date d'inscriptionlundi 15 octobre 2007StatutMembreDernière intervention10 octobre 20131 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.
fdiedler2000
Messages postés383Date d'inscriptionsamedi 29 janvier 2005StatutMembreDerniè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