// clicks the assigned tile and returns an object containing a list of tiles cleared private List <ActionResult> ClearTile(GameAction action) { List <ActionResult> actionResults = new List <ActionResult>(); int index = GetIndex(action.x, action.y); // if this is the first click then create the tiles and place the mines if (this.gameStatus == GameStatus.NotStarted) { PlaceMines(index); } MinesweeperTile tile = this.tiles[index]; // are we clicking on a flag if (tile.IsFlagged()) { Write("Unable to Clear: Clicked on a Flag"); } else if (tile.GetExploded()) { Write("Unable to Clear: Clicked on an exploded Mine"); } else if (tile.IsMine()) { //Write("Gameover: Clicked on a mine"); deaths++; if (hardcore) { this.gameStatus = GameStatus.Lost; } tile.SetExploded(true); actionResults.Add(new ActionResult(action.x, action.y, ResultType.Exploded)); } else { if (tile.IsCovered()) // make sure the tile is clickable { List <MinesweeperTile> tilesToReveal = new List <MinesweeperTile>(); tilesToReveal.Add(tile); actionResults.AddRange(Reveal(tilesToReveal)); } } return(actionResults); }
// chord the assigned tile and returns an object containing a list of tiles cleared private List <ActionResult> ChordTile(GameAction action) { List <ActionResult> actionResults = new List <ActionResult>(); int index = GetIndex(action.x, action.y); // if this is the first click then create the tiles and place the mines if (this.gameStatus == GameStatus.NotStarted) { PlaceMines(index); } MinesweeperTile tile = this.tiles[index]; int flagCount = 0; int hiddenCount = 0; foreach (int adjIndex in GetAdjacentIndex(index)) { if (tiles[adjIndex].IsFlagged()) { flagCount++; } else if (tiles[adjIndex].IsCovered()) { hiddenCount++; } } // If the hidden count is zero then there is nothing to do if (hiddenCount == 0) { Write("Unable to Chord: Nothing to clear"); return(actionResults); } // nothing to do if the tile is not yet surrounded by the correct number of flags if (tile.GetValue() != flagCount) { Write("Unable to Chord: value=" + tile.GetValue() + " flags=" + flagCount); return(actionResults); } // see if there are any unflagged bombs in the area to be chorded - this loses the game var bombCount = 0; foreach (int adjIndex in GetAdjacentIndex(index)) { MinesweeperTile adjTile = tiles[adjIndex]; if (adjTile.IsMine() && !adjTile.IsFlagged()) { adjTile.SetExploded(true); actionResults.Add(new ActionResult(adjTile.GetX(), adjTile.GetY(), ResultType.Exploded)); // mark the tile as exploded bombCount++; } } // if we have triggered a bomb then return if (bombCount != 0) { deaths = deaths + bombCount; if (hardcore) { this.gameStatus = GameStatus.Lost; } return(actionResults); } // seems okay, so do the chording List <MinesweeperTile> tilesToReveal = new List <MinesweeperTile>(); // determine which tiles need revealing foreach (int adjIndex in this.GetAdjacentIndex(index)) { MinesweeperTile adjTile = tiles[adjIndex]; if (adjTile.IsCovered() && !adjTile.IsFlagged()) // covered and not flagged { tilesToReveal.Add(adjTile); } } actionResults.AddRange(Reveal(tilesToReveal)); return(actionResults); }