Exemple #1
0
        /// <summary>
        /// Clone le plateau : renvoie une nouvelle version du plateau, codée de manière identique.
        /// </summary>
        /// <returns>Retourne une nouvelle version du plateau, clonée.</returns>
        public Plateau Clone(Morpion morpion)
        {
            Plateau p    = new Plateau(morpion);
            bool    isJ1 = true;

            for (int x = 0; x < 3; x++)
            {
                for (int y = 0; y < 3; y++)
                {
                    p.GetCase(x, y).Marquer(this.GetCase(x, y).Joueur);

                    if (this.GetCase(x, y).Joueur != null)
                    {
                        isJ1 = !isJ1;
                    }
                }
            }

            // Mise à jour du joueur courant
            if (!isJ1)
            {
                morpion.JoueurCourant = morpion.Joueur2;
            }


            return(p);
        }
        public int Minimax(PlateauRestreint p, bool maximizingPlayer)
        {
            int res;

            if (p.VerifierVictoire() == p.Joueur1)
            {
                // Victoire du joueur 1 : retourne 1.
                res = 1;
            }
            else if (p.VerifierVictoire() == p.Joueur2)
            {
                // Victoire du joueur 2 : retourne -1.
                res = -1;
            }
            else if (p.VerifierPlateauRempli())
            {
                // Match nul : retourne 0.
                res = 0;
            }
            else
            {
                // Not terminal node

                List <Position> positionsLibres = this.GetPositionsLibres(p);

                if (maximizingPlayer)
                {
                    // foreach child of node
                    res = -5000;
                    foreach (Position pos in positionsLibres)
                    {
                        // Création d'une copie de plateau
                        Morpion morpionClone = new Morpion();
                        morpionClone.Initialisation(p.Joueur1, p.Joueur2);
                        morpionClone.PlateauJeu = p.Clone(morpionClone);

                        morpionClone.Tour(pos.X, pos.Y);
                        res = Math.Max(res, this.Minimax(morpionClone.PlateauRestreint, false));
                    }
                }
                else
                {
                    // foreach child of node
                    res = +5000;
                    foreach (Position pos in positionsLibres)
                    {
                        // Création d'une copie de plateau
                        Morpion morpionClone = new Morpion();
                        morpionClone.Initialisation(p.Joueur1, p.Joueur2);
                        morpionClone.PlateauJeu = p.Clone(morpionClone);

                        morpionClone.Tour(pos.X, pos.Y);
                        res = Math.Min(res, this.Minimax(morpionClone.PlateauRestreint, true));
                    }
                }
            }

            return(res);
        }
        public override Position Jouer()
        {
            //Move move = this.EvaluationPosition(this.Plateau, true);
            //return move.Position;

            List <Position> positionsLibres   = this.GetPositionsLibres(this.Plateau);
            List <Position> bestPositionsList = new List <Position>();

            int bestEval = -67736;

            foreach (Position pos in positionsLibres)
            {
                Morpion morpionClone = new Morpion();
                morpionClone.Initialisation(this.Plateau.Joueur1, this.Plateau.Joueur2);
                morpionClone.PlateauJeu = this.Plateau.Clone(morpionClone);


                if (morpionClone.JoueurCourant == morpionClone.Joueur1)
                {
                    morpionClone.Tour(pos.X, pos.Y);
                    int eval = this.Minimax(morpionClone.PlateauRestreint, false);
                    if (bestPositionsList.Count == 0 || eval == bestEval)
                    {
                        bestPositionsList.Add(pos);
                        bestEval = eval;
                    }
                    else if (eval > bestEval)
                    {
                        bestPositionsList.Clear();
                        bestPositionsList.Add(pos);
                        bestEval = eval;
                    }
                }
                else
                {
                    morpionClone.Tour(pos.X, pos.Y);
                    int eval = this.Minimax(morpionClone.PlateauRestreint, true);
                    if (bestPositionsList.Count == 0 || eval == bestEval)
                    {
                        bestPositionsList.Add(pos);
                        bestEval = eval;
                    }
                    else if (eval < bestEval)
                    {
                        bestPositionsList.Clear();
                        bestPositionsList.Add(pos);
                        bestEval = eval;
                    }
                }
            }
            Random   rand         = new Random();
            int      index        = rand.Next(bestPositionsList.Count);
            Position bestPosition = bestPositionsList[index];

            return(bestPosition);
        }
Exemple #4
0
        /// <summary>
        /// Constructeur de la classe Plateau.
        /// </summary>
        /// <param name="m"></param>
        public Plateau(Morpion m)
        {
            this.morpion = m;

            // Initialisation du plateau
            this.cases = new Case[3, 3];
            for (int i = 0; i < 3; i++)
            {
                for (int j = 0; j < 3; j++)
                {
                    this.cases[i, j] = new Case(this, i, j);
                }
            }
        }
 /// <summary>
 /// Clone le plateau : renvoie une nouvelle version du plateau, codée de manière identique.
 /// </summary>
 /// <returns>Retourne une nouvelle version du plateau, clonée.</returns>
 public Plateau Clone(Morpion morpion)
 {
     return(this.plateau.Clone(morpion));
 }