private Point TryCreateLine(List <Point> allowedPoints)
        {
            var lines = new List <List <Point> >();

            foreach (var line in Info.GameGeometry.Lines)
            {
                if (line.All(point => BadgesField[point] == null))
                {
                    continue;
                }
                if (line.Any(point => Opponents.Contains(BadgesField[point])))
                {
                    continue;
                }
                lines.Add(line);
            }
            var random = new Random();

            foreach (var line in lines.OrderByDescending(line => line.Count(point => BadgesField[point] != null)))
            {
                if (allowedPoints.Any(allowedPoint => line.Contains(allowedPoint)))
                {
                    var points  = line.Where(point => BadgesField[point] == null);
                    var allowed = points.Where(allowedPoints.Contains).ToArray();
                    if (allowed.Length > 0)
                    {
                        return(allowed[random.Next(allowed.Length)]);
                    }
                }
            }
            return(null);
        }
Пример #2
0
        public void AddOpponent(Team team)
        {
            //Contract.Requires<InvalidOperationException>(!Opponents.Contains(team), $"{this} already played against {team}!");
            if (Opponents.Contains(team))
            {
                Log.Fatal($"!!! Duplicate Matchup recorded: {this} - {team} !!!");
                throw new InvalidOperationException($"{this} already played against {team}!");
            }

            Contract.EndContractBlock();

            Opponents.Add(team);
        }
        private Point MakeBestRandomStep(List <Point> allowedPoints)
        {
            var lines = new List <List <Point> >();

            //lines.AddRange(Lines.Except(Lines.Where(line => line.Any(dot => Opponents.Contains(BadgesField[dot])))));
            foreach (var line in Info.GameGeometry.Lines)
            {
                if (line.Any(dot => Opponents.Contains(BadgesField[dot])))
                {
                    continue;
                }
                lines.Add(line);
            }
            var maxCount   = 0;
            var bestPoints = new List <Point>();

            foreach (var point in Info.GameGeometry.Points)
            {
                var temp = lines.Count(line => line.Contains(point));
                if (temp > maxCount)
                {
                    maxCount = temp;
                }
            }
            foreach (var point in Info.GameGeometry.Points)
            {
                var temp = lines.Count(line => line.Contains(point));
                if (temp == maxCount)
                {
                    bestPoints.Add(point);
                }
            }
            var random = new Random();

            if (lines.Count == 0)
            {
                var emptyPoints = BadgesField.Keys.Where(x => BadgesField[x] == null).Where(allowedPoints.Contains).ToArray();
                return(emptyPoints[random.Next(emptyPoints.Length)]);
            }
            var allowed = new List <Point>();

            if (allowedPoints.Any(allowedPoint => bestPoints.Contains(allowedPoint)))
            {
                allowed.AddRange(bestPoints.Where(allowedPoints.Contains));
            }
            if (allowed.Count > 0)
            {
                return(allowed[random.Next(allowed.Count)]);
            }
            return(allowedPoints.First());
        }
Пример #4
0
 public bool HasPlayed(Team team)
 {
     return(Opponents.Contains(team));
 }
        private Point TryCreateFork(List <Point> allowedPoints)
        {
            var lines = new List <List <Point> >();

            foreach (var line in Info.GameGeometry.Lines)
            {
                if (line.All(point => BadgesField[point] == null))
                {
                    continue;
                }
                if (line.Any(point => Opponents.Contains(BadgesField[point])))
                {
                    continue;
                }
                if (line.Count(point => BadgesField[point] == PlayerFor) < Info.BadgesToWin - 2)
                {
                    continue;
                }
                lines.Add(line);
            }

            var intersectedLines = new List <List <Point> >();

            foreach (var line in lines)
            {
                foreach (var emptyPoint in line.Where(point => BadgesField[point] == null))
                {
                    foreach (var intersectedLine in Info.GameGeometry.Lines)
                    {
                        if (!intersectedLine.Contains(emptyPoint))
                        {
                            continue;
                        }
                        if (intersectedLine.Any(point => Opponents.Contains(BadgesField[point])))
                        {
                            continue;
                        }
                        if (intersectedLine.Count(point => line.Contains(point)) > 1)
                        {
                            continue;
                        }
                        if (ReferenceEquals(line, intersectedLine)) // redundant code
                        {
                            continue;
                        }
                        intersectedLines.Add(intersectedLine);
                    }
                }
            }

            var random = new Random();

            foreach (var intersectedLine in intersectedLines.OrderByDescending(line => line.Count(point => BadgesField[point] != null)))
            {
                if (allowedPoints.Any(allowedPoint => intersectedLine.Contains(allowedPoint)))
                {
                    var forkPoint = intersectedLine.Where(point => BadgesField[point] == null).FirstOrDefault(point => lines.Any(line => line.Contains(point)));
                    var points    = intersectedLine.Where(point => BadgesField[point] == null).Except(new[] { forkPoint });
                    var allowed   = points.Where(allowedPoints.Contains).ToArray();
                    if (allowed.Length > 0)
                    {
                        return(allowed[random.Next(allowed.Length)]);
                    }
                }
            }
            return(null);
        }