Esempio n. 1
0
    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);
                }
            }
        }
    }
Esempio n. 2
0
    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);
    }
Esempio n. 3
0
    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);
    }