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