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!