private bool TryBuildNewComponent(out AiMoveDecision move)
        {
            var queue = new Queue <BuildQueueItem>();
            var used  = new Dictionary <int, BuildQueueItem>();

            foreach (var mineV in graph.GetNotOwnedMines(state.punter))
            {
                var queueItem = new BuildQueueItem
                {
                    CurrentVertex = mineV,
                    SourceMine    = mineV,
                    FirstEdge     = null
                };

                queue.Enqueue(queueItem);
                used.Add(mineV.Id, queueItem);
            }

            while (queue.Count > 0)
            {
                var current = queue.Dequeue();
                foreach (var edge in current.CurrentVertex.Edges.Where(x => x.CanBeOwnedBy(state.punter, allowToUseOptions)))
                {
                    var            next = graph.Vertexes[edge.To];
                    BuildQueueItem prev;
                    if (used.TryGetValue(next.Id, out prev))
                    {
                        if (prev.SourceMine != current.SourceMine)
                        {
                            var bestMine = SelectBestMine(prev.SourceMine, current.SourceMine);
                            if (bestMine == prev.SourceMine)
                            {
                                var edge1 = prev.FirstEdge ?? edge;
                                move = AiMoveDecision.ClaimOrOption(edge1, state.punter, allowToUseOptions);
                                return(true);
                            }
                            if (bestMine == current.SourceMine)
                            {
                                var edge1 = current.FirstEdge ?? edge;
                                move = AiMoveDecision.ClaimOrOption(edge1, state.punter, allowToUseOptions);
                                return(true);
                            }
                        }
                    }
                    else
                    {
                        var queueItem = new BuildQueueItem
                        {
                            CurrentVertex = next,
                            SourceMine    = current.SourceMine,
                            FirstEdge     = current.FirstEdge ?? edge
                        };
                        queue.Enqueue(queueItem);
                        used.Add(next.Id, queueItem);
                    }
                }
            }
            move = null;
            return(false);
        }
        private AiMoveDecision TryGetNextMove()
        {
            var sitesToDefend = state.aiSetupDecision.futures.SelectMany(f => new[] { f.source, f.target }).ToArray();
            var edge          = new MovesSelector(allowToUseOptions, state.map, graph, sitesToDefend, state.punter).GetNeighbourToGo();

            if (edge != null)
            {
                return(AiMoveDecision.ClaimOrOption(edge, state.punter, allowToUseOptions, "futures cant wait!!1"));
            }
            return(null);
        }
            public List <TurnResult> NextTurns()
            {
                Init();

                return(edgesToBlock.Keys
                       .Select(
                           edge => new TurnResult
                {
                    Estimation = EstimateWeight(edge),
                    Move = AiMoveDecision.ClaimOrOption(edge, PunterId, allowToUseOptions)
                })
                       .Where(river => river.Estimation > 0)
                       .ToList());
            }
示例#4
0
        private bool TryExtendComponent(out AiMoveDecision move)
        {
            //TODO Сейчас увеличивает первую попавшуюся компоненту. А может быть нужно расширять самую большую компоненту.
            var queue = new Queue <ExtendQueueItem>();
            var used  = new HashSet <int>();

            foreach (var mineV in graph.GetNotOwnedMines(state.punter))
            {
                var queueItem = new ExtendQueueItem
                {
                    CurrentVertex = mineV,
                    Edge          = null
                };

                queue.Enqueue(queueItem);
                used.Add(mineV.Id);
            }
            while (queue.Count > 0)
            {
                var current = queue.Dequeue();
                if (current.CurrentVertex.Edges.Any(x => x.IsOwnedBy(state.punter)))
                {
                    move = AiMoveDecision.ClaimOrOption(current.Edge, state.punter, allowToUseOptions);
                    return(true);
                }
                foreach (var edge in current.CurrentVertex.Edges.Where(x => x.CanBeOwnedBy(state.punter, allowToUseOptions)))
                {
                    var next = graph.Vertexes[edge.To];
                    if (!used.Contains(next.Id))
                    {
                        var queueItem = new ExtendQueueItem
                        {
                            CurrentVertex = next,
                            Edge          = edge
                        };
                        queue.Enqueue(queueItem);
                        used.Add(next.Id);
                    }
                }
            }
            move = null;
            return(false);
        }
        public List <TurnResult> NextTurns()
        {
            var calculator = new ConnectedCalculator(Graph, PunterId);
            var result     = new List <TurnResult>();

            foreach (var vertex in Graph.Vertexes.Values)
            {
                foreach (var edge in vertex.Edges.Where(x => x.CanBeOwnedBy(PunterId, allowToUseOptions)))
                {
                    var fromMines = calculator.GetConnectedMines(edge.From);
                    var toMines   = calculator.GetConnectedMines(edge.To);
                    var fromScore = CalcVertexScore(toMines, fromMines, edge.From);
                    var toScore   = CalcVertexScore(fromMines, toMines, edge.To);
                    var addScore  = AggregateEdgeScores(fromScore, toScore);
                    result.Add(
                        new TurnResult
                    {
                        Estimation = addScore,
                        Move       = AiMoveDecision.ClaimOrOption(edge, PunterId, allowToUseOptions)
                    });
                }
            }
            return(result);
        }