Пример #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
        public void PrintMineBoard()
        {
            for (int y = 0; y < Height; y++)
            {
                for (int x = 0; x < Width; x++)
                {
                    var mineSpace = MineBoard[y, x];
                    var xPosition = mineSpace.XPosition;
                    var yPosition = mineSpace.YPosition;

                    Console.CursorLeft = xPosition;
                    Console.CursorTop  = yPosition - 1;
                    Console.WriteLine("___");
                    Console.CursorLeft = xPosition - 1;
                    Console.WriteLine("|   |");
                    Console.CursorLeft = xPosition - 1;
                    Console.Write("|");

                    if (CurrentPosition[0, 0] == y && CurrentPosition[0, 1] == x)
                    {
                        Console.BackgroundColor = ConsoleColor.Blue;
                    }

                    if (mineSpace.IsExploded && !mineSpace.HasTreasure)
                    {
                        Console.ForegroundColor = ConsoleColor.Red;
                        Console.OutputEncoding  = Encoding.UTF8;
                        Console.Write(" \u263A ");
                        Console.OutputEncoding = Encoding.ASCII;
                    }
                    else if (mineSpace.IsExploded && mineSpace.HasTreasure)
                    {
                        Console.ForegroundColor = ConsoleColor.Green;
                        Console.Write(" $ ");
                        GameState = GameState.Won;
                    }
                    else
                    {
                        Console.Write(" X ");
                    }

                    Console.ResetColor();
                    Console.WriteLine("|");
                    Console.CursorLeft = xPosition - 1;
                    Console.WriteLine("|___|");
                }
            }

            if (GameState == GameState.Won)
            {
                WinLoseMessageManager.PrintMessage(GameState);
            }
        }
Пример #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();
        }