private static void AddSet(BommenBepalerStatsIteratie iteratie, int bommenErIn, List <Vakje> vakjes) { var set = new VakjeSet(bommenErIn, vakjes); foreach (var unrevealed in vakjes) { unrevealed.VakjeBerekeningen.Sets.Add(set); } }
public static BommenBepalerStatsIteratie BepaalBommen(Vakje[,] deVakjesArray, int width, int height, BotConfig botConfig) { var iteratie = new BommenBepalerStatsIteratie(); //Clear de sets var flatVakjes = TwoDimensionalArrayHelper.Flatten(deVakjesArray).Where(t => t != null); foreach (var vakje in flatVakjes) { vakje.VakjeBerekeningen.Sets.Clear(); } var alleUnrevealedDieMisschienEenBomZijn = flatVakjes.Where(t => !t.Revealed && t.VakjeBerekeningen.BerekendVakjeType != BerekendVakjeType.GuaranteedNoBom).ToList(); var theBigUnrevealedSet = new VakjeSet(51 - flatVakjes.Count(t => t.IsBomb), alleUnrevealedDieMisschienEenBomZijn); foreach (var unrev in alleUnrevealedDieMisschienEenBomZijn) { unrev.VakjeBerekeningen.TheBigUnrevealedSet = theBigUnrevealedSet; } foreach (var vakje in flatVakjes) { var bommenOmMeHeen = vakje.SurroundingVakjes.Count(t => t.IsBomb); var unrevealedTilesOmMeHeenZonderGuaranteedNoBom = vakje.SurroundingVakjes.Where(t => !t.Revealed && t.VakjeBerekeningen.BerekendVakjeType != BerekendVakjeType.GuaranteedNoBom).ToList(); var unrevealedTilesOmMeHeen = vakje.SurroundingVakjes.Where(t => !t.Revealed).ToList(); if (vakje.IsNumber && vakje.Number - bommenOmMeHeen == unrevealedTilesOmMeHeenZonderGuaranteedNoBom.Count) { foreach (var unrevealed in unrevealedTilesOmMeHeenZonderGuaranteedNoBom) { if (unrevealed.VakjeBerekeningen.BerekendVakjeType != BerekendVakjeType.GuaranteedBom) { unrevealed.VakjeBerekeningen.BerekendVakjeType = BerekendVakjeType.GuaranteedBom; iteratie.Vondsten.Add(new BommenBepalerStatsIteratieVondst(iteratie, unrevealed, VondstType.SimpleGuaranteedBomb)); } } } else if (vakje.IsNumber && vakje.Number == bommenOmMeHeen) { foreach (var unrevealed in unrevealedTilesOmMeHeen) { if (unrevealed.VakjeBerekeningen.BerekendVakjeType != BerekendVakjeType.GuaranteedNoBom) { unrevealed.VakjeBerekeningen.BerekendVakjeType = BerekendVakjeType.GuaranteedNoBom; iteratie.Vondsten.Add(new BommenBepalerStatsIteratieVondst(iteratie, unrevealed, VondstType.SimpleGuaranteedNoBomb)); } } } } foreach (var vakje in flatVakjes) { if (vakje.IsNumber) { var bommenOmMeHeen = vakje.SurroundingVakjes.Count(t => t.IsBomb); var unrevealedTilesOmMeHeenZonderGuaranteedNoBom = vakje.SurroundingVakjes.Where(t => !t.Revealed && t.VakjeBerekeningen.BerekendVakjeType != BerekendVakjeType.GuaranteedNoBom).ToList(); var unrevealedTilesOmMeHeen = vakje.SurroundingVakjes.Where(t => !t.Revealed).ToList(); AddSet(iteratie, vakje.Number - bommenOmMeHeen, unrevealedTilesOmMeHeenZonderGuaranteedNoBom); } } if (botConfig.UseSetDetection) { var allSets = flatVakjes.SelectMany(t => t.VakjeBerekeningen.Sets).Distinct(); foreach (var set in allSets) { //we kijken nu per set foreach (var vakjeInSet in set.Vakjes) { foreach (var setVanDeze in vakjeInSet.VakjeBerekeningen.Sets) { if (set != setVanDeze) { var vakjesInBeideSets = set.Vakjes.Intersect(setVanDeze.Vakjes).ToList(); var bommenInVakjesInBeideNodigGezienVanuitSet = set.CountVanBommenDieErMoetenZijn - (set.Vakjes.Count - vakjesInBeideSets.Count); var countGuaranteedNotBombsInIntersection = vakjesInBeideSets.Count - set.CountVanBommenDieErMoetenZijn; if (bommenInVakjesInBeideNodigGezienVanuitSet == setVanDeze.CountVanBommenDieErMoetenZijn) { var vakjesNietGedeeld = setVanDeze.Vakjes.Except(vakjesInBeideSets).ToList(); foreach (var vakjeNietGedeeld in vakjesNietGedeeld) { if (vakjeNietGedeeld.VakjeBerekeningen.BerekendVakjeType != BerekendVakjeType.GuaranteedNoBom) { vakjeNietGedeeld.VakjeBerekeningen.BerekendVakjeType = BerekendVakjeType.GuaranteedNoBom; iteratie.Vondsten.Add(new BommenBepalerStatsIteratieVondst(iteratie, vakjeNietGedeeld, VondstType.SetsBasedGuaranteedNoBomb)); } } } //Alleen als we 2 vakjes hebben die overlappen is er de mogelijkheid dat maar 1 van de 2 een bom is //if (vakjesInBeideSets.Count > 1 && bommenInVakjesInBeideNodigGezienVanuitSet > 0) //{ //if (setVanDeze.CountVanBommenDieErMoetenZijn - countGuaranteedNotBombsInIntersection == setVanDeze.Vakjes.Count - vakjesInBeideSets.Count) if (setVanDeze.Vakjes.Count - countGuaranteedNotBombsInIntersection == setVanDeze.CountVanBommenDieErMoetenZijn) { var vakjesNietGedeeld = setVanDeze.Vakjes.Except(vakjesInBeideSets).ToList(); foreach (var vakjeNietGedeeld in vakjesNietGedeeld) { if (vakjeNietGedeeld.VakjeBerekeningen.BerekendVakjeType != BerekendVakjeType.GuaranteedBom) { vakjeNietGedeeld.VakjeBerekeningen.BerekendVakjeType = BerekendVakjeType.GuaranteedBom; iteratie.Vondsten.Add(new BommenBepalerStatsIteratieVondst(iteratie, vakjeNietGedeeld, VondstType.SetsBasedGuaranteedBomb)); } } } //} } } } } } return(iteratie); }