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