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); }