Пример #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);
        }
Пример #2
0
        private void CreateMindBoard()
        {
            var topLine         = new string('_', Width * 4);
            var xStartPosition  = (Console.WindowWidth / 2) - (topLine.Length / 2);
            var yPosition       = Console.CursorTop + 1;
            var winningPosition = GetWinningPosition();

            for (int y = 0; y < Height; y++)
            {
                var currentXPosition = xStartPosition;
                for (int x = 0; x < Width; x++)
                {
                    MineBoard[y, x] = new MineSpace
                    {
                        XPosition     = currentXPosition,
                        YPosition     = yPosition,
                        BoardPosition = new int[, ] {
                            { y, x }
                        },
                        HasTreasure = y == winningPosition[0, 0] && x == winningPosition[0, 1]
                    };
                    currentXPosition += 4;
                }
                yPosition += 3;
            }

            StoreState();
        }
Пример #3
0
        private MineSpace GetSpaceRight(MineSpace mineSpace)
        {
            var xPosition = mineSpace.BoardPosition[0, 1];

            if (xPosition >= Width - 1)
            {
                return(null);
            }

            var yPosition = mineSpace.BoardPosition[0, 0];

            return(MineBoard[yPosition, ++xPosition]);
        }
Пример #4
0
        private MineSpace GetSpaceLeft(MineSpace mineSpace)
        {
            var xPosition = mineSpace.BoardPosition[0, 1];

            if (xPosition < 1)
            {
                return(null);
            }

            var yPosition = mineSpace.BoardPosition[0, 0];

            return(MineBoard[yPosition, --xPosition]);
        }
Пример #5
0
        private MineSpace GetSpaceBelow(MineSpace mineSpace)
        {
            var yPosition = mineSpace.BoardPosition[0, 0];

            if (yPosition >= Height - 1)
            {
                return(null);
            }

            var xPosition = mineSpace.BoardPosition[0, 1];

            return(MineBoard[++yPosition, xPosition]);
        }
Пример #6
0
        private MineSpace GetSpaceAbove(MineSpace mineSpace)
        {
            var yPosition = mineSpace.BoardPosition[0, 0];

            if (yPosition < 1)
            {
                return(null);
            }

            var xPosition = mineSpace.BoardPosition[0, 1];

            return(MineBoard[--yPosition, xPosition]);
        }
Пример #7
0
        private void ExplodeSpace(MineSpace mineSpace, int explosionValue)
        {
            mineSpace.IsExploded = true;
            explosionValue--;

            if (explosionValue > 0)
            {
                var nextDirectionToExplode = GetRandomDirection();
                var nextSpaceToExplode     = GetAdjacentSpace(mineSpace, nextDirectionToExplode);

                if (nextSpaceToExplode != null)
                {
                    ExplodeSpace(nextSpaceToExplode, explosionValue);
                }
            }
        }
Пример #8
0
        private MineSpace GetAdjacentSpace(MineSpace mineSpace, Direction direction)
        {
            switch (direction)
            {
            case Direction.Above:
                return(GetSpaceAbove(mineSpace));

            case Direction.Below:
                return(GetSpaceBelow(mineSpace));

            case Direction.Left:
                return(GetSpaceLeft(mineSpace));

            case Direction.Right:
                return(GetSpaceRight(mineSpace));

            default:
                return(null);
            }
        }