#include #include #include #include #include #include using std::cout; using std::endl; using std::cin; using std::string; using std::this_thread::sleep_for; using std::this_thread::sleep_until; using std::chrono::nanoseconds; using std::chrono::system_clock; using std::chrono::seconds; typedef unsigned int unint; int main() { // //ПЕРЕМЕННЫЕ // //целочисленные переменные - счетчики очков, попыток (в т.ч. максимум), //числа юзера и рандомайзера int compwin=0, urwin=0, maxtimes, times=0, rng, knower=101, unknower=101, botZN=2, corZN=2, hotpos, topoutof, downoutof; // //массив "горячо"(меньше и больше) int hot[9]; // //условие для цикла тела игры string yn = "y"; // //булевые - дебаг-вывод, кто игрок, флаг ошибки bool debug, whollplay, hotflag=false, mistakeflag=false, rngZNwas=false; // //строковые константные char const *RAZD = "------------------"; char const *TOOCOLD = "hell bro TOO COLD"; char const *TOOHOT = "yo brodie dat SO HOT"; char const *BOTTHINK = "I think the number is:"; // //перечисление уровней сложности и переменная для свича уровня сложности enum difficult {EASY = 1, HARD = 2, NIGHTMARE = 3, FEDYA = 4}; unint dif; // // //ЗАГЛАВИЕ //пара разделителей и текст cout << RAZD << "\n" << RAZD << endl; cout << "ayyyy lmao wolcome do Doka 3! " << endl; // //БЛОК ПАРАМЕТРОВ //выбираем, кто угадывает число - комп (0) или игорёк (1) cout << "Who'll guess?\nType 1 to u or Type 0 to me:"; cin >> whollplay; if (whollplay) { cout << "OK. Here I'll generate number from 1 to 50. U must guess it if u don't want I'll rape ur back." << endl; cout << "CHOOSE UR DESTINY.\n1.EASY gives u 11 tries.\n2.HARD - 7 tries.\n3.NIGHTMARE - 4 tries.\n4.BROOO DON'T TYPE FEDYA (rly don't need do it)" << endl; cin >> dif; } else { //здесь бот рандомит себе уровень сложности. ФЕДЯ ему недоступен, т.к. это рофлосложность лично тебя, Паша)))))))00000 cout << "Well. I'll pick one of three difficulties. After that u should gimme a number from 1 to 50.\nI'll try to guess it." << endl; srand(static_cast(time(0))); dif = (rand() % 3) + 1; cout << RAZD << "\nMy difficult will be " << dif << endl; } // //СВИЧ УРОВНЯ СЛОЖНОСТИ //выбор уровня сложности из пеоечисления. бот может выбрать только из первых трёх switch (dif) { case EASY: cout << "DADDY PLZ DON'T BEAT ME! (11 tries)" << endl; maxtimes = 11; break; case HARD: cout << "U WANNA PLAY? LET'S PLAY! (7 tries)" << endl; maxtimes = 7; break; case NIGHTMARE: cout << "JEEZ DAT WAS SO COCKY. (4 tries)" << endl; maxtimes = 4; break; case FEDYA: cout << "DeLongia Software (tebe pizda)" << endl; maxtimes = 1; break; default: cout << "invalid parameter (you are invalid too brodie.)" << endl; return 0; } // //ДЕБАГ-МЕНЮ //дебаг вкл-выкл cout << "need a debug option? (0/1)" << endl; cin >> debug; if (debug==true) {cout << "Now u will see Debug after every enter, freaking cheater.\n" << endl;} // //ТЕЛО ИГРЫ //В конце цикл спрашивает - y/n. y перезапускает тело игры while (yn=="y") { // //Рандомайзер числа rng. srand(static_cast(time(0))); rng = (rand() % 50) + 1; // //ДЕБАГ //дебаг-опция выводит верный ответ и остальные параметры игры if (debug == true) { cout << ":::::::::::::::DEBUG BEGINS HERE:::::::::::::::" << endl; cout << "rng:" << rng << " | knower:" << knower << " | unknower:" << unknower << endl; cout << "guessed:" << urwin << " | unguessed:" << compwin << endl; cout << "hotmassive:"; for (int counter = 0; counter < 9; counter++) cout << hot[counter] << " "; cout << "\nhotflag:" << hotflag << " | times:" << times << " | botZN (1+,0-):" << botZN << " | mistakeflag:" << mistakeflag << endl; cout << ":::::::::::::::DEBUG ENDS HERE:::::::::::::::" << endl; } // //дуболомная проверка выхода за пределы хот-массива. //в случае подтверждения ошибки бот берет для дальнейшего угадывания последнее ближайшее к загаданному число //эту опцию нельзя засунуть в такое же условие ниже потому что алгоритм сломается и мне лень это чинить. if (hotflag) { if ((unknower==topoutof) or (unknower==downoutof)) { botZN=corZN; mistakeflag=true; unknower=hot[hotpos]; } } // //если нет хотфлага - в незнающего присвается нарандомленное. if (!hotflag) {unknower = rng;} // //при наличии хотфлага идет сверка нарандомленного ранее ботом знака. //при совпадении знаков - бот верно идет к правильному ответу. //при несовпадении - идет в обратную сторону и неизбежно ошибается. //ошибка отрабатывается при перезапуске цикла. else { if (((corZN==0) and (botZN==0)) or ((corZN==1) and (botZN==0))) {unknower--;} else if (((corZN==1) and (botZN==1)) or ((corZN==0) and (botZN==1))) {unknower++;} } // //Отработка выхода из числового диапазона 1-50. if (unknower>50) {unknower=unknower-50;} else if (unknower<1) {unknower=unknower+50;} // //Просто счётчик попыток ++times; // //Запрос программой числа. Если угадывает бот - просит загадать ему число. Иначе - бот просит отгадать его rng. //Определение знающего и незнающего if (whollplay) { cout << "wut r u waitin' 4? Try to guess - type ur number:" << endl; cin >> unknower; if (knower==101) {knower = rng;} } else if ((!whollplay) and (knower==101)) { cout << "Type ur fucking number, I'll guess." << endl; cin >> knower; } // //Рандомный механизм засыпания для бота //Нужен из-за подвязки рандомизатора к часам компьютера //Также симулирует задумчивость бота if (!whollplay) { srand(static_cast(time(0))); Sleep((rand() / 7)); } // //Цикл на заполнение массива "горячо" //Массив являет собой веер "горячо" для работы в дальнейшем //5pos содержит в себе верный ответ от загадывающего (знающего(knower)) //Также массив не выходит из интервала "от 1 до 50" for (int counter = 0; counter < 9; counter++) { hot[counter] = ((knower - 4) + counter); if (hot[counter] > 50) { hot[counter] = hot[counter] - 50; } else if (hot[counter] < 1) { hot[counter] = hot[counter] + 50; } } // //Сверка числа от незнающего на подобие в массиве. //Назначается флаг hotflag, если есть совпадение //Также назначается флаг корректного знака, который боту следует выбрать, //чтобы перебрать до нужного числа. //В начале цикла происходит сверка нарандомленного знака с корректным. //Бот рандомит знак для симуляции ошибки. for (int counter = 0; counter < 9; counter++) { if (hot[counter] == unknower) { hotflag = true; if ((whollplay) and (unknower!=knower)) {cout << TOOHOT << endl;} hotpos = counter; if (counter < 4) { corZN = 1; } else if (counter > 4) { corZN = 0; } break; } else if ((counter==8) and (whollplay)) {cout << TOOCOLD << endl;} } // //Угадайка от бота if ((!whollplay)) { //Переменные со значениями out of range //(нужно для симуляции ошибки у бота, если угадывает он) //Дойдя до одного из outof бот возвращается к последнему лучшему значению и с другим знаком идёт к верному ответу if (hot[8] == 50) { topoutof = 1; } else { topoutof = hot[8] + 1; } if (hot[0] == 1) { downoutof = 50; } else { downoutof = hot[0] - 1; } //Одноразовый рандом ботом знака (0-,1+) на основе прошлого srand. //После рандомизации присвивается true-флаг в rngZNwas if ((hotflag) and (!rngZNwas)) { srand(static_cast(time(0))); botZN = rand() % 2; rngZNwas=true; } // //Бот предлагает свою отгадку. cout << BOTTHINK << unknower << endl; } // //Итоги раунда. Блок активен если число угадано или достигнут максимум по попыткам. if ((unknower == knower) or (maxtimes==times)) { if (unknower!=knower) { ++compwin; cout << "Damn so unlucky. No more tries." << endl; if (whollplay) {cout << "The correct number was:" << knower << endl;} } else { ++urwin; cout << "Yeah! The correct number is:" << knower << endl; if (times == 1) {cout << "DAMMIT M8 SHIT GUESSED FROM 1st TIME!" << endl;} else if ((times <= maxtimes)) {cout << "sheee dat was not bad guessed it from " << times << " time!" << endl;} } switch (dif) { case 4: if (unknower!=knower) {cout << "Fedya found u and took ur ass. Fedya is happy." << endl;} else {cout << "How could u guess it??? Unfuckingbelievable! INSANE! Fedya is angry to u." << endl;} } // //запрос на новую итерацию цикла cout << "wanna play another time? (y/n)" << endl; cin >> yn; // //сброс переменных в исходное состояние hotflag = false, mistakeflag=false, rngZNwas=false; times=0, knower=101, unknower=101, botZN=2, corZN=2, hotpos=0, topoutof=0, downoutof=0; } } // //СТАТИСТИКА ПРИ ЗАВЕРШЕНИИ ИГРЫ cout << "SOME STATS OF SESSION:" << endl; //только на уровне сложности ФЕДЯ if (maxtimes==1) {cout << "fedya took ur ass " << compwin << " times.\nu r saved ur anus " << urwin << " times." << endl;} //в остальных случаях else if (!whollplay) {cout << "Hell u won me " << compwin << " times.\nAnd I won u " << urwin << " times." << endl;} else {cout << "I'm won " << compwin << " times.\nU won me " << urwin << " times." << endl;} // //компьютер респектует или лошит игрока if (maxtimes==1) {cout << "u had no chances loser, now u'll make notepad at DeLongia Software 2000 years." << endl;} if (!whollplay) {compwin = compwin ^ urwin; urwin = urwin ^ compwin; compwin = compwin ^ urwin;} if (compwin>urwin) {cout << "fuckyeah go back home lamer, u need some training." << endl;} else if (compwin