public void DoesntFindAllTheseFalsePositives() { var logger = DefaultLoggerFactory.CreateLoggerForTests(); //Hier vond hij random bommen string[] data = new[] { "########B3..1.B10", "#######BRR2.B3310", "######1233BR3BR10", "#####001B.2..B200", "####0002B..R21000", "###210013B2100001", "##BB101.R3000001R", "#.3201B3R1000002.", "..R102..1111112R.", ".1.12B2..R.R.R.1#", "...R.3RB21.2RB.##", "...1.R3.....R2###", "....B3..B.12.####", "...B3R..3..R#####", ".....1.2..2######", "..........#######", ".........########" }; var game = new GalaxySweeperGame { field = data.ToList() }; var deVakjesArray = GalaxyGameHelper.CreateVakjesArray(game); var stats = BommenBepaler.BepaalBommenMulti2(deVakjesArray, TestBotConfig()); stats.Log(logger); var flattened = TwoDimensionalArrayHelper.Flatten(deVakjesArray).Where(t => t != null).ToList(); LogTopBombs(flattened, logger); GalaxyVisualizator.RenderToConsole(deVakjesArray, logger); Assert.Equal(0, flattened.Count(t => t.VakjeBerekeningen.BerekendVakjeType == BerekendVakjeType.GuaranteedBom)); }
public void FindsNonGuaranteedBombsAndThenRecursivelyFindsGuaranteedBombs() { var logger = DefaultLoggerFactory.CreateLoggerForTests(); string[] data = new[] { "########.........", "#######..........", "######...........", "#####............", "####.............", "###..............", "##...............", "#................", "...........1.....", "........12..4...#", "........11.....##", "..............###", ".............####", "............#####", "...........######", "..........#######", ".........########" }; var game = new GalaxySweeperGame { field = data.ToList() }; var deVakjesArray = GalaxyGameHelper.CreateVakjesArray(game); var stats = BommenBepaler.BepaalBommenMulti2(deVakjesArray, TestBotConfig()); stats.Log(logger); var flattened = TwoDimensionalArrayHelper.Flatten(deVakjesArray).Where(t => t != null).ToList(); LogTopBombs(flattened, logger); GalaxyVisualizator.RenderToConsole(deVakjesArray, logger); Assert.Equal(5, flattened.Count(t => t.VakjeBerekeningen.BerekendVakjeType == BerekendVakjeType.GuaranteedBom)); Assert.Equal(7, flattened.Count(t => t.VakjeBerekeningen.BerekendVakjeType == BerekendVakjeType.GuaranteedNoBom)); }
public static Vakje[,] CreateVakjesArray(GalaxySweeperGame game) { Vakje[,] deVakjesArray = new Vakje[game.field.Count, game.field[0].Length]; for (int x = 0; x < game.field.Count; x++) { var line = game.field[x]; for (int y = 0; y < line.Length; y++) { var character = line[y]; if (character != '#') { var vakje = new Vakje(character, x, y); deVakjesArray[x, y] = vakje; } } } int width = deVakjesArray.GetLength(0); int height = deVakjesArray.GetLength(1); for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { var vakje = deVakjesArray[x, y]; if (vakje != null) { AddVakjeToNeightboursIfNotNull(vakje, deVakjesArray, x, y - 1); AddVakjeToNeightboursIfNotNull(vakje, deVakjesArray, x + 1, y - 1); AddVakjeToNeightboursIfNotNull(vakje, deVakjesArray, x - 1, y); AddVakjeToNeightboursIfNotNull(vakje, deVakjesArray, x + 1, y); AddVakjeToNeightboursIfNotNull(vakje, deVakjesArray, x - 1, y + 1); AddVakjeToNeightboursIfNotNull(vakje, deVakjesArray, x, y + 1); } } } return(deVakjesArray); }
public void FindsThisOneThatSjoerdsOneDoesToo() { var logger = DefaultLoggerFactory.CreateLoggerForTests(); string[] data = new[] { "########B21000000", "#######13R2000000", "######11RB1011000", "#####B23R201R2121", "####B3R42113R2BB2", "###B33RR3R2R22B3B", "##13B23R4211.113B", "#.1R213BB2....1RR", ".1211R3BB31.1124R", "1R1.1124BB11R2R2#", "11...1R22212321##", ".....11.1R2RB1###", "..121...11132####", ".1BR2.....1B#####", ".12..4...12######", "......3.1B#######", "....2...1########" }; var game = new GalaxySweeperGame { field = data.ToList() }; var deVakjesArray = GalaxyGameHelper.CreateVakjesArray(game); var stats = BommenBepaler.BepaalBommenMulti2(deVakjesArray, TestBotConfig()); stats.Log(logger); var flattened = TwoDimensionalArrayHelper.Flatten(deVakjesArray).Where(t => t != null).ToList(); LogTopBombs(flattened, logger); GalaxyVisualizator.RenderToConsole(deVakjesArray, logger); Assert.Equal(3, flattened.Count(t => t.VakjeBerekeningen.BerekendVakjeType == BerekendVakjeType.GuaranteedBom)); }
public void DetermineBestMove(GalaxySweeperGame game, bool executeMove) { if (game.isFinished) { return; } if (!game.myTurn) { executeMove = false; } var deVakjesArray = GalaxyGameHelper.CreateVakjesArray(game); //Nu is alle data goed var stats = BommenBepaler.BepaalBommenMulti(deVakjesArray, _botconfig); stats.Log(_logger); var unrevealedVakjes = TwoDimensionalArrayHelper.Flatten(deVakjesArray).Where(t => t != null).Where(t => !t.Revealed).OrderByDescending(t => t.VakjeBerekeningen.BerekendeVakjeKans).ToList(); var potentialBombs = unrevealedVakjes.Where(t => t.VakjeBerekeningen.BerekendVakjeType != BerekendVakjeType.GuaranteedNoBom).ToList(); var guaranteedBombs = potentialBombs.Where(t => t.VakjeBerekeningen.BerekendVakjeType == BerekendVakjeType.GuaranteedBom).ToList(); var vakjesMetBomErnaast = potentialBombs.Where(t => t.SurroundingVakjes.Any(z => z != null && z.IsBomb)).ToList(); var vakjesMetBomErnaastDieOokGuaranteedGeenBomKunnenZijn = unrevealedVakjes.Where(t => t.SurroundingVakjes.Any(z => z != null && z.IsBomb)).ToList(); GalaxyVisualizator.RenderToConsole(deVakjesArray, _logger); _logger.WriteLine(string.Empty); _logger.WriteLine("Best chance bombs (top 5):"); foreach (var maybeBom in potentialBombs.Take(5)) { _logger.Write($"\t{maybeBom.ToString()}"); if (maybeBom.VakjeBerekeningen.BerekendVakjeType == BerekendVakjeType.GuaranteedBom) { var vondst = stats.GetVondstVoorVakje(maybeBom); if (vondst != null) { ConsoleColor c = ConsoleColor.DarkGreen; if (vondst.Vakje.SurroundingVakjes.Any(t => stats.GetVondstVoorVakje(t)?.VondstType == VondstType.SetsBasedGuaranteedNoBomb)) { c = ConsoleColor.DarkYellow; } if (vondst.VondstType == VondstType.SetsBasedGuaranteedBomb) { c = ConsoleColor.Magenta; } _logger.Write($"\t\t Gevonden in iteratie {vondst.Iteratie.IteratieNummer}. Type: {vondst.VondstType}", c); } } _logger.WriteLine(""); } _logger.WriteLine(string.Empty); _logger.WriteLine("Vakjes die op z'n minst een bom er naast hebben (dus sowieso geen 0 zijn):"); foreach (var maybeBom in vakjesMetBomErnaast.Take(5)) { _logger.WriteLine($"\t{maybeBom.ToString()}"); } _logger.WriteLine(string.Empty); var deBom = guaranteedBombs.FirstOrDefault(); if (deBom != null) { _logger.WriteLine($"Beste keuze (Guaranteed bom): {deBom}", ConsoleColor.DarkGreen); if (game.myTurn) { _logger.WriteLine("Sweeping...", ConsoleColor.Red); _galaxySweeperApiHelper.Sweep(game.id, deBom.X, deBom.Y); } } else { if (vakjesMetBomErnaast.Any()) { var hetVakjeWatWeGaanKlikken = vakjesMetBomErnaast.First(); _logger.WriteLine($"Beste keuze (Vakje met bom ernaast): {hetVakjeWatWeGaanKlikken}", ConsoleColor.DarkCyan); if (game.myTurn) { _logger.WriteLine("Sweeping...", ConsoleColor.Red); _galaxySweeperApiHelper.Sweep(game.id, hetVakjeWatWeGaanKlikken.X, hetVakjeWatWeGaanKlikken.Y); } } else if (_botconfig.AlwaysAvoidClickingOpenFields && vakjesMetBomErnaastDieOokGuaranteedGeenBomKunnenZijn.Any()) { var hetVakjeWatWeGaanKlikken = vakjesMetBomErnaastDieOokGuaranteedGeenBomKunnenZijn.First(); _logger.WriteLine($"Beste keuze (Vakje met bom ernaast wat een Guaranteed Not Bomb is): {hetVakjeWatWeGaanKlikken}", ConsoleColor.DarkCyan); if (game.myTurn) { _logger.WriteLine("Sweeping...", ConsoleColor.Red); _galaxySweeperApiHelper.Sweep(game.id, hetVakjeWatWeGaanKlikken.X, hetVakjeWatWeGaanKlikken.Y); } } else { var hetVakjeWatWeGaanKlikken = potentialBombs.First(); _logger.WriteLine($"Beste keuze (Hoogste kans): {hetVakjeWatWeGaanKlikken}", ConsoleColor.DarkBlue); if (game.myTurn) { _logger.WriteLine("Sweeping...", ConsoleColor.Red); _galaxySweeperApiHelper.Sweep(game.id, hetVakjeWatWeGaanKlikken.X, hetVakjeWatWeGaanKlikken.Y); } } } _logger.WriteLine(string.Empty); _logger.WriteLine(string.Empty); }