private void Fill(int index, Vec target)
        {
            var tick = bots[index].Tick;

            if (!ToFill.ContainsKey(tick))
            {
                ToFill[tick] = new List <Vec>();
            }
            ToFill[tick].Add(target);

            AddCommand(bots[index], new Fill(new NearDifference(target - bots[index].Position)));
            filled[target] = true;
            oracle.Fill(target);
        }
        protected override async StrategyTask <bool> Run()
        {
            var candidates = BuildCandidates();

            while (candidates.Any())
            {
                var candidatesAndPositions = OrderCandidates(candidates);
                var any = false;
                foreach (var(candidate, nearPosition) in candidatesAndPositions)
                {
                    if (!await new FillVoxel(state, bot, candidate, nearPosition))
                    {
                        continue;
                    }

                    oracle.Fill(candidate);
                    any = true;

                    candidates.Remove(candidate);
                    foreach (var neighbor in candidate.GetMNeighbours(state.Matrix))
                    {
                        if (state.TargetMatrix[neighbor] && !state.Matrix[neighbor])
                        {
                            candidates.Add(neighbor);
                        }
                    }
                    break;
                }
                if (!any)
                {
                    throw new Exception("Can't move");
                }
            }
            await new Move(state, bot, Vec.Zero);
            await Do(new Halt());

            return(true);
        }
 private void Fill(Vec target)
 {
     Commands.Add(new Fill(new NearDifference(target - pos)));
     state.Set(target, true);
     oracle.Fill(target);
 }
Пример #4
0
 private void Fill(int bot, Vec target, List <ICommand> commands)
 {
     commands.Add(new Fill(new NearDifference(target - pos[bot])));
     state.Set(target, true);
     oracle.Fill(target);
 }