private bool JoueurIA(bool isjoueur1, int profondeur) { //*** DECLENCHEMENT COMPTEUR TEMPS DE REPONSE *** var watch = Stopwatch.StartNew(); // on appelle l'algorithme minimax var retourIA = puissance4.DecisionIA(isjoueur1, profondeur, isjoueur1 ? parametres.Joueur1AlphaBeta : parametres.Joueur2AlphaBeta).Result; //*** RECUPERATION TR ET ARRET COMPTEUR *** long temps_reponse = watch.ElapsedMilliseconds; watch.Stop(); //*** On Ajoute les valeurs dans la listeCoups du joueur correspondant *** if (isjoueur1) { parametres.ListeCoupsJ1.Add(temps_reponse - CONST_DELAY); } else { parametres.ListeCoupsJ2.Add(temps_reponse - CONST_DELAY); } // On a la colonne sélectionné pr l'IA var tupleLigneRetourIA = puissance4.Placer(retourIA); if (!tupleLigneRetourIA.Item1) { // Cas impossible } var boutonCliquerIA = gridJeu.Children.Cast <Button>() .FirstOrDefault(e => Grid.GetRow(e) == tupleLigneRetourIA.Item2 && Grid.GetColumn(e) == retourIA) as Button; // On change le fond en rouge du bouton sélectionné par l'IA if (puissance4.joueur == Joueur.Joueur1) { boutonCliquerIA.BackgroundColor = Color.Red; } else { boutonCliquerIA.BackgroundColor = Color.Yellow; } if (AffichageMessageFin(puissance4.VerifierJeu())) { return(true); } return(false); }
/// <summary> /// Méthode qui implémente le min (minimax) /// </summary> /// <param name="puissance4"></param> /// <param name="profondeur"></param> /// <param name="a">Alpha</param> /// <param name="b">Beta</param> /// <returns></returns> private async Task <List <int?> > Min(Puissance4 puissance4, int profondeur, int?a = null, int?b = null) { var points = puissance4.CompteurPoints(); // Si le jeu est terminée on retour une liste null if (puissance4.EstTermine(profondeur, points)) { return(new List <int?>() { null, points }); } var minimumPoints = new List <int?>() { null, 99999 }; for (var colonne = 0; colonne < puissance4.jeu.Colonne; colonne++) { // Création d'une copie du jeu (on doit clôner la matrice sinon il y a une référence) var copiePuissance4 = new Puissance4(puissance4.jeu, (int?[, ])puissance4.matrice.Clone(), puissance4.joueur, puissance4.isJoueur1); // On essaye de positionner le pion dans une colonne de la copie du puissance4 if (copiePuissance4.Placer(colonne).Item1) { var prochainCoup = await Max(copiePuissance4, profondeur - 1, a, b); if (minimumPoints[0] == null || prochainCoup[1] < minimumPoints[1]) { minimumPoints[0] = colonne; minimumPoints[1] = prochainCoup[1]; b = prochainCoup[1]; } if (a >= b && isJoueurAlphaBeta) { return(minimumPoints); } } } return(minimumPoints); }