public static void Main(string[] args) { int loop = 1; var playerHistory = new List <Result>(); IGameLogic gameLogic = new GameLogic(); IInfoMessage infoMessage = new InfoMessage(); //Print introductory messages. infoMessage.PrintInformationalMessage((long)MessageType.WelcomeMessage); infoMessage.PrintInformationalMessage((long)MessageType.Instructions, (int)Constants.MaxAttempts); infoMessage.PrintInformationalMessage((long)MessageType.PlayerConfirmation); long userConfirmation = (long)ControlCommands.WaitForInput; // The loop will ensure that the user either starts the game or abort it. do { userConfirmation = gameLogic.validateUserPermission(Console.ReadKey().KeyChar); if (userConfirmation == (long)ControlCommands.Exit) { return; } else if (userConfirmation != (long)ControlCommands.StartGame) { infoMessage.PrintInformationalMessage((long)MessageType.InvalidInput); } } while (userConfirmation != (long)ControlCommands.StartGame); // Rematch will be started from here Play: var randomNumber = gameLogic.GenerateRandomNumber(); var randomNumberDigits = gameLogic.GetDigitsFromNumber((int)randomNumber); infoMessage.PrintInformationalMessage((long)MessageType.PrintMaskedRandomNumber, 0, ""); do { var result = new Result(); infoMessage.PrintInformationalMessage((long)MessageType.Attempt, loop, ""); var input = Console.ReadLine(); if (!gameLogic.ValidateInput(input)) { continue; } var userInputDigits = gameLogic.GetDigitsFromNumber(Convert.ToInt32(input)); result = gameLogic.VerifyInput(randomNumberDigits, userInputDigits); if (result.IsExactMatch) { infoMessage.PrintInformationalMessage((long)MessageType.Won); infoMessage.PrintIndividualResult(result); infoMessage.PrintFinalResult((long)Constants.MaxAttempts, loop, (int)randomNumber); break; } infoMessage.PrintIndividualResult(result); loop++; }while (loop <= (long)Constants.MaxAttempts); //User has used all the chances. Hence, a message will be displayed to show he has lost. if (loop >= (long)Constants.MaxAttempts) { infoMessage.PrintInformationalMessage((long)MessageType.Lost); infoMessage.PrintFinalResult((long)Constants.MaxAttempts, (long)Constants.MaxAttempts, (int)randomNumber); } //Ask user if he/she would like to play the game again. infoMessage.PrintInformationalMessage((long)MessageType.Retry); userConfirmation = gameLogic.validateUserPermission(Console.ReadKey().KeyChar); if (userConfirmation == (long)ControlCommands.Exit) { return; } // If the player decides to play again, execution will start from line 44 else if (userConfirmation == (long)ControlCommands.StartGame) { loop = 1; goto Play; } }