Files
GuessMyNumber/main.cpp
vadim.bochkov 0d521917b3 Доступны два режима.
1 - отгадывает игрок. Ничего особенного.
2 - отгадывает комп. Бот псевдорандомно перебирает числа. Также реализована симуляция ошибки бота. Получая флаг "горячо", бот рандомно решает, плюсовать или минусовать своё решение. Пойдя в неверную сторону, он выйдет из массива "горячо" и тут же в него вернётся, перебирая с последнего ближайшего к разгадке числа.
2024-10-26 13:14:53 +05:00

240 lines
13 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include <iostream>
#include <cstdlib>
#include <ctime>
#include <chrono>
#include <thread>
#include <windows.h>
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<unint>(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<unint>(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<unint>(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<unint>(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<urwin) {cout << "well, dat was not bad how u beat me." << endl;}
else if (compwin==urwin) {cout << "dat was fairplay" << endl;}
return 1488;
}