private List<MineButton> GetNearbyButtons(MineButton button) { if(!AreValidCoordinates(button.XPosition, button.YPosition)) { return new List<MineButton>(); } return MineGrid.Children .OfType<MineButton>() .Where(b => b.IsEnabled && (b.XPosition != button.XPosition || b.YPosition != button.YPosition) && b.XPosition > button.XPosition - 2 && b.XPosition < button.XPosition + 2 && b.YPosition > button.YPosition - 2 && b.YPosition < button.YPosition + 2) .ToList(); }
private void OpenNearbyFields(MineButton button) { var nearbyButtons = GetNearbyButtons(button); foreach(var b in nearbyButtons) { OpenField(b); } }
private void MarkField(MineButton button) { if(_core == null) { return; } var status = _core.Mark(button.XPosition, button.YPosition); if(status == MarkFieldStatus.FieldIsMarked) { _minesLeft--; MinesLeftLabel.Text = String.Format(MinesLeftText, _minesLeft > 0 ? _minesLeft : 0); button.Source = _flag; } else { _minesLeft++; MinesLeftLabel.Text = String.Format(MinesLeftText, _minesLeft > 0 ? _minesLeft : 0); button.Source = _blank; } }
private void ServeGameOver(MineButton button) { foreach(var child in MineGrid.Children) { var b = child as MineButton; b.IsEnabled = false; b.BackgroundColor = Color.Silver; if(!_core.IsMarked(b.XPosition, b.YPosition)) { if(_core.HasMine(b.XPosition, b.YPosition)) { b.Source = _mine; } } else if(!_core.HasMine(b.XPosition, b.YPosition)) { b.Source = _nomine; } } button.Source = _explodedmine; DisplayAlert("Game over", "BOOM! You lose!", "OK"); }
private void OpenField(MineButton button) { if(_core == null) { _core = new MineSweeper.Core.MineSweeper(columns, rows, mines, button.XPosition, button.YPosition); } if(_core.IsMarked(button.XPosition, button.YPosition)) { return; } button.IsEnabled = false; button.BackgroundColor = Color.Silver; var status = _core.Open(button.XPosition, button.YPosition); switch(status) { case FieldStatus.FieldIsMine: ServeGameOver(button); return; case FieldStatus.MinesNearby0: button.Source = _blank; OpenNearbyFields(button); break; case FieldStatus.MinesNearby1: button.Source = _1; break; case FieldStatus.MinesNearby2: button.Source = _2; break; case FieldStatus.MinesNearby3: button.Source = _3; break; case FieldStatus.MinesNearby4: button.Source = _4; break; case FieldStatus.MinesNearby5: button.Source = _5; break; case FieldStatus.MinesNearby6: button.Source = _6; break; case FieldStatus.MinesNearby7: button.Source = _7; break; default: button.Source = _8; break; } if(MineGrid.Children.OfType<MineButton>().Count(b => b.IsEnabled) == mines) { ServeGameWin(); } }