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); }
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(); }
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]); }
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]); }
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]); }
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]); }
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); } } }
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); } }