public void ReduceScoreShouldReduceTheNumberOfOpenPlayingFields()
 {
     PlayingField sampleField = new PlayingField(3, 4, 1);
     sampleField.OpenCell(0, 0);
     int scoreAfterFirstMove = sampleField.OpenCellsCounter;
     sampleField.ReduceScore(1);
     Assert.AreNotEqual(scoreAfterFirstMove, sampleField.OpenCellsCounter);
 }
        /// <summary>
        /// Prints the playing field on each turn.
        /// </summary>
        /// <param name="playingField">Current playing field.</param>
        /// <param name="gamestatus">Status of the game, currently being played.</param>
        internal void PrintPlayingField(PlayingField playingField, GameStatus gamestatus)
        {
            MenuPrinter menuPrinter = new MenuPrinter();
            menuPrinter.ConsoleSetUp();
            menuPrinter.PrintBackground();

            int rows = playingField.Field.GetLength(0);
            int columns = playingField.Field.GetLength(1);

            string formatString = new string(' ', (Console.WindowWidth - (columns + (columns * 2))) / 2);

            this.sb.AppendLine();
            this.sb.Append(formatString);

            for (int i = 0; i < columns; i++)
            {
                this.sb.Append(string.Format("{0}", i).PadLeft(2, ' ') + " ");
            }

            this.sb.AppendLine();
            this.PrintLine(columns);

            for (int i = 0; i < rows; i++)
            {
                this.sb.Append(new string(' ', ((Console.WindowWidth - (columns + (columns * 2))) / 2) - 4));
                this.sb.Append(string.Format("{0}", i).PadLeft(2, ' '));
                this.sb.Append(" | ");

                for (int j = 0; j < columns; j++)
                {
                    Cell currentField = playingField.Field[i, j];

                    if (gamestatus == GameStatus.GameOn)
                    {
                        if (currentField.Status == CellStatus.Opened)
                        {
                            this.sb.Append(playingField.Field[i, j].Value);
                            this.sb.Append("  ");
                        }
                        else if (currentField.Status == CellStatus.Flagged)
                        {
                            this.sb.Append(Flag);
                        }
                        else
                        {
                            this.sb.Append(CellClosed);
                        }
                    }
                    else if (gamestatus == GameStatus.GameOver)
                    {
                        if (currentField.IsMine)
                        {
                            this.sb.Append(MineOpened);
                        }
                        else
                        {
                            this.sb.Append(playingField.Field[i, j].Value + "  ");
                        }
                    }
                    else
                    {
                        if (currentField.IsMine == true || currentField.Status == CellStatus.Flagged)
                        {
                            this.sb.Append(Flag);
                        }
                        else
                        {
                            this.sb.Append(playingField.Field[i, j].Value + "  ");
                        }
                    }
                }

                this.sb.Append("|");
                this.sb.AppendLine();
            }

            this.PrintLine(columns);
            Console.WriteLine(this.sb.ToString());
            this.sb.Clear();
        }
        /// <summary>
        /// Method which takes care of anything the user inputs on the console during a minesweeper game.
        /// </summary>
        /// <param name="playingField">Method gets the current playing field.</param>
        public void HandleInput(PlayingField playingField)
        {
            int row;
            int col;
            int fieldRows = playingField.Field.GetLength(0);
            int fieldCows = playingField.Field.GetLength(1);

            bool isValid = false;
            while (!isValid)
            {
                Console.Write(EnterCordinates);
                string inputCommand = Console.ReadLine();
                this.InputCoordinates = inputCommand.Split(' ');

                if (this.InputCoordinates.Length == 1)
                {
                    switch (this.InputCoordinates[0])
                    {
                        case "restart":
                            Game.Instance().RestartGame();
                            isValid = true;
                            break;
                        case "exit":
                            Game.Instance().ChangeToGameOver();
                            isValid = true;
                            break;
                        case "undo":
                            List<Coordinates> lastTurnCells = Game.Instance().Memento.GetLastCells();

                            if (lastTurnCells == null)
                            {
                                Console.Beep(700, 400);
                                Console.Beep(700, 400);
                            }
                            else
                            {
                                int howManyFieldsOpenedLast = 0;
                                foreach (var cell in lastTurnCells)
                                {
                                    if (playingField.Field[cell.Row, cell.Col].Status == CellStatus.Closed)
                                    {
                                        playingField.Field[cell.Row, cell.Col].Status = CellStatus.Flagged;
                                        Game.Instance().NumberOfFlags += 1;
                                    }
                                    else if (playingField.Field[cell.Row, cell.Col].Status == CellStatus.Opened)
                                    {
                                        playingField.Field[cell.Row, cell.Col].Status = CellStatus.Closed;
                                        howManyFieldsOpenedLast++;
                                    }
                                    else
                                    {
                                        playingField.Field[cell.Row, cell.Col].Status = CellStatus.Closed;
                                        Game.Instance().NumberOfFlags -= 1;
                                    }
                                }

                                Game.Instance().Memento.RemoveCells();
                                playingField.ReduceScore(howManyFieldsOpenedLast);
                            }

                            isValid = true;
                            break;

                        default:
                            Console.WriteLine(InvalidCoordinatesText);
                            break;
                    }
                }
                else
                {
                    bool isValidIntRow = int.TryParse(this.InputCoordinates[0], out row) && row < fieldRows && row >= 0;
                    bool isValidIntCol = int.TryParse(this.InputCoordinates[1], out col) && col < fieldCows && col >= 0;

                    if (isValidIntRow && isValidIntCol && this.InputCoordinates.Length > 2)
                    {
                        if (this.InputCoordinates[2].ToLower() == "f")
                        {
                            playingField.SetFlag(row, col);
                            break;
                        }
                        else if (this.InputCoordinates[2].ToLower() == "r")
                        {
                            playingField.RemoveFlag(row, col);
                            break;
                        }
                        else
                        {
                            Console.WriteLine(InvalidCoordinatesText);
                        }
                    }
                    else if (isValidIntRow && isValidIntCol)
                    {
                        playingField.OpenCell(row, col);
                        break;
                    }
                    else
                    {
                        Console.WriteLine(InvalidCoordinatesText);
                    }
                }
            }
        }
 public void WhenNewFieldIsCreatedOpenCellsCounterShouldBeZero()
 {
     PlayingField sampleField = new PlayingField(3, 4, 1);
     Assert.AreEqual(0, sampleField.OpenCellsCounter);
 }
 public void OpeningCellsShouldIncreaseTheOpenCellCounter()
 {
     PlayingField sampleField = new PlayingField(3, 4, 1);
     sampleField.OpenCell(0, 0);
     Assert.AreNotEqual(0, sampleField.OpenCellsCounter);
 }
 public void CreatingPlayingFieldShouldCreateMinesweeperPlayingField()
 {
     PlayingField sampleField = new PlayingField(3, 4, 1);
     Assert.AreEqual(3, sampleField.Field.GetLength(0));
     Assert.AreEqual(4, sampleField.Field.GetLength(1));
 }