Exemplo n.º 1
0
 private static void SavingInfoToMap(int positionX_Plus, int positionY_Plus, OrientedField pole)
 {
     jestXY = punkty.Exists(element => element.x.Equals(positionX + positionX_Plus) && element.y.Equals(positionY + positionY_Plus));
     if (!jestXY)
     {
         if (pole.energy == 0)
         {
             punkty.Add(new MapPoint(positionX + positionX_Plus, positionY + positionY_Plus, false, pole.height, pole.obstacle, pole.energy, 1));
         }
         else
         {
             punkty.Insert(0, new MapPoint(positionX + positionX_Plus, positionY + positionY_Plus, false, pole.height, pole.obstacle, pole.energy, 1));
         }
     }
     else
     {
         MapPoint punktTestowany = punkty.Find(element => element.x.Equals(positionX + positionX_Plus) && element.y.Equals(positionY + positionY_Plus));
         punktTestowany.energy = pole.energy;
     }
 }
Exemplo n.º 2
0
        private static Boolean GoToField(OrientedField field)
        {
            for (int i = 0; i < field.y; i++)
            {
                OrientedField pole = GetFirstSeenField();
                if(pole == null)
                {
                    return false;
                }
                StepForward(pole);
            }

            if(field.x > 0)
            {
                RotateRight();
                for (int i = 0; i < field.x; i++)
                {
                    OrientedField pole = GetFirstSeenField();
                    if(pole == null)
                    {
                        return false;
                    }
                    StepForward(pole);
                }
            }
            else if (field.x < 0)
            {
                RotateLeft();
                for (int i = 0; i < (-field.x); i++)
                {
                    OrientedField pole = GetFirstSeenField();
                    if (pole == null)
                    {
                        return false;
                    }
                    StepForward(pole);
                }
            }
            else if (field.x == 0)
            {
                return true;
            }
            return true;
        }
Exemplo n.º 3
0
        /*
         * Metoda pobiera OreintedField, i zwraca Point.
         * Dzięki temu można nanieść pole na stworząną przez agenta mape.
         */
        private static Point GetPoint(OrientedField field)
        {
            switch (Dir)
            {
                case Direction.North:
                    return new Point(CurrentPoint.x + field.x, CurrentPoint.y + field.y);

                case Direction.South:
                    return new Point(CurrentPoint.x - field.x, CurrentPoint.y - field.y);

                case Direction.West:
                    return new Point(CurrentPoint.x - field.y, CurrentPoint.y + field.x);

                case Direction.East:
                    return new Point(CurrentPoint.x + field.y, CurrentPoint.y - field.x);

                default:
                    return new Point(0, 0);
            }
        }
Exemplo n.º 4
0
        /*
        * Zwraca dane pola (nie punktu), na które może przejść w tym momencie agent.
        * Zwraca null jeżeli dane pole jest przeszkodą, lub stoi na nim jakiś inny agent.
        */
        private static OrientedField GetFirstSeenField()
        {
            OrientedField[] widzianePola = agent.Look();
            foreach (OrientedField pole in widzianePola)
            {
                Point p = GetPoint(pole);
                Boolean isVisited = PointIsVisited(p);

                if (pole.x == 0 && pole.y == 0)
                    CurrentField = pole;

                if (pole.agentId > 0)
                {
                    //Say();
                    Console.WriteLine("Agent");
                    continue;
                }

                if (pole.x == 0 && pole.y == 1 && pole.obstacle == false)
                {
                    return pole;
                }
                else if (pole.x == 0 && pole.y == 1 && (pole.obstacle == true || pole.agentId > 0))
                {
                    Console.WriteLine("przeszkoda!");
                    return null;
                }
            }
            Console.WriteLine("Nie ma nic!");
            return null;
        }
