Beispiel #1
0
        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);
        }
Beispiel #2
0
        public void UndoExplode()
        {
            if (States.Count < 2 || !UndosRemainingManager.UndosRemain())
            {
                return;
            }

            States.Pop();
            var lastState = States.Peek();

            SetMemento(lastState);
            UndosRemainingManager.ReduceUndosRemaining();
            ExplosionsRemainingManager.IncreaseExplosionsRemaining();
        }
Beispiel #3
0
        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();
        }