Пример #1
0
        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]);
            }
        }
Пример #2
0
        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));
        }
Пример #3
0
        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);
        }
Пример #4
0
        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]);
            }
        }
Пример #5
0
        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");
        }
Пример #6
0
        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)
            {
            }
        }
Пример #7
0
    /// <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);
        }
    }
Пример #8
0
    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();
        }
    }
Пример #9
0
    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]);
        }
    }
Пример #10
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)));
        }