Exemplo n.º 5
0
        private static OrientedField GetFirstNotVisitedField()
        {
            OrientedField fieldy = new OrientedField();
            OrientedField field = new OrientedField();
            OrientedField[] widzianePola = agent.Look();

            field = null;
            fieldy = null;

            foreach (OrientedField pole in widzianePola)
            {
                if (pole.x == 0 && pole.y == 0)
                {
                    continue;
                }

                if (pole.obstacle || pole.IsStepable() || pole.agentId > 0)
                {
                    continue;
                }

                Point p = GetPoint(pole);

                if (!PointIsVisited(p) && field.y == 1 && field.x == 0)
                {
                    return pole;
                }

                if (!PointIsVisited(p) && field.y == 1)
                {
                    fieldy = pole;
                }

                if (!PointIsVisited(p))
                {
                    field = pole;
                }

            }
            if (fieldy != null)
            {
                return fieldy;
            }
            if (field != null)
            {
                return field;
            }
            return null;
        }
Exemplo n.º 6
0
        /*
         * Metoda sprawdza, czy w polu widzenia agenta znajduje się jakieś pole z energią.
         * Jeżeli tak, zwraca to pole.
         * Jeżeli nie, zwraca null.
         */
        protected static OrientedField isEnergy()
        {
            OrientedField[] polaEnergii = agent.Look();
            OrientedField pole = new OrientedField();
            int energia = 0;

            foreach (OrientedField field in polaEnergii)
            {
                if (field.x == 0 && field.y == 0)
                {
                    CurrentField = field;
                    continue;
                }

                if (!field.IsStepable() || field.agentId > 0)
                {
                    continue;
                }

                if (field.energy == -1)
                {
                    Point p = GetPoint(field);
                    if (!PointIsVisited(p))
                    {
                        return field;
                    }
                }

                if (field.energy > energia)
                {
                    energia = pole.energy;
                    pole = field;
                }
            }
            if (energia > 0)
            {
                return pole;
            }
            return null;
        }
Exemplo n.º 7
0
        /*
        * Wykonuje krok do przodu i zaopatruje agenta w energię jeżeli takowa jest dostępna na polu.
        */
        public static void StepForward(OrientedField poleDocelowe)
        {
            if (!agent.StepForward())
            {
                throw new NonCriticalException("Wykonanie kroku nie powiodlo sie");
            }

            int koszt = GetMovementCost(poleDocelowe.height);

            // Ustawia nowy punkt układu współrzędnych, w którym znajduje się teraz agent.
            CurrentPoint = GetDestinationPoint();
            CurrentPoint.visitedTimes++;

            // Dodajemy do naszej mapki
            CoordinateSystem.Add(CurrentPoint);

                energy -= Math.Abs(koszt);
                if (debugMode)
                {
                    Console.WriteLine("pobiera energie za krok (" + Math.Abs(koszt) + ")");
                }

            if (poleDocelowe.energy > 0)
            {
                Recharge();
            }
            else if (poleDocelowe.energy == -1)
            {
                while (energy < worldParameters.initialEnergy - 20)
                {
                    Console.WriteLine(energy);
                    Recharge();
                }

                if (!stableEnergyPoints.Exists(x => x.x == CurrentPoint.x && x.y == CurrentPoint.y))
                {
                    stableEnergyPoints.Add(CurrentPoint);
                }

                Console.WriteLine(stableEnergyPoints.Count);
            }
        }
Exemplo n.º 8
0
        private static void SavingInfoToMap(int positionX_Plus, int positionY_Plus, OrientedField pole)
        {
            jestXY = punkty.Exists(element => element.x.Equals(positionX + positionX_Plus) && element.y.Equals(positionY + positionY_Plus));
            if (!jestXY)
            {

                if (pole.energy == 0)
                {
                    punkty.Add(new MapPoint(positionX + positionX_Plus, positionY + positionY_Plus, false, pole.height, pole.obstacle, pole.energy, 1));
                }
                else
                {
                    punkty.Insert(0, new MapPoint(positionX + positionX_Plus, positionY + positionY_Plus, false, pole.height, pole.obstacle, pole.energy, 1));
                }
            }
            else
            {
                MapPoint punktTestowany = punkty.Find(element => element.x.Equals(positionX + positionX_Plus) && element.y.Equals(positionY + positionY_Plus));
                punktTestowany.energy = pole.energy;
            }
        }
