public IEnumerable <Percept> GetCurrentTerrain()
        {
            var R = SenseRadius;

            CurrentTerrain.Clear();
            var result = new List <Percept>();

            for (var i = X - R > 0 ? X - R : 0; i <= X + R; i++)
            {
                for (var j = Y; Math.Pow((j - Y), 2) + Math.Pow((i - X), 2) <= Math.Pow(R, 2); j--)
                {
                    if (j < 0 || i >= _terrain.GetLength(0))
                    {
                        break;
                    }
                    // In the circle
                    result.AddRange(CheckTerrain(Mars.TerrainAt(i, j), new Tuple <int, int>(i, j)));
                    CurrentTerrain.Add(new Tuple <int, int>(i, j));
                    UpdatePerceivedCellsDicc(new Tuple <int, int>(i, j));
                }
                for (var j = Y + 1; (j - Y) * (j - Y) + (i - X) * (i - X) <= R * R; j++)
                {
                    if (j >= _terrain.GetLength(1) || i >= _terrain.GetLength(0))
                    {
                        break;
                    }
                    // In the circle
                    result.AddRange(CheckTerrain(Mars.TerrainAt(i, j), new Tuple <int, int>(i, j)));
                    CurrentTerrain.Add(new Tuple <int, int>(i, j));
                    UpdatePerceivedCellsDicc(new Tuple <int, int>(i, j));
                }
            }

            return(result);
        }
 public MarsRover(Mars mars, double [,] terrain, int x, int y, IEnumerable <Belief> initialBeliefs, double runningOver, int senseRadious)
 {
     Mars     = mars;
     X        = x;
     Y        = y;
     _terrain = new double[terrain.GetLength(0), terrain.GetLength(1)];
     Array.Copy(terrain, _terrain, terrain.GetLength(0) * terrain.GetLength(1));
     Beliefs     = new List <Belief>(initialBeliefs);
     Desires     = new Queue <Desire>();
     Intentions  = new Stack <Intention>();
     PlanLibrary = new List <Plan>
     {
         new  Plan(TypesPlan.PathFinding, this),
     };
     WaterFound           = new List <Tuple <int, int> >();
     RunningOverThreshold = runningOver;
     SenseRadius          = senseRadious;
     CurrentTerrain       = new List <Tuple <int, int> >();
     _random         = new Random();
     _perceivedCells = new Dictionary <Tuple <int, int>, int>();
 }
        public TypesAction Action(List <Percept> percepts)
        {
            // Reactive Layer
            if (Mars.WaterAt(X, Y) && !WaterFound.Contains(new Tuple <int, int>(X, Y)))
            {
                return(TypesAction.Dig);
            }

            var waterPercepts = percepts.FindAll(p => p.Type == TypePercept.WaterSpot);

            if (waterPercepts.Count > 0)
            {
                foreach (var waterPercept in waterPercepts)
                {
                    var belief = Beliefs.FirstOrDefault(b => b.Name == TypesBelief.PotentialWaterSpots);
                    List <Tuple <int, int> > pred;
                    if (belief != null)
                    {
                        pred = belief.Predicate as List <Tuple <int, int> >;
                    }
                    else
                    {
                        pred = new List <Tuple <int, int> > {
                            waterPercept.Position
                        };
                        Beliefs.Add(new Belief(TypesBelief.PotentialWaterSpots, pred));
                    }
                    if (!WaterFound.Contains(waterPercept.Position))
                    {
                        pred.Add(waterPercept.Position);
                    }
                    else
                    {
                        pred.RemoveAll(
                            t => t.Item1 == waterPercept.Position.Item1 && t.Item2 == waterPercept.Position.Item2);
                        if (pred.Count == 0)
                        {
                            Beliefs.RemoveAll(b => (b.Predicate as List <Tuple <int, int> >).Count == 0);
                        }
                    }
                }

                if (waterPercepts.Any(p => !WaterFound.Contains(p.Position)))
                {
                    CurrentPlan = null;
                }
            }

            if (Beliefs.Count == 0)
            {
                if (_wanderTimes == WanderThreshold)
                {
                    _wanderTimes = 0;
                    InjectBelief();
                }
                _wanderTimes++;
                return(RandomMove(percepts));
            }
            if (CurrentPlan == null || CurrentPlan.FulFill())
            {
                // Deliberative Layer
                Brf(percepts);
                Options();
                Filter();
            }

            return(CurrentPlan.NextAction());
        }