Угадай число (оценка программы)

140
21 ноября 2019, 09:40

Всем привет. Продолжаю изучать C#. Написал небольшое консольное приложение: Угадай число. Оцените пожалуйста. Учел прошлый замечания по названиям переменных, разбивки по методам, комментарий кода. Само приложение работает, вроде ошибок не заметил. Тыкните носом что не так. Спасибо.

class Program
{
    static void Rules()
    {
        //Вывод правил игры
        Console.WriteLine("Правила игры: \nУгадай число, за определенное число попыток. \n\nНастроим условия игры: ");
    }
    static int GenerationRandValue(int interval)
    {
        Random rand = new Random();
        int rndValue = 1 + rand.Next(interval); //генерируем случайно число и записываем его в переменную
        return rndValue; //возвращаем рандомное значение
    }
    static string Game(int attemp, int rndValue, int interval)
    {
        int numAttemp = 0; //хранение количества попыток
        while (attemp > 0)
        {
            numAttemp++; //счетчик попыток (с какой угадал)
            attemp--; //счетчик попыток (сколько осталось)
            Console.WriteLine("Попытка " + numAttemp + ". Введите число: ");
            int entNum = Convert.ToInt32(Console.ReadLine()); //запись в переменную числа, которое ввел пользователь
            if (entNum == 0 || entNum > interval || entNum < 0)
            {
                return "Будь внимтельнее! От 1 до " + interval + ".";
            }
            if (entNum == rndValue)
            {
                return "Молодец! Ты угадал с " + numAttemp + " попытки.";
            }
        }
        return "Не угадал, это число " + rndValue + ".";
    }
    static void Main(string[] args)
    {
        Console.Title = "Угадай число"; //заголовок окна консоли
        Rules(); //вывод правил
        Console.WriteLine("Выберите промежуток чисел от 1 до ");
        int interval = Convert.ToInt32(Console.ReadLine()); //запись числа, которое будет промежутком в переменную
        Console.WriteLine("Введите количество попыток: ");
        int attemp = Convert.ToInt32(Console.ReadLine()); //запись числа, которое будет количеством попыток в переменную
        int rndValue = GenerationRandValue(interval); //записываем в переменную rndValue рандомное число, полученное из метода GenerationRandValue
        Console.WriteLine(Game(attemp, rndValue, interval));
        Console.ReadKey();
    }
}
Answer 1

Основные проблемы у вас по сути две:

  1. Random. Он у вас не выдаст случайное число при повторном вызове.

    Простой пример:

    for (int i = 0; i < 3; i++)
    {
        Console.WriteLine(GenerationRandValue(5));
    }
    

    Результат:

    2
    2
    2
    

    Решение тут банально простое, вынесите Random rand = new Random(); за пределы метода, не инициализируйте его каждый раз.

    static Random rand = new Random();
    static int GenerationRandValue(int interval)
    {
        int rndValue = 1 + rand.Next(interval); //генерируем случайно число и записываем его в переменную
        return rndValue; //возвращаем рандомное значение
    }
    
  2. Вы делаете следующее: Convert.ToInt32(Console.ReadLine()); - вы на 100% уверены, что пользователь введет число? Если нет, делайте проверку.

Далее как говорится на вкус и цвет:

  1. Я лично просто терпеть не могу всякие "Hello " + id + "world!", это занимает много места, и не всегда читабельно. Воспользуйтесь интерполяцией строк (С#6++). Тогда строка приобретет более короткий и понятный вид: $"Hello {id} world!".

  2. Старайтесь убирать дублирующие строки. Например вы постоянно спрашиваете пользователя число, записываете его и работаете дальше, так почему бы это не вынести в отдельный метод? К примеру мы сделаем метод, который выведет сообщение и начнет спрашивать число, проверяя его на валидность, результат отдаст далее:

    static int AskUser(string message)
    {
        Console.WriteLine(message);
        while (true)
        {
            if (int.TryParse(Console.ReadLine(), out int result))
                return result;
            Console.WriteLine("Не является числом!");
        }
    }
    

    Все, теперь строки:

    Console.WriteLine("Выберите промежуток чисел от 1 до ");
    int interval = Convert.ToInt32(Console.ReadLine());
    

    Мы заменяем всего лишь одной:

    int interval = AskUser("Выберите промежуток чисел от 1 до ");
    
READ ALSO
GridView из файла

GridView из файла

Такая проблема есть тестовый проект на yii2И нужно из 2 xml файлов собрать массив и вывести в gridView, сам массив собрать не особо сложно проблема...

135
Как вывести сообщение на сайте для браузера Mozilla

Как вывести сообщение на сайте для браузера Mozilla

Есть такой код, но он для Chrome а как сделать что для Mozilla выводилось сообщение?

114