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