/// <summary> /// Handle field click /// </summary> /// <param name="sender">Button object</param> /// <param name="e">event</param> private void OnFieldClick(object sender, RoutedEventArgs e) { if (!this.gameIsFinished) { Button btn = sender as Button; State state = fields[(Int32)btn.Tag].State; Point point = fields[(Int32)btn.Tag].Point; if (state.Id != 3 && !state.Clicked) { if (state != null && state.IsBomb) { this.ShowAllBombs(); } else { btn.Background = Brushes.White; state.Clicked = true; CountClick(); if (state.Number != null) { btn.Content = state.Number; } else { this.ClearAllFieldsAround(point); btn.Content = ""; } } } } }
/// <summary> /// Clear fields with empty number and show closest fields with number around provided point /// </summary> /// <param name="buttonPoint">Point with x and y coordinate</param> public void ClearAllFieldsAround(Point buttonPoint) { List <Field> foundFields = new List <Field> { fields.Find(field => field.Point.X + 1 == buttonPoint.X && field.Point.Y == buttonPoint.Y), fields.Find(field => field.Point.X - 1 == buttonPoint.X && field.Point.Y == buttonPoint.Y), fields.Find(field => field.Point.X == buttonPoint.X && field.Point.Y + 1 == buttonPoint.Y), fields.Find(field => field.Point.X == buttonPoint.X && field.Point.Y - 1 == buttonPoint.Y), fields.Find(field => field.Point.X + 1 == buttonPoint.X && field.Point.Y + 1 == buttonPoint.Y), fields.Find(field => field.Point.X + 1 == buttonPoint.X && field.Point.Y - 1 == buttonPoint.Y), fields.Find(field => field.Point.X - 1 == buttonPoint.X && field.Point.Y + 1 == buttonPoint.Y), fields.Find(field => field.Point.X - 1 == buttonPoint.X && field.Point.Y - 1 == buttonPoint.Y) }; List <Field> filtered = foundFields.FindAll(e => e != null); foreach (Field filteredField in filtered) { if (!filteredField.State.Clicked && filteredField.State.Id != 3) { filteredField.Button.Background = Brushes.White; filteredField.State.Clicked = true; CountClick(); if (filteredField.State.Number == null) { ClearAllFieldsAround(filteredField.Point); } else { filteredField.Button.Content = filteredField.State.Number; } } } }
/// <summary> /// Initialize Grid with fields and start game /// </summary> public void InitGame() { Random randNum = new Random(); int Min = 0; int Max = this.dimensions; this.clickedFields = 0; this.info.Visibility = Visibility.Hidden; this.time.Visibility = Visibility.Hidden; this.startTime = DateTime.Now.ToString("h:mm:ss tt"); randomBombs = Point.GenerateRandomPoints(Min, Max, Convert.ToInt32(this.dimensions * this.mode)); for (int x = 0; x < this.dimensions; x++) { this.mainGrid.ColumnDefinitions.Add(new ColumnDefinition()); this.mainGrid.RowDefinitions.Add(new RowDefinition()); for (int y = 0; y < this.dimensions; y++) { Field field = Field.AddButton(x, y, this.mainGrid, fields.Count()); field.Button.Click += OnFieldClick; field.Button.MouseDown += OnFieldRightClick; fields.Add(field); } } foreach (Field field in fields) { Point buttonPoint = field.Point; Button button = field.Button; //@todo optimize foreach (Point randomBomb in randomBombs) { bool found = randomBomb.X == buttonPoint.X && randomBomb.Y == buttonPoint.Y; if (found) { field.State = new State(0, 0, true); } } if (field.State == null) { field.State = new State(0, 0, false); } } foreach (Field field in fields) { Point buttonPoint = field.Point; int bombsAround = Point.GetBombsAround(buttonPoint, randomBombs); if (bombsAround > 0) { field.State.Number = bombsAround; } else { field.State.Number = null; } field.Button.Foreground = Brushes.Black; } this.bombFlags = this.randomBombs.Count(); ShowCurrentFlags(); }