private static List <TowerGameMoveLogModel> RunTowerThroughTheSolver(
            ISolveTowers solver,
            ITowerGame game,
            IDrawTheTowerGame drawer)
        {
            var moves = new List <TowerGameMoveLogModel>();

            foreach (var move in solver.SolveFromStart(game.AsReadonly()))
            {
                var thisMove = new TowerGameMoveLogModel
                {
                    Move            = move,
                    Valid           = true,
                    Peg1CountBefore = game.Peg1.CurrentNumberOfDiscs,
                    Peg2CountBefore = game.Peg2.CurrentNumberOfDiscs,
                    Peg3CountBefore = game.Peg3.CurrentNumberOfDiscs
                };

                Thread.Sleep(solver.MillisecondDelayBetweenMoves);
                try
                {
                    game.PerformMove(move.From, move.To);
                }
                catch (Exception e)
                {
                    thisMove.Valid = false;
                    thisMove.Error = e.Message;
                }

                thisMove.Peg1CountAfter = game.Peg1.CurrentNumberOfDiscs;
                thisMove.Peg2CountAfter = game.Peg2.CurrentNumberOfDiscs;
                thisMove.Peg3CountAfter = game.Peg3.CurrentNumberOfDiscs;

                moves.Add(thisMove);

                drawer.Draw(game);

                Console.ForegroundColor = ConsoleColor.Red;
                Console.WriteLine(thisMove.Error);
                Console.ForegroundColor = ConsoleColor.White;
            }

            return(moves);
        }
 public ReadonlyTowerGame(ITowerGame underlying)
 {
     _underlying = underlying;
 }