private bool FindNextCellWithBestProbability() { var bestProbability = 0d; var randomProbability = CalculateRandomProbability(); Cell bestCell = null; foreach (var cell in _map.GetCells()) { if (cell.Number.HasValue) { var adjacentUnknown = (double)_map.GetAdjacentCellCountOfState(cell, CellState.Unknown); var adjacentUnknownMines = (double)(cell.Number.Value - _map.GetAdjacentCellCountOfState(cell, CellState.Mine)); if (adjacentUnknown <= 0) { continue; } var currentCellProbability = 1d - (adjacentUnknownMines / adjacentUnknown); if (currentCellProbability > bestProbability && currentCellProbability > randomProbability) { bestProbability = currentCellProbability; bestCell = _map.GetAdjacentCells(cell, x => x.State == CellState.Unknown).First(); } } } if (bestCell != null) { NextCellHasBeenFound.Raise(this, new CellLocationEventArgs(bestCell.Row, bestCell.Col)); } return(bestCell != null); }
private bool FindRandomCell() { var unknownCells = _map.GetCells().Where(x => x.State == CellState.Unknown).ToList(); if (!unknownCells.Any()) { return(false); } var randomCell = unknownCells.ElementAt(_random.Next(0, unknownCells.Count - 1)); NextCellHasBeenFound.Raise(this, new CellLocationEventArgs(randomCell.Row, randomCell.Col)); return(true); }
private bool FindSolvedCells() { var foundAny = false; foreach (var cell in _map.GetCells()) { if (cell.Number.HasValue && _map.GetAdjacentCellCountOfState(cell, CellState.Mine) == cell.Number.Value) { var adjacentCells = _map.GetAdjacentCells(cell, x => x.State == CellState.Unknown); foundAny = adjacentCells.Any(); foreach (var adjCell in adjacentCells) { NextCellHasBeenFound.Raise(this, new CellLocationEventArgs(adjCell.Row, adjCell.Col)); } } } return(foundAny); }