예제 #1
0
        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);
        }
예제 #2
0
        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);
        }