Проблемы из программой (язык C#)

Несколько дней назад начал учить язык, потому не надо принимать умных слов, которых я не пойму Хотел проверить свои знания программирования на этой программе:

Random rand = new Random();

int free;
free = rand.Next(1, 20);
string Cup = "Да";
string Cap = "Нет";
string Cyp = "Повторил";

Console.WriteLine("Количество прожетых тобой лет: " + free);
string paradox = Console.ReadLine();

if (paradox == Cup)
    Console.WriteLine("Я угадал");
else 
if (paradox == Cap)
    Console.WriteLine("Блин значит тебе " + free, " лет");
else 
if (paradox == Cyp)
    Console.WriteLine("Ой сорри, тебе " + free);

Console.ReadKey();
  1. Бывает повторяет числа, как этого избежать? А то больно часто бывают моменты показанные в скриншоте: введите сюда описание изображения

  2. Программа задаёт второй вопрос, как сделать так что-бы я мог ответить именно на второй вопрос


Ответы (2 шт):

Автор решения: aepot

Так как сейчас сложно понять, чего вы хотите получить.

Вместо прямого ответа на ваши вопросы, вот пример из классических обучающих задач по программированию (я его только что для вас написал): программа загадывает число от 0 до 100, пользователь пробует отгадать, получается своеобразная миниигра.

Изучите и потестируйте пример. Скорее всего он содержит ответы на все ваши вопросы.

Random rndGenerator = new Random(DateTime.Now.Millisecond);

int number = rndGenerator.Next(0, 100);

bool repeat = true;
int count = 0;

Console.WriteLine("Загадано число от 0 до 100, попробуй угадать!");
Console.WriteLine("(Для выхода просто нажми Enter)");

while (repeat)
{
    Console.Write("Введи число: ");
    string input = Console.ReadLine();
    if (input.Length > 0)
    {
        if (int.TryParse(input, out int tryNumber))
        {
            count++;
            if (number > tryNumber)
                Console.WriteLine("Больше");
            else
            if (number < tryNumber)
                Console.WriteLine("Меньше");
            else
            if (number == tryNumber)
            {
                Console.WriteLine("Угадал! Это число " + number + ".");
                Console.WriteLine("Количество попыток: " + count);
                repeat = false;
            }
        }
        else
            Console.WriteLine("Это не число, попробуй еще раз.");
    }
    else
    {
        Console.WriteLine("Сдаешься? Ну ладно.");
        repeat = false;                    
    }
}
Console.WriteLine("Пока!");
Console.ReadKey();
  • bool это либо true, либо false, значения истина или ложь используется для выражений сравнения, то есть логических выражений. Результат любого логического выражения можно записать в переменную типа bool.

  • DateTime.Now.Millisecond это текущее значение миллисекунд на часах компьютера.

  • while это цикл, который будет повторяться пока выражение в скобках имеет значение true.

  • int.TryParse(input, out int tryNumber) - это функция, которая возвращает bool, при преобразовании строки в число. И если преобразовать в число удалось - будет true, иначе false. input - входная строка, out int tryNumber - результат преобразования. Все это для того, что вы не можете напрямую сравнивать строку с числом и наоборот.

→ Ссылка
Автор решения: return
sealed class App
{
    [ThreadStatic]
    static readonly Random rand = new Random(); // @yolosora написал к комментариях по поводу сида
    static readonly Dictionary<string, string> answerFormats = new Dictionary<string, string>(3)
    {
        [@"Да"] = "Я угадал: тебе {0} лет",
        [@"Нет, мне (\d+)"] = "Извини, тебе {1} лет",
        [@"Повтори"] = "Повторяю: тебе {0} лет"
    };
    const RegexOptions answerPatternOpt = RegexOptions.IgnoreCase;

    App(ReadOnlySpan<string> args) { }

    static void Main(string[] args) => new App(args.AsSpan()).Run();
    public void Run()
    {
        var expectedYears = rand.Next(1, 20);
        var actualYears = -1;

        Console.WriteLine($"Тебе {expectedYears} лет?");

        string answerPattern = null!;

        while (true)
        {
            Console.Write(">>> ");
            var answer = Console.ReadLine();
            Match match = null!;

            foreach (var pattern in answerFormats.Keys)
            {
                match = Regex.Match(answer, pattern, answerPatternOpt);

                if (match.Success)
                {
                    if (match.Groups.Count == 2)
                    {
                        if (!int.TryParse(match.Groups[1].Value, out actualYears))
                        {
                            WriteError("некорректный возраст".AsSpan());

                            continue;
                        }
                    }

                    answerPattern = pattern;

                    break;
                }
            }

            if (answerPattern != null) break;

            WriteError("неверный синтаксис".AsSpan());
        }

        Console.WriteLine(string.Format(answerFormats[answerPattern], expectedYears, actualYears));
    }
    static void WriteError(ReadOnlySpan<char> msg)
    {
        var tempFc = Console.ForegroundColor;

        Console.ForegroundColor = ConsoleColor.Red;
        Console.Write("Ошибка: ");
        Console.WriteLine(msg);
        Console.ForegroundColor = tempFc;
    }
}

Такой код легко расширяем. Вы можете без проблем увеличить кол-во ответов с 3 до 4 и добавить внутрь инициализатора answerFormats вот такую строчку:

[@"Нет"] = "Извини"
→ Ссылка