Exemplo n.º 9
0
Arquivo: Program.cs Projeto: biksu/KCK
        /**
         * Metoda sprawia, że agent obraca się wokół siebie i sprawdza, które z 4 pól, na które może przejść
         * jest najlepsze pod względem stracenia energii.
         * Po znalezieniu najlepszego pola, przechodzi na nie.
         * Jeżeli znalezione pole to punkt, w którym agent już był, to szukamy drugiego pola.
         * Jeżeli wszystkie odwiedzono to wybieramy najlepsze z nich.
         */
        private void DoBestMovement()
        {
            // Najlepszy punkt na układzie współrzędnych.
            Point bestPoint = new Point(0, 0);

            // Dane najlepszego pola wg. Atlantydy
            OrientedField bestField = new OrientedField();
            bestField.height = 123456789;
            bestField.energy = 0;

            // Pole widziane w danym momencie.
            OrientedField field = new OrientedField();
            OrientedField[] fields = new OrientedField[4];
            field.energy = 0;
            field.height = -12345679;

            fields[0] = field = GetFirstSeenField();
            if (field != null)
            {
                bestPoint = GetDestinationPoint();
                bestField = field;
            }

            RotateLeft();
            System.Threading.Thread.Sleep(500);
            fields[1] = field = GetFirstSeenField();
            if (CompareFields(bestField, field) || PointIsVisited(bestPoint))
            {
                bestPoint = GetDestinationPoint();
                bestField = field;
            }

            RotateLeft();
            System.Threading.Thread.Sleep(500);
            fields[2] = field = GetFirstSeenField();
            if (CompareFields(bestField, field) || PointIsVisited(bestPoint))
            {
                bestPoint = GetDestinationPoint();
                bestField = field;
            }

            RotateLeft();
            System.Threading.Thread.Sleep(500);
            fields[3] = field = GetFirstSeenField();
            if (CompareFields(bestField, field) || PointIsVisited(bestPoint))
            {
                bestPoint = GetDestinationPoint();
                bestField = field;
            }

            if (bestField.height == 123456789)
            {
                foreach (OrientedField f in fields)
                {
                    if (f != null)
                    {
                        bestField = f;
                        break;
                    }
                }
            }

            // Obraca agenta dopóki nie znajdziemy się w odpowiednim położeniu.
            while (GetDestinationPoint().x != bestPoint.x && GetDestinationPoint().y != bestPoint.y)
            {
                RotateLeft();
                System.Threading.Thread.Sleep(500);
            }

            // Przejdź na najlepsze pole.
            StepForward(bestField);
        }
Exemplo n.º 10
0
Arquivo: Program.cs Projeto: biksu/KCK
        public void StepForward(OrientedField poleDocelowe)
        {
            if (!base.StepForward())
            {
                Console.WriteLine("Wykonanie kroku nie powiodlo sie");
                return;
            }

            int koszt = getMovementCost(poleDocelowe.height);
            if (energy >= koszt)
            {
                energy -= koszt;
            }

            if (poleDocelowe.energy != 0)
            {
                Recharge();
            }

            // Ustawia nowy punkt układu współrzędnych, w którym znajduje się teraz agent.
            CurrentPoint = GetDestinationPoint();

            // Dodajemy do naszej mapki
            CoordinateSystem.Add(CurrentPoint);

            Console.WriteLine("Roznica wysokosci:  " + poleDocelowe.height);
            Console.WriteLine("Koszt:  " + koszt);
        }
Exemplo n.º 11
0
Arquivo: Program.cs Projeto: biksu/KCK
        /**
         * Zwraca true jeżeli warto zmienić stare pole na nowe pole.
         */
        public bool CompareFields(OrientedField oldfield, OrientedField newfield)
        {
            if (oldfield == null)
            {
                return true;
            }
            else if (newfield == null)
            {
                return false;
            }

            return ((getMovementCost(newfield.height) + newfield.energy) > (getMovementCost(oldfield.height) + oldfield.energy) || oldfield.energy < 0 || newfield.energy < 0);
        }