public bool IsFrozen(IDependencyState <T> state) { var targets = TargetsTaken.Where(x => x.Value.Contains(state)) .Select(x => x.Key) .Concat(state.NextTargets) .ToList(); var dependingStates = targets.SelectMany(x => DependanciesTaken.Where(d => d.Key.Equals(x)).SelectMany(d => d.Value).Concat(UnboundedDependancyTaken)); return(dependingStates.Any(x => !x.Equals(state) && !IsCompleted(x))); }
// Reset anything that has taken a dependency on this state public void ResetDependenciesOf(IDependencyState <T> state) { var targets = TargetsTaken.Where(x => x.Value.Contains(state)) .Select(x => x.Key) .ToList(); // Reset bounded dependencies taken foreach (var dependancy in targets.Where(DependanciesTaken.ContainsKey)) { ResetSet(state, DependanciesTaken[dependancy]); } // Reset unbounded dependencies taken ResetSet(state, UnboundedDependancyTaken); // clear targets foreach (var target in targets) { TargetsTaken[target].Remove(state); } }
public void Update(IDependencyState <T> state) { // Manage dependencies and targets taken foreach (var dependancy in state.NextDependencies) { if (!DependanciesTaken.ContainsKey(dependancy)) { DependanciesTaken[dependancy] = new HashSet <IDependencyState <T> >(); } DependanciesTaken[dependancy].Add(state); } if (state.NextUnboundDependency) { UnboundedDependancyTaken.Add(state); } foreach (var target in state.NextTargets) { if (!TargetsTaken.ContainsKey(target)) { TargetsTaken[target] = new HashSet <IDependencyState <T> >(); } TargetsTaken[target].Add(state); } }
public override BotletMove GetMove() { if (Square.DistanceFrom(Grid.EnemySpawn) < 2) { return(GetMoveToTarget(Grid.EnemySpawn)); } else if (Square.DistanceFrom(Grid.EnemySpawn) < 10 && SquareNextToEdge()) { var edgeSquare = Square.GetAdjacentSquares().FirstOrDefault(x => SquareOnEdge(x) && !TargetsTaken.Contains(x)); if (edgeSquare != null) { return(GetMoveToTarget(edgeSquare)); } } else if (SquareOnEdge(Square)) { var currentDistance = Square.DistanceFrom(Grid.EnemySpawn); var nextSquareOnEdge = Square.GetAdjacentSquares().FirstOrDefault(x => SquareOnEdge(x) && x.DistanceFrom(Grid.EnemySpawn) < currentDistance); if (nextSquareOnEdge != null) { return(GetMoveToTarget(nextSquareOnEdge)); } } return(GetMoveToTarget(Grid.EnemySpawn)); //var meetupPoints = GetMeetupPoints(Grid); //var occupiedSquares = Army.Select(x => x.Square); //var unOccupiedMeetupPonts = meetupPoints.Where(x => !occupiedSquares.Contains(x)); //var meetupsToMoveTo = unOccupiedMeetupPonts.Where(TargetsTaken.Contains).ToList(); //if (meetupsToMoveTo.Any()) //{ // return GetMoveToTarget(meetupsToMoveTo.First()); //} //else //{ // if (Grid.EnemySpawn.X == 1) // { // var nextSquare = Grid[Square.X, Square.Y - 1]; // return new BotletMove(Square.LineIndex, nextSquare.LineIndex); // } // else // { // var nextSquare = Grid[Square.X, Square.Y + 1]; // return new BotletMove(Square.LineIndex, nextSquare.LineIndex); // } //} }