コード例 #1
0
        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);
        }
コード例 #2
0
ファイル: Puissance4.cs プロジェクト: enicayzer/IAMiashs
        /// <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);
        }