public void TestDikstraComplexe() { Plateau plateau = new Plateau(9, 9); plateau.AddMur(new Mur(new Position(1, 0), true)); plateau.AddMur(new Mur(new Position(3, 0), true)); plateau.AddMur(new Mur(new Position(4, 1), true)); plateau.AddMur(new Mur(new Position(4, 3), true)); var result = plateau.Dikstra(new Position(0, 0), Direction.DROITE); List <Case> expectedResult = new List <Case>(); expectedResult.Add(plateau.GetCase(0, 1)); expectedResult.Add(plateau.GetCase(0, 2)); expectedResult.Add(plateau.GetCase(1, 2)); expectedResult.Add(plateau.GetCase(2, 2)); expectedResult.Add(plateau.GetCase(3, 2)); expectedResult.Add(plateau.GetCase(3, 1)); expectedResult.Add(plateau.GetCase(3, 0)); expectedResult.Add(plateau.GetCase(4, 0)); expectedResult.Add(plateau.GetCase(5, 0)); expectedResult.Add(plateau.GetCase(6, 0)); expectedResult.Add(plateau.GetCase(7, 0)); expectedResult.Add(plateau.GetCase(8, 0)); Assert.AreEqual(result.Count, expectedResult.Count); for (int i = 0; i < expectedResult.Count; i++) { Assert.AreEqual(expectedResult[i], result[i]); } }
public void TestAddMurVert() { Plateau plateau = new Plateau(2, 2); plateau.AddMur(new Mur(new Position(1, 0), true)); var case1 = plateau.GetCase(0, 0); var case2 = plateau.GetCase(1, 0); var case3 = plateau.GetCase(0, 1); var case4 = plateau.GetCase(1, 1); Assert.IsFalse(case1.Voisines.Contains(case2)); Assert.IsFalse(case2.Voisines.Contains(case1)); Assert.IsTrue(case1.Voisines.Contains(case3)); Assert.IsTrue(case3.Voisines.Contains(case1)); Assert.IsTrue(case2.Voisines.Contains(case4)); Assert.IsTrue(case4.Voisines.Contains(case2)); Assert.IsFalse(case3.Voisines.Contains(case4)); Assert.IsFalse(case4.Voisines.Contains(case3)); Assert.IsFalse(case2.Voisines.Contains(case3)); Assert.IsFalse(case3.Voisines.Contains(case2)); Assert.IsFalse(case1.Voisines.Contains(case4)); Assert.IsFalse(case4.Voisines.Contains(case1)); }
public void TestPlateauEquality() { Plateau plateau1 = new Plateau(9, 9); Player.InitAvailableMur(plateau1); plateau1.AddMur(new Mur(new Position(8, 0), true)); Joueur moi = new Joueur(new Position(1, 0), 0, 10); Joueur opposant = new Joueur(new Position(8, 7), 1, 9); List <Joueur> opposants = new List <Joueur>(); opposants.Add(opposant); plateau1.Joueurs = Player.GetAllJoueurOrder(moi, opposants); Plateau plateau2 = new Plateau(9, 9); Player.InitAvailableMur(plateau2); plateau2.AddMur(new Mur(new Position(8, 0), true)); Joueur moi2 = new Joueur(new Position(1, 0), 0, 10); Joueur opposant2 = new Joueur(new Position(8, 7), 1, 9); List <Joueur> opposants2 = new List <Joueur>(); opposants2.Add(opposant2); plateau2.Joueurs = Player.GetAllJoueurOrder(moi2, opposants2); Assert.AreEqual(plateau1, plateau2); }
public void TestDikstraFromTopToBottom() { Plateau plateau = new Plateau(9, 9); plateau.AddMur(new Mur(new Position(0, 1), false)); var result = plateau.Dikstra(new Position(0, 0), Direction.BAS); List <Case> expectedResult = new List <Case>(); expectedResult.Add(plateau.GetCase(1, 0)); expectedResult.Add(plateau.GetCase(2, 0)); expectedResult.Add(plateau.GetCase(2, 1)); expectedResult.Add(plateau.GetCase(2, 2)); expectedResult.Add(plateau.GetCase(2, 3)); expectedResult.Add(plateau.GetCase(2, 4)); expectedResult.Add(plateau.GetCase(2, 5)); expectedResult.Add(plateau.GetCase(2, 6)); expectedResult.Add(plateau.GetCase(2, 7)); expectedResult.Add(plateau.GetCase(2, 8)); Assert.AreEqual(result.Count, expectedResult.Count); for (int i = 0; i < expectedResult.Count; i++) { Assert.AreEqual(expectedResult[i], result[i]); } }
public void TestMinMaxException() { Plateau plateau = new Plateau(9, 9); Player.InitAvailableMur(plateau); plateau.AddMur(new Mur(new Position(7, 0), true)); plateau.AddMur(new Mur(new Position(7, 2), true)); Joueur moi = new Joueur(new Position(2, 1), 0, 6); Joueur opposant = new Joueur(new Position(8, 3), 1, 6); List <Joueur> opposants = new List <Joueur>(); opposants.Add(opposant); Coup coup; plateau.Joueurs = Player.GetAllJoueurOrder(moi, opposants); int result; var trace = Player.MinMax(plateau, 0, 2, int.MinValue, int.MaxValue, out coup, out result); Assert.AreNotEqual(coup.ToString(), "7 4 H"); }
public void TestDikstraException() { Plateau plateau = new Plateau(9, 9); plateau.AddMur(new Mur(new Position(1, 0), true)); plateau.AddMur(new Mur(new Position(1, 2), true)); plateau.AddMur(new Mur(new Position(1, 4), true)); plateau.AddMur(new Mur(new Position(1, 6), true)); plateau.AddMur(new Mur(new Position(0, 8), false)); plateau.AddMur(new Mur(new Position(2, 7), true)); try { var result = plateau.Dikstra(new Position(0, 8), Direction.DROITE); Assert.Fail(); // raises AssertionException } catch (NoPathException) { } }
/// <summary> /// /// </summary> /// <param name="plateau"></param> /// <param name="joueurs"> la liste des joueurs dans l'ordre du tour en commencant par moi</param> /// <param name="profondeur"></param> /// <param name="profondeurMax"></param> /// <returns></returns> public static MinMaxTrace MinMax(Plateau plateau, int profondeur, int profondeurMax, int alpha, int beta, out Coup meilleurCoup, out int result) { int currentJoueurIndex = profondeur % plateau.Joueurs.Count(); //id du joueurs de la liste dont c'est le tour (0 c'est moi) var trace = new MinMaxTrace(profondeur, currentJoueurIndex == 0, profondeur != profondeurMax); if (profondeur < profondeurMax) { List <Coup> coups = new List <Coup>(); coups.Add(new Coup(Direction.DROITE)); coups.Add(new Coup(Direction.GAUCHE)); coups.Add(new Coup(Direction.HAUT)); coups.Add(new Coup(Direction.BAS)); // pour tout les murs if (plateau.Joueurs[currentJoueurIndex].MurRestant > 0) { foreach (var mur in Player.AvailableMur) { coups.Add(new Coup(mur)); } } int bestEval = currentJoueurIndex == 0 ? int.MinValue : int.MaxValue; Coup bestCoup = null; foreach (var coup in coups) { //Console.Error.WriteLine(profondeur + " " + coup.ToString()); if (coup.Mur != null) { var mur = coup.Mur; if (plateau.AddMur(mur)) { try { int eval; trace.Childrens.Add(MinMax(plateau, profondeur + 1, profondeurMax, alpha, beta, out meilleurCoup, out eval)); //Console.Error.WriteLine("eval " + eval); if (currentJoueurIndex == 0 && eval > bestEval) //MAX { bestEval = eval; bestCoup = coup; alpha = Math.Max(alpha, bestEval); if (beta <= bestEval) { meilleurCoup = bestCoup; result = bestEval; return(trace); } } else if (currentJoueurIndex != 0 && eval < bestEval) //MIN { bestEval = eval; bestCoup = coup; beta = Math.Min(alpha, bestEval); if (bestEval <= alpha) { meilleurCoup = bestCoup; result = bestEval; return(trace); } } } catch (NoPathException) { Console.Error.WriteLine("invalid no issue " + coup.Mur + " " + coup.Dir); } finally { plateau.RemoveMur(mur); } } else if (profondeur == 0 && AvailableMur.Contains(mur)) { AvailableMur.Remove(mur); } } else { Direction direction = (Direction)coup.Dir; var oldPos = plateau.Joueurs[currentJoueurIndex].Pos; var newPos = oldPos.GetPositionInDirection(direction); var test = plateau.GetCase(oldPos).Voisines.Contains(plateau.GetCase(newPos)); if (newPos != null && test) { try { plateau.Joueurs[currentJoueurIndex].Pos = newPos; int eval; trace.Childrens.Add(MinMax(plateau, profondeur + 1, profondeurMax, beta, alpha, out meilleurCoup, out eval)); //Console.Error.WriteLine("eval " + eval); if (currentJoueurIndex == 0 && eval > bestEval) //MAX { bestEval = eval; bestCoup = coup; alpha = Math.Max(alpha, bestEval); if (beta <= bestEval) //coupe beta { meilleurCoup = bestCoup; result = bestEval; return(trace); } } else if (currentJoueurIndex != 0 && eval < bestEval) //MIN { bestEval = eval; bestCoup = coup; beta = Math.Min(beta, bestEval); if (bestEval <= alpha) //coupe alpha { meilleurCoup = bestCoup; result = bestEval; return(trace); } } } catch (Exception e) { Console.Error.WriteLine("invalid no issue " + coup.Mur + " " + coup.Dir); } finally { plateau.Joueurs[currentJoueurIndex].Pos = oldPos; } } } } meilleurCoup = bestCoup; trace.Choix = bestCoup; trace.Eval = bestEval; result = bestEval; return(trace); } else { meilleurCoup = null; var eval = plateau.Evaluation(); trace.Max = null; trace.Eval = eval; result = eval; return(trace); } }
static void Main(string[] args) { string[] inputs; inputs = Console.ReadLine().Split(' '); int w = int.Parse(inputs[0]); // width of the board int h = int.Parse(inputs[1]); // height of the board int playerCount = int.Parse(inputs[2]); // number of players (2 or 3) int myId = int.Parse(inputs[3]); // id of my player (0 = 1st player, 1 = 2nd player, ...) Plateau plateau = new Plateau(w, h); InitAvailableMur(plateau); // game loop while (true) { Joueur moi = null; List <Joueur> opposants = new List <Joueur>(); for (int i = 0; i < playerCount; i++) { inputs = Console.ReadLine().Split(' '); int x = int.Parse(inputs[0]); // x-coordinate of the player int y = int.Parse(inputs[1]); // y-coordinate of the player int wallsLeft = int.Parse(inputs[2]); // number of walls available for the player if (i == myId) { moi = new Joueur(new Position(x, y), myId, wallsLeft); } else if (x != -1 && y != -1) { opposants.Add(new Joueur(new Position(x, y), i, wallsLeft)); } } plateau.Joueurs = GetAllJoueurOrder(moi, opposants); int wallCount = int.Parse(Console.ReadLine()); // number of walls on the board for (int i = 0; i < wallCount; i++) { inputs = Console.ReadLine().Split(' '); int wallX = int.Parse(inputs[0]); // x-coordinate of the wall int wallY = int.Parse(inputs[1]); // y-coordinate of the wall string wallOrientation = inputs[2]; // wall orientation ('H' or 'V') Mur mur = new Mur(new Position(wallX, wallY), wallOrientation == "V"); plateau.AddMur(mur); } /*foreach (var item in plateau.Murs) * { * Console.Error.WriteLine(item.ToString()); * } * * Console.Error.WriteLine("Dikjstra"); * var dik = plateau.Dikstra(moi.Pos, moi.Objectif); * foreach (var item in dik) * { * Console.Error.WriteLine(item.Pos.ToString()); * }*/ // Write an action using Console.WriteLine() // To debug: Console.Error.WriteLine("Debug messages..."); Coup coup; int r; Console.Error.WriteLine("Start MinMax"); var trace = MinMax(plateau, 0, 2, int.MinValue, int.MaxValue, out coup, out r); Console.Error.WriteLine("End MinMax"); Console.Error.WriteLine(trace); Console.Error.WriteLine(r); Console.Error.WriteLine(coup.ToString()); coup.JouerLeCoup(); } }
public static void Play(Plateau plateau, Joueur myPlayer, List <Joueur> opposants) { var move = plateau.Dikstra(myPlayer.Pos, myPlayer.Objectif); var vainqueur = myPlayer; var coupVainqueur = move.Count(); foreach (var joueur in opposants) { var result = plateau.Dikstra(joueur.Pos, joueur.Objectif).Count; if (result < coupVainqueur) { vainqueur = joueur; coupVainqueur = result; } } Mur bestMur = null; int bestCoup = coupVainqueur; if (vainqueur != myPlayer && myPlayer.MurRestant > 0) { var monCoup = move.Count(); Console.Error.WriteLine(" on bloque " + vainqueur.PlayerId); for (int i = 0; i < plateau.Width; i++) { for (int j = 0; j < plateau.Height; j++) { for (int k = 0; k < 2; k++) { var mur = new Mur(new Position(i, j), k == 0); if (plateau.AddMur(mur)) { try { var resultWithMur = plateau.Dikstra(vainqueur.Pos, vainqueur.Objectif).Count; if (resultWithMur > bestCoup) { var monCoupWithMur = plateau.Dikstra(myPlayer.Pos, myPlayer.Objectif).Count; if (monCoup >= monCoupWithMur) { resultWithMur = bestCoup; bestMur = mur; } } } catch (NoPathException) { Console.Error.WriteLine("no issue"); } finally { plateau.RemoveMur(mur); } } } } } if (bestMur != null) { Console.WriteLine(bestMur.ToString()); } else { Console.Error.WriteLine("no wall : try to go " + move[move.Count - 1].Pos.ToString()); myPlayer.MoveToNextCase(move[0]); } } else { Console.Error.WriteLine("try to go " + move[move.Count - 1].Pos.ToString()); myPlayer.MoveToNextCase(move[0]); } }
public void TestAddMurInteresct() { Plateau plateau = new Plateau(9, 9); Assert.IsTrue(plateau.AddMur(new Mur(new Position(1, 1), true))); //Intersection Assert.IsFalse(plateau.AddMur(new Mur(new Position(1, 0), true))); Assert.IsFalse(plateau.AddMur(new Mur(new Position(1, 1), true))); Assert.IsFalse(plateau.AddMur(new Mur(new Position(0, 2), false))); Assert.IsFalse(plateau.AddMur(new Mur(new Position(1, 2), true))); //Out of board Assert.IsFalse(plateau.AddMur(new Mur(new Position(0, 5), true))); Assert.IsFalse(plateau.AddMur(new Mur(new Position(9, 5), true))); Assert.IsFalse(plateau.AddMur(new Mur(new Position(5, 8), true))); Assert.IsFalse(plateau.AddMur(new Mur(new Position(5, 0), false))); Assert.IsFalse(plateau.AddMur(new Mur(new Position(5, 9), false))); Assert.IsFalse(plateau.AddMur(new Mur(new Position(8, 5), false))); //OK Assert.IsTrue(plateau.AddMur(new Mur(new Position(1, 1), false))); Assert.IsTrue(plateau.AddMur(new Mur(new Position(3, 0), true))); Assert.IsTrue(plateau.AddMur(new Mur(new Position(8, 7), true))); Assert.IsTrue(plateau.AddMur(new Mur(new Position(5, 5), true))); Assert.IsTrue(plateau.AddMur(new Mur(new Position(7, 5), false))); }