// 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++; } } } } }
// 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; } }