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()); }