public Mine(int width, int height, int numExplosions, int numUndos) { Width = width; Height = height; MineBoard = new MineSpace[Height, Width]; CurrentPosition = new [, ] { { 0, 0 } }; // Start at the top left of the board, just because that seems natural I guess. States = new Stack <IMineMemento>(); CreateMindBoard(); GameState = GameState.InProgress; var topLeftPosition = new[, ] { { MineBoard[0, 0].YPosition, MineBoard[0, 0].XPosition } }; ExplosionsRemainingManager = new ExplosionsRemainingManager(numExplosions, topLeftPosition); var boardMiddleXPosition = MineBoard[0, Width / 2].XPosition; WinLoseMessageManager = new WinLoseMessageManager(topLeftPosition[0, 0], boardMiddleXPosition); var topRightPosision = new[, ] { { MineBoard[0, 0].YPosition, MineBoard[0, Width - 1].XPosition } }; UndosRemainingManager = new UndosRemainingManager(numUndos, topRightPosision); }
public void UndoExplode() { if (States.Count < 2 || !UndosRemainingManager.UndosRemain()) { return; } States.Pop(); var lastState = States.Peek(); SetMemento(lastState); UndosRemainingManager.ReduceUndosRemaining(); ExplosionsRemainingManager.IncreaseExplosionsRemaining(); }
public void Explode() { var occupiedMineSpace = GetOccupiedMineSpace(); if (occupiedMineSpace.IsExploded) { return; } var explosionValue = ExplosionValue; occupiedMineSpace.IsExploded = true; explosionValue--; ExplosionsRemainingManager.ReduceExplosionsRemaining(); var possibleExplosionDirections = new List <Direction>(); Enum.GetValues(typeof(Direction)).Cast <Direction>().ToList().ForEach(direction => { if (GetAdjacentSpace(occupiedMineSpace, direction) != null) { possibleExplosionDirections.Add(direction); } }); var apportionedExplosionValue = explosionValue / possibleExplosionDirections.Count; possibleExplosionDirections.ForEach(direction => { var spaceToExplode = GetAdjacentSpace(occupiedMineSpace, direction); ExplodeSpace(spaceToExplode, apportionedExplosionValue); }); PrintMineBoard(); if (!ExplosionsRemainingManager.ExplosionsRemain() && GameState != GameState.Won) { GameState = GameState.Lost; WinLoseMessageManager.PrintMessage(GameState); } StoreState(); }