- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
#include <iostream>
#include <ctime>
#include <string>
#include <random>
#include <algorithm>
#include <iomanip> // для ограничения количества вводимых симолов для std::cin
void compUsrWthCmptr(std::string userInput, std::string computerInput)
{
    std::reverse(userInput.begin(), userInput.end());//  Считаем правильно угаданные позиции
    std::reverse(computerInput.begin(), computerInput.end());
    int guessedPositions{ 0 };
    for (int i = 0; (i < userInput.length()) && (i < computerInput.length()); ++i)
    {
        if (userInput[i] == computerInput[i])
        {
            guessedPositions++;
        }
    }
    std::string::iterator it_userInput;
    std::string::iterator it_computerInput;
    it_userInput = std::unique(userInput.begin(), userInput.end()); // Удаляем повторяющиеся цифры
    userInput.resize(std::distance(userInput.begin(), it_userInput));
    it_computerInput = std::unique(computerInput.begin(), computerInput.end());
    computerInput.resize(std::distance(computerInput.begin(), it_computerInput));
    int guessedDigits{ 0 }; //  Считаем количество правильно угаданных цифр без учета повторяющихся
    for (int i = 0; i < userInput.length(); ++i)
    {
        for (int x = 0; x < computerInput.length(); ++x)
        {
            if (userInput[i] == computerInput[x])
            {
                guessedDigits++;
            }
        }
    }
    std::cout << "  Угадано: " << guessedDigits << ". Соответствует своим разрядам: " << guessedPositions << std::endl << std::endl;
};
void startTheGame()
{
    int pcsRandomNumber = getRandomNumber(0, 999);      //Загаданое число.
    std::cout << "  Компьютер загадал трехзначное число от 0 до 999!\n" << "  Это: " << pcsRandomNumber << std::endl << std::endl;
    std::string pcNumber{ std::to_string(pcsRandomNumber) };
    bool win = false;
    do
    {
        int usersGuess = getUsersGuess();
        std::string guess{ std::to_string(usersGuess) };
        std::cout << "  Ваш вариант : " << guess << std::endl;
        compUsrWthCmptr(guess, pcNumber);
        if (usersGuess == pcsRandomNumber)
        {
            win = true;
            std::cout << "  *** Вы угадали число " << pcsRandomNumber << "!***\n";
        }
    } while (!win);
};
int getUsersGuess()
{
    while (true) // цикл продолжается до тех пор, пока пользователь не введет корректное значение
    {
        std::cout << "  Введите коректное значение: ";
        int a;
        std::cin >> std::setw(3) >> a;
        if (std::cin.fail()) // если предыдущее извлечение оказалось неудачным,
        {
            std::cin.clear(); // то возвращаем cin в 'обычный' режим работы
            std::cin.ignore(32767, '\n'); // и удаляем значения предыдущего ввода из входного буфера
            std::cout << "  Предыдущее извлечение оказалось неудачным. Попытайтесь еще раз.\n\n";
        }
        else
        {
            if (a >= 1000 || a < 0)
            {
                std::cin.ignore(32767, '\n'); // удаляем лишние значения
                std::cout << "  Введенное число вне требуемого диапазонате. Попытайтесь еще раз.\n\n";
            }
            else
            {
                std::cin.ignore(32767, '\n'); // удаляем лишние значения
                return a;
            }
        }
    }
}
int getRandomNumber(int min, int max)
{
    return static_cast<int>(rand() % (max - min + 1) + min);
}
int main()
{
    setlocale(LC_ALL, "Russian");
    srand(static_cast<unsigned int>(time(0)));
    startTheGame();
    return 0;
}
                                 
        
            Начинающий говнокодер просит оценить его код. Где/что можно улучшить если возможно. Благодарю
//Напишите программу реализующую игру «Угадай число».Компьютер загадывает число от 0 до 999 (используйте генерацию случайных чисел), 
//а пользователь угадывает его.На каждом шаге угадывающий делает предположение, а задумавший число — сообщает, сколько цифр из числа угаданы 
//и сколько из угаданных цифр занимают правильные позиции в числе.Например, если задумано число 725 и выдвинуто предположение, 
//что задумано число 523, то угаданы две цифры(5 и 2) и одна из них занимает верную позицию.
        
        
> {
> return static_cast<int>(rand() % (max - min + 1) + min);
> }
Хуевый рандом, распределение будет неравномерным. См. https://govnokod.ru/26014#comment511028
В крестоговне есть такая хуйня: std::uniform_int_distribution - используй ее.
Для полного счастья надо брать divisor = (RAND_MAX+1) / range, но посчитать без переполнения.
P.S. Кстати, x / divisor и x % range чем-то отличаются на практике, кроме выдачи разных случайных последовательностей для одного и того же сида?
Фу, питушня! Надо чтоб T std::dereference<T>(T*), по аналогии с std::plus.
Зачем, зачем?
почему не
> int guessedPositions = 0;
?
Зачем в крестах придумали столько говноспособов что-то проинициализировать?
Чтобы гомоиконность гомогенность: все инициализаторы в одном и том же виде. Я, правда, за «obj{};».
int можно не инициализировать, а непримитивные классы всегда инициализируются.
прикол есть еще в том, что foo() это нифига не вызов конструктора, а указатель на функцию, но в 11 завезли инициализацию foo{}
для int есть два способа видимо потому что шаблоны
как поддерживали простые типы и сложные?
пацаны на хате сидят, и звонят клиентам сбербанка.
Это 265
Как же я теперь его угадывать буду )))
https://lurkmore.to/265
> Как же я теперь его угадывать буду )))
Ну это баг. В качестве воркэраунда можно предварительно заклеить непрозрачной изолентой то место на экране, в котором число выводится.
laba | grep -v "Это "