コード例 #1
0
        // Initializing field units with bombs and other data such as nearby bombs
        private void InitializeField(int indexOfFirstFieldUnit)
        {
            this.rnd = new Random();
            int        fieldUnitNumber = (int)Math.Pow(this.fieldWidth, 2);
            List <int> listOfBombs     = new List <int>(this.fieldWidth);

            // First opened field unit can't have the bomb
            listOfBombs.Add(indexOfFirstFieldUnit);
            int rng;

            for (int k = 0; k < this.bombNumber; k++)
            {
                rng = rnd.Next(0, fieldUnitNumber - 1);
                if (listOfBombs.Contains(rng))
                {
                    k--;
                    continue;
                }
                else
                {
                    listOfBombs.Add(rng);
                    listOfUnits[rng].Bomb        = true;
                    listOfUnits[rng].NearbyBombs = -1;
                    listOfUnits[rng].IsOpened    = false;
                    int row = Grid.GetRow(listOfUnits[rng]);
                    int col = Grid.GetColumn(listOfUnits[rng]);

                    // updating 'nearby bombs' value to units around bomb-initialized unit
                    for (int i = -1; i < 2; i++)
                    {
                        for (int j = -1; j < 2; j++)
                        {
                            int r = row + i;
                            int c = col + j;

                            if (r < 0 || r > fieldWidth - 1 || c < 0 || c > fieldWidth - 1)
                            {
                                continue;
                            }

                            FieldUnit unit = FieldUnit.GetUnit(listOfUnits, r, c);

                            if (unit.Bomb || (i == 0 && j == 0))
                            {
                                continue;
                            }

                            unit.NearbyBombs++;
                        }
                    }
                }
            }
        }
コード例 #2
0
        // Recursive function that opens field units
        private void OpenField(FieldUnit fu)
        {
            fu.IsOpened = true;

            int row    = Grid.GetRow(fu);
            int column = Grid.GetColumn(fu);

            TextBlock tb = new TextBlock
            {
                HorizontalAlignment = HorizontalAlignment.Center,
                VerticalAlignment   = VerticalAlignment.Center
            };

            if (fu.Bomb)
            {
                GameOver(fu);
                return;
            }
            else
            {
                tb.Text = fu.NearbyBombs.ToString();
            }

            SetTbStyle(tb);
            Field.Children.Remove(fu);
            Border border = new Border
            {
                BorderThickness = new Thickness(1),
                BorderBrush     = new SolidColorBrush(Colors.LightGray),
                Child           = tb
            };

            Grid.SetRow(border, row);
            Grid.SetColumn(border, column);
            Field.Children.Add(border);

            // Opening adjacent field units if field is empty
            if (fu.NearbyBombs == 0)
            {
                for (int i = -1; i < 2; i++)
                {
                    for (int j = -1; j < 2; j++)
                    {
                        int r = row + i;
                        int c = column + j;

                        if (r < 0 || r > fieldWidth - 1 || c < 0 || c > fieldWidth - 1 ||
                            (i == 0 && j == 0))
                        {
                            continue;
                        }

                        FieldUnit unit = FieldUnit.GetUnit(listOfUnits, r, c);

                        // If it's already open or if it's marked with flag, continue
                        if (unit.IsOpened || unit.Flag)
                        {
                            continue;
                        }
                        else
                        {
                            OpenField(unit);
                        }
                    }
                }
            }
            else
            {
                return;
            }
        }