Tenet1001 Ответов: 2

Я вычислил часть деления и сокращения диапазона, но теперь моя программа не закроется...


using System;

namespace Rinse_and_Repeat
{
	class Program
	{
		static void Main(string[] args)
		{
			string version = "1.2.0";
			string title = "Age Guesser";
			string author = "Tenet";
			int age;
			int tries = 0;
			int maxTries = 3;
			int guesses = 0;
			int totalGuesses = 0;
			int rangeHigh = 100;
			int rangeLow = 0;
			Console.WriteLine("Welcome to {0}! Version: {1} Author: {2}", title, version, author);
			while (true)
			{
				Console.WriteLine($"Tries: {tries} | Please input your age: ");
				
				var ageString = Console.ReadLine();

				if (Int32.TryParse(ageString, out age))
				{
					if (age <= 100 && age >= 0)
					{
						Console.WriteLine("Is this right: Y/N: " + age);

						if (Console.ReadKey().Key == ConsoleKey.Y) 
						{
							Console.Clear();
							break;
						}
					}
					else Console.WriteLine("You are either too old to be alive or too young to be playing this game");
				}

				if (++tries > maxTries) break;
			}

			Random random = new Random();
			while (true)
			{
				int guess = random.Next(rangeLow, rangeHigh);

				Console.WriteLine("Is my guess too high(Up Arrow), too low(Down Arrow), or perfect(P)?: " + guess);

				//trying to make it so if the rangeHigh is evenly divisiable it will divide it but if it isn't then it will just round down to the closest number
				if (Console.ReadKey().Key == ConsoleKey.UpArrow) 
				{
					if (rangeHigh % 2 == 0)
					{
						rangeHigh = rangeHigh / 2;
					}
					else
					{
						--rangeHigh;
						rangeHigh = rangeHigh / 2;
					}
				}

				//If they say the guess is too low, it multiplies the low range by 2
				else if (Console.ReadKey().Key == ConsoleKey.DownArrow)
				{
					rangeLow = rangeLow * 2;
				}

				//It just stops the program if the computer gets the guess right
				else if (Console.ReadKey().Key == ConsoleKey.P)
				{
					Console.WriteLine("Yay I got it!");
					break;
				}
			}
		}
	}
}


Что я уже пробовал:

//It just stops the program if the computer gets the guess right
				else (Console.ReadKey().Key == ConsoleKey.P)
				{
					Console.WriteLine("Yay I got it!");
					break;
				}

Tenet1001

Правка: МММ. Так что это вроде как работает...Мне просто нужно нажать клавишу "Р" 3 раза, чтобы она заработала, и я также сгладил еще несколько ошибок.

2 Ответов

Рейтинг:
14

phil.o

Не делай этого так; Console.ReadKey будет вызван для каждого из тестов, таким образом, 3 попытки вам нужно, чтобы получить то, что вы хотите. Вы можете попробовать

ConsoleKeyInfo key = Console.ReadKey();
switch (key.Key)
{
   case ConsoleKey.UpArrow:
      // ...
   case ConsoleKey.DownArrow:
      // ...
   case ConsoleKey.P:
      // ...
}
вместо. Таким образом, один вызов метода, один результат, от которого вы можете безопасно переключиться.


Рейтинг:
1

Dave Slama

решение phil.o определенно сработало бы, но я бы также предложил поместить консольный ввод в отдельный метод. Таким образом, вы можете перенаправить (зациклить) значение по умолчанию обратно к методу или заставить его сделать что-то еще. например

private static void GetUserInput() {
    ConsoleKeyInfo key = Console.ReadKey();
    switch (key.Key)
    {
        default:
            GetUserInput();
        case ConsoleKey.UpArrow:
            // do something ; break;
        case ConsoleKey.Q:
            Application.Exit();
    }
}

это также позволит вам легко внедрять функции и методы в ваше приложение и поможет с логическим потоком.