Exemplo n.º 1
0
        // 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);
        }
Exemplo n.º 2
0
        // 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);
        }