je double poste puisque j apporte une reponse ( meme si mes questions restent entiere)
j ai modifié la fonction comme suit :
nouvelle appel de fonction :
Public Function minimax(ByRef chessboard As bitboard, ByVal profondeur As Integer, Optional ByVal arborescence As String = "") As branche
remplacement de l ajout coup et suppression de coup
placé au meme endroit !!!!!!!!!!
par :
branche.add_move(mvts.moves.Item(i), arborescence)
et
branche.supp_last_move(arborescence)
l algo fonctionne
testé a profondeur de 1 /2 /3 vais lancer un tournois a 4
par contre, je n ai pas ma réponse du coup et si qqqn a une idée
Je ne m explique pas le probleme expliqué plus haut ca aurait du fonctionner puisque correct théoriquement
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
| Public Function minimax(ByRef chessboard As bitboard, ByVal profondeur As Integer, Optional ByVal arborescence As String = "") As branche
'création de la branche de refelerence
Dim local_best_eval As Integer = 0
Dim local_best_arbo As String = ""
'si feuille : 0
If profondeur = 0 Then
'dans ce cas, on retourne l evaluatoion de la branche entiere
' branche.supp_last_move(branche_en_cours.arborescence_en_cours)
branche_en_cours.eval_en_cours = evaluator.eval(chessboard)
branche_en_cours.arborescence_en_cours = arborescence
' MsgBox(local_best_eval & " <=> " & local_best_arbo)
'Console.WriteLine("info string avant : " & branche_en_cours.eval_en_cours & " apres : " & branche_en_cours.arborescence_en_cours)
Return branche_en_cours '
End If
' création de la liste de coups possible
Dim mvts As New mouvement.list_of_move
mvts = chessboard.generate_move
Dim nb_total As Integer = mvts.moves.Count - 1
'pour chaque coup possible
For i = 0 To nb_total
' on ajoute le coup a l echiquier
chessboard.jouer(mvts.moves.Item(i))
'on ajoute au png
' branche.add_move(mvts.moves.Item(i), branche_en_cours.arborescence_en_cours)
branche.add_move(mvts.moves.Item(i), arborescence)
' on ajoute une node
add_nodes()
'si blanc on minimise( puisque on recoi une reponse noir maximisé )
If chessboard.parametre_game.trait = constante.couleur.blanc Then
best_branche = minimax(chessboard, profondeur - 1, arborescence)
If local_best_arbo = "" Then
local_best_arbo = best_branche.arborescence_en_cours
local_best_eval = best_branche.eval_en_cours
Else
' la branche la mieux evaluer est la meilleurs ( on maximise )
If local_best_eval > best_branche.eval_en_cours Then
local_best_eval = best_branche.eval_en_cours
local_best_arbo = best_branche.arborescence_en_cours
Else
' on ne fait rien la branche en cours est la meilleur
End If
End If
'si noir on minimise ( puisque on recoi une reponse noir minimise )
Else
best_branche = minimax(chessboard, profondeur - 1, arborescence)
If local_best_arbo = "" Then
local_best_arbo = best_branche.arborescence_en_cours
local_best_eval = best_branche.eval_en_cours
Else
' la branche la moins evaluer est la meilleurs ( on minimise )
If local_best_eval < best_branche.eval_en_cours Then
local_best_eval = best_branche.eval_en_cours
local_best_arbo = best_branche.arborescence_en_cours
Else
' on ne fait rien la branche en cours est la mini
End If
End If
End If
' on dejoue le coup
chessboard.dejouer(mvts.moves.Item(i))
' on dejoue le coup au png
' branche.supp_last_move(branche_en_cours.arborescence_en_cours)
' branche.supp_last_move(branche_en_cours.arborescence_en_cours)
branche.supp_last_move(arborescence)
Next
' branche.supp_last_move(branche_en_cours.arborescence_en_cours)
'branche.supp_last_move(branche_en_cours.arborescence_en_cours)
best_branche.arborescence_en_cours = local_best_arbo
best_branche.eval_en_cours = local_best_eval
Return best_branche
End Function |
Partager