private void UpdateActiveOf(Position hq) { List <Position> fromHq = ReachablePositions.Where(p => Map[p.X, p.Y].Owner == Map[hq.X, hq.Y].Owner).ToList(); foreach (var pos in fromHq) { Map[pos.X, pos.Y].Active = false; } List <Position> visited = new List <Position>(); List <Position> toCheck = new List <Position>(); toCheck.Add(hq); while (toCheck.Count > 0) { Position current = toCheck[0]; toCheck.Remove(current); visited.Add(current); Map[current.X, current.Y].Active = true; var arounds = current.Arounds(); arounds.RemoveAll(p => Map[p.X, p.Y].Owner != Map[hq.X, hq.Y].Owner); foreach (var around in arounds) { if (!visited.Exists(p => p == around) && !toCheck.Exists(p => p == around)) { toCheck.Add(around); } } } }
public bool CanGoOn(int level, Position target) { // Check if we can reach the position if (!ReachablePositions.Exists(p => p == target)) { return(false); } Tile targetTile = Map[target.X, target.Y]; if (targetTile.IsOwned && targetTile.IsOccupied) { return(false); } // If the tile is opponent we check if we have the power to Go if (targetTile.IsOpponent) { Building opponentBuilding = targetTile.OccupiedBy as Building; Unit opponentUnit = targetTile.OccupiedBy as Unit; switch (level) { case 1: if (IsDefended(target)) { return(false); } if (opponentBuilding != null && opponentBuilding.IsTower) { return(false); } if (opponentUnit != null) { return(false); } break; case 2: if (IsDefended(target)) { return(false); } if (opponentBuilding != null && opponentBuilding.IsTower) { return(false); } if (opponentUnit != null && opponentUnit.Level > 1) { return(false); } break; case 3: break; } } return(true); }
private int CalculCutBenefit(Position hq, List <Position> limit) { if (limit.Exists(p => p == hq)) { return(int.MaxValue); } List <Position> fromHq = ReachablePositions.Where(p => Map[p.X, p.Y].Owner == Map[hq.X, hq.Y].Owner).ToList(); fromHq.RemoveAll(p => !Map[p.X, p.Y].Active); foreach (var pos in fromHq) { Map[pos.X, pos.Y].Active = false; } List <Position> visited = new List <Position>(); List <Position> toCheck = new List <Position>(); toCheck.Add(hq); while (toCheck.Count > 0) { Position current = toCheck[0]; toCheck.Remove(current); visited.Add(current); Map[current.X, current.Y].Active = true; var arounds = current.Arounds(); arounds.RemoveAll(p => Map[p.X, p.Y].Owner != Map[hq.X, hq.Y].Owner); foreach (var around in arounds) { if (!visited.Exists(p => p == around) && !toCheck.Exists(p => p == around) && !limit.Exists(p => p == around)) { toCheck.Add(around); } } } int benefit = 0; var positionsCut = fromHq.ToList(); positionsCut.RemoveAll(p => Map[p.X, p.Y].Active); foreach (var pos in positionsCut) { Building tileBuilding = Map[pos.X, pos.Y].OccupiedBy as Building; Unit tileUnit = Map[pos.X, pos.Y].OccupiedBy as Unit; if (tileBuilding != null) { benefit += 1; if (tileBuilding.IsMine) { benefit += BUILD_COST_MINE / 2 + 4; } if (tileBuilding.IsTower) { if (limit.Exists(p => p == pos)) { benefit += BUILD_COST_TOWER; } else { benefit += BUILD_COST_TOWER / 3; } } } else if (tileUnit != null) { switch (tileUnit.Level) { case 1: benefit += TRAIN_COST_LEVEL_1 - UPKEEP_COST_LEVEL_1; break; case 2: benefit += TRAIN_COST_LEVEL_2 - UPKEEP_COST_LEVEL_2; break; case 3: if (tileUnit.GetBorders().Exists(p => IsDefended(p))) { benefit += BUILD_COST_TOWER; } benefit += TRAIN_COST_LEVEL_3 - UPKEEP_COST_LEVEL_3; break; } } else { benefit += 1; } } foreach (var pos in fromHq) { Map[pos.X, pos.Y].Active = true; } foreach (var pos in limit) { int level = 1; while (!CanGoOn(level, pos) && level < 3) { level++; } switch (level) { case 1: benefit -= UPKEEP_COST_LEVEL_1; break; case 2: benefit -= UPKEEP_COST_LEVEL_2; break; case 3: benefit -= UPKEEP_COST_LEVEL_3 / 2; break; } } return(positionsCut.Count == limit.Count ? 0 : benefit); }