Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

C++ игра быки и коровы

Diana Ahadova Ученик (117), закрыт 1 год назад
Помогите пожалуйста,как написать программу с рекурсией
Программа «загадывает» четырёхзначное число и
играющий должен угадать его. После ввода
пользователем числа программа сообщает, сколько
цифр числа угадано (быки) и сколько цифр угадано и
стоит на нужном месте (коровы). После отгадывания
числа на экран необходимо вывести коли-чество
сделанных пользователем попыток. В программе
необходимо использовать рекурсию.
Лучший ответ
Сергей Гений (56248) 1 год назад
#include <iostream>
#include <conio.h>
using namespace std;

void try_it(uint8_t*& arr, uint16_t trying)
{
cout << "Введите 4-х значное число\n";
char ch;
uint8_t beefs{}, cows{};
for (uint8_t i = 0; i < 4; i++)
{
ch = _getch(); //запрашивает 1 символ, ввод нажимать не требуется
cout << (int)ch-48; //печатает эквивалент в цифре
arr[i] == ch - 48? cows++,beefs++: count(arr, arr + 4, ch - 48) ? beefs++:NULL;
//если эквивалент в цифре на своем месте - коровы и быки +1 иначе если цифра есть в массиве - быки +1
}
cout << "\nБыки = " << (int)beefs << "\tКоровы = " << (int)cows << endl;
if (cows == 4) //если все цифры на своем месте ТАДА! выходим из рекурсии
{
cout << "Вы угадали! Потрачено " << trying << " попыток!" << endl; return;
}
else return try_it(arr, trying + 1); //иначе продолжить а число попыток увеличить на 1
}

int main()
{
setlocale(0, "");
srand(time(nullptr));
uint8_t number[4]{ rand() % 10,rand() % 10 ,rand() % 10 ,rand() % 10 }; //загадываение 4исла в виде массива из 4 цифрь
uint8_t* numptr = number; //чисто для передачи в функцию
uint16_t trying{1}; //счетчик попыток
try_it(numptr, trying); //передаем в функцию загаданное число и текущую попытку
}
Остальные ответы
Николай Веселуха Высший разум (360686) 1 год назад
#include <iostream>
#include <random>
#include <cmath>
#include <string>
#include <set>
using namespace std;
int random_value(int length) {
const auto n = static_cast<int>(pow(10, length - 1));
const auto m = static_cast<int>(pow(10, length)) - 1;
uniform_int_distribution<> uid(n, m);
mt19937 gen{ random_device()() };
return uid(gen);
}
multiset<int> split(int value) {
multiset<int> box;
do box.insert(value % 10); while (value /= 10);
return box;
}
size_t bulls_and_cows(const int rv, const int length) {
static size_t attemp = 0;
cout << "Input " << length << " value: ";
int value;
cin >> value;
++attemp;
if (static_cast<int>(log10(value)) != length - 1) {
puts("Error!");
} else {
multiset<int> a = split(rv);
multiset<int> b = split(value);
auto bulls = 0;
for (auto x : b) if (a.contains(x)) ++bulls;
auto cows = 0;
auto x = rv;
do if (x % 10 == value % 10) ++cows; while (x /= 10, value /= 10);
cout << "Bulls: " << bulls << '\n';
cout << "Cows: " << cows << '\n';
if (cows == length) {
auto result = attemp;
attemp = 0;
a.clear();
return result;
}
}
return bulls_and_cows(rv, length);
}
int main() {
const auto length = 4;
const auto rv = random_value(length);
const auto count = bulls_and_cows(rv, length);
cout << "\nAttempts: " << count << '\n';
}
Похожие вопросы