// //fonction de base du minimax qui va s'occuper de la profondeur itérative. // override public Move GetNextMove(Grille grille, int profondeur) { double valeurOptimal = Double.MinValue; Move moveOptimal = null; stopwatch = new Stopwatch(); stopwatch.Start(); HashSet <Move> possibleMoves = grille.ListPossibleMoves(); while (true) { foreach (var possibleMove in possibleMoves) { Grille moveGrille = new Grille(grille); moveGrille.UpdateGrille(possibleMove); moveGrille.ReverseBoard(); double valeurTest = Execute(moveGrille, profondeur - 1, valeurOptimal, Double.MaxValue); if (valeurTest > valeurOptimal) { valeurOptimal = valeurTest; moveOptimal = possibleMove; } if (stopwatch.Elapsed.TotalMilliseconds > Settings.TIME_TO_MOVE) { stopwatch.Stop(); return(moveOptimal); } } profondeur++; } }
// // Cette fonction retourne la liste de tous les moves possible pour la grille. // private void GetPossibleMoves(Grille grille, List <Tuple <int, int> > listeMoves) { bool foundPossibleMove = false; for (int i = 0; i < grille.dice.Count; i++) { var possibleMovesForDie = GetPossibleMovesForDie(grille, grille.dice[i]); if (possibleMovesForDie.Count != 0) { foundPossibleMove = true; foreach (var move in possibleMovesForDie) { Grille moveGrille = new Grille(grille); moveGrille.UpdateGrille(move); List <Tuple <int, int> > moveListe = new List <Tuple <int, int> >(listeMoves); moveListe.Add(move); GetPossibleMoves(moveGrille, moveListe); } } } if (!foundPossibleMove && listeMoves.Count > 0)// on est dans une feuille, on ajoute le move a la liste. { Move move = new Move(listeMoves); if (maxDice <= move.DiceUsed && maxStep <= move.Step) { listPossibleMoves.Add(move); maxStep = move.Step; maxDice = move.DiceUsed; } } }
override public Move GetNextMove(Grille grille, int profondeur) { double valeurOptimal = Double.MinValue; Move moveOptimal = null; HashSet <Move> possibleMoves = grille.ListPossibleMoves(); foreach (var possibleMove in possibleMoves) { Grille moveGrille = new Grille(grille); moveGrille.UpdateGrille(possibleMove); moveGrille.ReverseBoard(); double valeurTest = Execute(moveGrille, profondeur - 1); if (valeurTest > valeurOptimal) { valeurOptimal = valeurTest; moveOptimal = possibleMove; } } return(moveOptimal); }
override public double Execute(Grille grille, int profondeur) { if (profondeur == 0) // on est au bout. { Grille grillePourEnnemi = new Grille(grille); grillePourEnnemi.ReverseBoard(); double test = this.heuristique.Calculer(grille) - this.heuristique.Calculer(grillePourEnnemi); if (grille.player) { return(test); } else { return(-test); } } if (grille.dice.Count > 0) // un joueur peut jouer. { if (grille.player) // on joue { HashSet <Move> possibleMoves = grille.ListPossibleMoves(); double value = double.MinValue; foreach (var possibleMove in possibleMoves) { Grille moveGrille = new Grille(grille); moveGrille.UpdateGrille(possibleMove); moveGrille.ReverseBoard(); value = Math.Max(value, Execute(moveGrille, profondeur - 1)); } return(value); } else //l'adversaire joue. { HashSet <Move> possibleMoves = grille.ListPossibleMoves(); double value = double.MaxValue; foreach (var possibleMove in possibleMoves) { Grille moveGrille = new Grille(grille); moveGrille.UpdateGrille(possibleMove); moveGrille.ReverseBoard(); value = Math.Max(value, Execute(moveGrille, profondeur - 1)); } return(value); } } else // on est dans notre cas random. { double value = 0; double[] values = new double[Player.possibleDiceRoll.Count + 1]; Thread[] threads = new Thread[Player.possibleDiceRoll.Count + 1]; int i = 0; for (i = 0; i < Player.possibleDiceRoll.Count; i++) { Grille diceGrille = new Grille(grille); diceGrille.dice = Player.possibleDiceRoll[i].Item2; int num = i; threads[i] = new Thread(delegate() { values[num] = Player.possibleDiceRoll[num].Item1 * Execute(diceGrille, profondeur); }); threads[i].Start(); } for (int j = 0; j < Player.possibleDiceRoll.Count; j++) { threads[j].Join(); value += values[j]; } return(value); } }
public double Execute(Grille grille, int profondeur, double alpha, double beta) { if (profondeur == 0) // on est au bout. { Grille grillePourEnnemi = new Grille(grille); grillePourEnnemi.ReverseBoard(); double test = this.heuristique.Calculer(grille) - this.heuristique.Calculer(grillePourEnnemi); if (grille.player) { return(test); } else { return(-test); } } if (grille.dice.Count > 0) // un joueur peut jouer. { if (grille.player) // on joue { HashSet <Move> possibleMoves = grille.ListPossibleMoves(); foreach (var possibleMove in possibleMoves) { Grille moveGrille = new Grille(grille); moveGrille.UpdateGrille(possibleMove); moveGrille.ReverseBoard(); alpha = Math.Max(alpha, Execute(moveGrille, profondeur - 1, alpha, beta)); if (beta <= alpha) { break; } if (stopwatch.Elapsed.TotalMilliseconds > Settings.TIME_TO_MOVE) { stopwatch.Stop(); return(alpha); } } return(alpha); } else //l'adversaire joue. { HashSet <Move> possibleMoves = grille.ListPossibleMoves(); foreach (var possibleMove in possibleMoves) { Grille moveGrille = new Grille(grille); moveGrille.UpdateGrille(possibleMove); moveGrille.ReverseBoard(); beta = Math.Min(beta, Execute(moveGrille, profondeur - 1, alpha, beta)); if (beta <= alpha) { break; } if (stopwatch.Elapsed.TotalMilliseconds > Settings.TIME_TO_MOVE) { stopwatch.Stop(); return(beta); } } return(beta); } } else // on est dans notre cas random. { double value = 0; double[] values = new double[Player.possibleDiceRoll.Count + 1]; Thread[] threads = new Thread[Player.possibleDiceRoll.Count + 1]; int i = 0; for (i = 0; i < Player.possibleDiceRoll.Count; i++) { if (stopwatch.Elapsed.TotalMilliseconds > Settings.TIME_TO_MOVE) { stopwatch.Stop(); return(value); } Grille diceGrille = new Grille(grille); diceGrille.dice = Player.possibleDiceRoll[i].Item2; int num = i; threads[i] = new Thread(delegate() { values[num] = Player.possibleDiceRoll[num].Item1 * Execute(diceGrille, profondeur, alpha, beta); }); threads[i].Start(); } for (int j = 0; j < Player.possibleDiceRoll.Count; j++) { threads[j].Join(); value += values[j]; } return(value); } }