static void Main(string[] args)
        {
            SpeakingConsole.WriteLine("Please choose one of the following accents:");
            SpeakingConsole.WriteLine(SpeakingConsole.Language.US_English.GetDescription());
            SpeakingConsole.ChosenLanguage = SpeakingConsole.Language.British_English;
            SpeakingConsole.WriteLine(SpeakingConsole.Language.British_English.GetDescription());
            SpeakingConsole.ChosenLanguage = SpeakingConsole.ReadLine().Simplify() == SpeakingConsole.Language.US_English.GetDescription() ? SpeakingConsole.Language.US_English : SpeakingConsole.Language.British_English;

            bool blnFoundVoice = false;

            do
            {
                try
                {
                    SpeakingConsole.WriteLine("Please choose one of the following voices:");
                    foreach (SpeakingConsole.Voice voice in Enum.GetValues(typeof(SpeakingConsole.Voice)))
                    {
                        SpeakingConsole.ChosenVoice = voice;
                        SpeakingConsole.WriteLine(voice.ToString());
                    }
                    string strVoice = SpeakingConsole.ReadLine();
                    SpeakingConsole.ChosenVoice = (SpeakingConsole.Voice)Enum.Parse(typeof(SpeakingConsole.Voice), Array.Find(Enum.GetNames(typeof(SpeakingConsole.Voice)), s => s.Simplify() == strVoice.Simplify()));
                    blnFoundVoice = true;
                }
                catch
                {
                    blnFoundVoice = false;
                }
            } while (!blnFoundVoice);

            bool blnFoundSpeed = false;

            do
            {
                try
                {
                    SpeakingConsole.WriteLine("Please choose one of the following speeds:");
                    foreach (SpeakingConsole.Speed speed in Enum.GetValues(typeof(SpeakingConsole.Speed)))
                    {
                        SpeakingConsole.ChosenSpeed = speed;
                        SpeakingConsole.WriteLine(speed.ToString());
                    }
                    string strSpeed = SpeakingConsole.ReadLine();
                    SpeakingConsole.ChosenSpeed = (SpeakingConsole.Speed)Enum.Parse(typeof(SpeakingConsole.Speed), Array.Find(Enum.GetNames(typeof(SpeakingConsole.Speed)), s => s.Simplify() == strSpeed.Simplify()));
                    blnFoundSpeed = true;
                }
                catch
                {
                    blnFoundSpeed = false;
                }
            } while (!blnFoundSpeed);

            //Play starting sound
            System.Media.SystemSounds.Asterisk.Play();
            SpeakingConsole.WriteLine("Welcome to Rock Paper Scissors Lizard Spock.");
            SpeakingConsole.WriteLine("\nPlease choose a game mode from the following or enter its respective number (0 or 1):\n" + GameMode.Regular.GetDescription() + "\n" + GameMode.LettsEdition.GetDescription());
            string strGameMode;
            int    intGameMode = -1;

            while ((strGameMode = SpeakingConsole.ReadLine()).Simplify() != GameMode.Regular.GetDescription().Simplify() &&
                   strGameMode.Simplify() != GameMode.LettsEdition.GetDescription().Simplify() &&
                   (intGameMode = IntegerUtils.ForceParse(strGameMode)) != 0 && intGameMode != 1)
            {
                SpeakingConsole.WriteLine("Please enter a correct game mode from above");
            }
            playerUser.GameMode     = (intGameMode == 0 || strGameMode.Simplify() == GameMode.Regular.GetDescription().Simplify()) ? GameMode.Regular : GameMode.LettsEdition;
            playerComputer.GameMode = playerUser.GameMode;
            string strInput = string.Empty;

            while (strInput.Simplify() != EXIT_FLAG.Simplify())
            {
                SpeakingConsole.WriteLine("\nRound " + (playerUser.RoundsPlayed + 1) +
                                          "\nPlease enter one of the following choices or their respective numbers (starting from 1) " +
                                          "or enter \"" + EXIT_FLAG + "\" to exit out of the program: ");

                Array choices = Enum.GetValues(typeof(Choice));
                //Print out all the possible choices
                for (int i = 0; i < choices.Length; i++)
                {
                    Choice curChoice = ConvertIntegerToChoice((int)choices.GetValue(i));
                    if (curChoice == Choice.None)
                    {
                        continue;
                    }
                    SpeakingConsole.WriteLine(curChoice.ToString(playerUser.GameMode));
                }
                //Read the user input
                strInput = SpeakingConsole.ReadLine();
                //Exit if user wants to
                if (strInput.Simplify() == EXIT_FLAG.Simplify())
                {
                    continue;
                }

                //Get the user and computer choices and set them into their respective players
                Winner winner;
                if (int.TryParse(strInput, out int intInput))
                {
                    playerUser.Choice = ConvertIntegerToChoice(intInput);
                }
                else
                {
                    playerUser.Choice = ConvertStringToChoice(strInput, playerUser.GameMode);
                }

                //If the user entered an invalid choice, tell them so.
                if (playerUser.Choice == Choice.None)
                {
                    SpeakingConsole.WriteLine("\nPlease enter a valid choice");
                    continue;
                }
                //Play click sound
                System.Media.SystemSounds.Exclamation.Play();

                playerComputer.Choice = ConvertIntegerToChoice(rGen.Next(1, Enum.GetValues(typeof(Choice)).Length));

                //Decide who the winner is
                if (playerUser.Choice == playerComputer.Choice)
                {
                    winner = Winner.Draw;
                }
                else if (playerUser.Choice.CanBeat(playerComputer.Choice))
                {
                    winner = Winner.User;
                }
                else
                {
                    winner = Winner.Computer;
                }

                //Increment counters and display winner and stats
                playerUser.OnWinnerAnnounced(winner);
                playerComputer.OnWinnerAnnounced(winner);
                DisplayWinner(winner);
                //Wait 1 second.
                Thread.Sleep(1000);
                DisplayStats();
                ResetChoices();
                //Wait 1 second.
                Thread.Sleep(1000);
            }
            //Play closing sound
            System.Media.SystemSounds.Hand.Play();
            SpeakingConsole.Cleanup();
        }
 private static void DisplayStats()
 {
     //Display the stats using an overridden ToString() method
     SpeakingConsole.WriteLine("\nUser Stats: \n" + playerUser.ToString() + "\n");
     SpeakingConsole.WriteLine("Computer Stats: \n" + playerComputer.ToString() + "\n");
 }
 private static void DisplayWinner(Winner winner)
 {
     //Display the winner, then reset for a new game
     SpeakingConsole.WriteLine("\n" + winner.GetDescription() + "\n");
 }