Beispiel #1
0
 internal Cell(Field field, int x, int y)
 {
     _field = field;
     this._x = x;
     this._y = y;
 }
Beispiel #2
0
        /// <summary>
        /// THE MAIN METHOD.
        /// </summary>
        public static void Solve()
        {
            try
            {
                var field = new Field();
                field.ReadFromScreen();
                if (false) field.ShowViaMessageBox();

                //Dumb solving
                if (true)
                {
                    bool clickedSomething = false;

                    if (field.HasNoClickedCells())
                    {
                        field.GetCell(15, 7).Click();
                        clickedSomething = true;
                    }
                    else
                    {

                        foreach (var cell in field.IterateAllCells())
                        {
                            if (cell.IsNumberOfMines && cell.NumberOfMines > 0)
                            {
                                int numberOfFlagsNearby = 0;
                                int numberOfUnknownNearby = 0;
                                foreach (var nearbyCell in cell.IterateAllNearbyCells())
                                {
                                    if (nearbyCell.IsFlag) numberOfFlagsNearby++;
                                    if (nearbyCell.IsUnknown) numberOfUnknownNearby++;
                                }
                                if (numberOfUnknownNearby == cell.NumberOfMines && numberOfFlagsNearby == 0)
                                {
                                    if (false) MessageBox.Show(String.Format("{0}, {1}", cell.X, cell.Y)); //Debug
                                    foreach (var rightClickCell in cell.IterateAllNearbyCells())
                                    {
                                        if (rightClickCell.IsUnknown) rightClickCell.RightClick();
                                        clickedSomething = true;
                                    }
                                }
                                if (numberOfFlagsNearby == cell.NumberOfMines)
                                {
                                    if (false) MessageBox.Show(String.Format("{0}, {1}", cell.X, cell.Y)); //Debug
                                    foreach (var leftClickCell in cell.IterateAllNearbyCells())
                                    {
                                        if (leftClickCell.IsUnknown) leftClickCell.Click();
                                        clickedSomething = true;
                                    }
                                }
                            }
                        }

                    }
                    if (!clickedSomething) throw new Exception("I don't know what to click on, I'm too dumb. Try clicking by yourself.");
                }

                //This is previous failed try of solving it, you can ignore it.
                {/*
            //Finding all fields near numbers
            var perimeter = new int[field.Width, field.Height];
            var perimeterNumbers = new int[field.Width, field.Height];

            for (int fy = 0; fy < field.Height; fy++)
                for (int fx = 0; fx < field.Width; fx++)
                {
                    if (field.GetCell(fx, fy).IsUnknown)
                        foreach (var nearbyFieldXY in Nearby(fx, fy, field.Width, field.Height))
                        {
                            int nearbyX = nearbyFieldXY.Item1;
                            int nearbyY = nearbyFieldXY.Item2;
                            if (field.GetCell(nearbyX, nearbyY).isNumber)
                            {
                                perimeter[fx, fy] = 1;

                                perimeterNumbers[nearbyX, nearbyY] = 1;
                            }
                        }
                }

            var perimeterCoordinates = new List<Tuple<int, int>>(field.Width * field.Height);
            var perimeterNumberCoordinates = new List<Tuple<int, int>>(field.Width * field.Height);
            for (int fy = 0; fy < field.Height; fy++)
                for (int fx = 0; fx < field.Width; fx++)
                {
                    if (perimeter[fx, fy] == 1) perimeterCoordinates.Add(new Tuple<int, int>(fx, fy));
                    if (perimeterNumbers[fx, fy] == 1) perimeterNumberCoordinates.Add(new Tuple<int, int>(fx, fy));
                }

            var bigBitCounter = new BigInteger(0);
            var bigBitCounterMax = BigInteger.Pow(2, perimeterCoordinates.Count());
            for (; bigBitCounter < bigBitCounterMax; bigBitCounter++)
            {
                var probableField = field.Clone();
                BigInteger tempBitCounter = bigBitCounter;
                BigInteger tempSmallestBit;
                foreach (var onePerimeterCoordinate in perimeterCoordinates)
                {
                    tempBitCounter = BigInteger.DivRem(tempBitCounter, 2, out tempSmallestBit);
                    if (tempSmallestBit == 1)
                        probableField.GetCell(onePerimeterCoordinate.Item1, onePerimeterCoordinate.Item2).FileName = "F";
                    else probableField.GetCell(onePerimeterCoordinate.Item1, onePerimeterCoordinate.Item2).FileName = "O";
                }

                foreach (var onePerimeterNumberCoordinate in perimeterNumberCoordinates)
                {
                    int numX = onePerimeterNumberCoordinate.Item1;
                    int numY = onePerimeterNumberCoordinate.Item2;
                    int numberOfFlagsArround = 0;
                    foreach (var nearbyField in Nearby(numX, numY, probableField.Width, probableField.Height))
                    {
                        int perX = nearbyField.Item1;
                        int perY = nearbyField.Item2;

                        if (probableField.GetCell(perX, perY).FileName == "F") numberOfFlagsArround++;
                    }
                    //Debug.WriteLine("{2},{3}: Current: {0}, Real: {1}", numberOfFlagsArround, probableField.GetCell(numX, numY).Number, numX, numY);
                    if (numberOfFlagsArround != probableField.GetCell(numX, numY).Number) goto nextProbableField;
                }

                probableField.ShowViaMessageBox();

            nextProbableField:
                //Debug.WriteLine("Doh!");
                //probableField.ShowViaMessageBox();
                continue;
            }

            */
                }

            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, ex.GetType().ToString(), MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
Beispiel #3
0
 /// <summary>
 /// Creates a DeepCopy of a method.
 /// </summary>
 /// <returns></returns>
 internal Field DeepCopy()
 {
     var result = new Field();
     for (int y = 0; y < _height; y++)
     {
         for (int x = 0; x < _width; x++)
         {
             result.GetCell(x, y).EnumRepresentation = this.GetCell(x, y).EnumRepresentation;
         }
     }
     return result;
 }