Доступны два режима.
1 - отгадывает игрок. Ничего особенного. 2 - отгадывает комп. Бот псевдорандомно перебирает числа. Также реализована симуляция ошибки бота. Получая флаг "горячо", бот рандомно решает, плюсовать или минусовать своё решение. Пойдя в неверную сторону, он выйдет из массива "горячо" и тут же в него вернётся, перебирая с последнего ближайшего к разгадке числа.
This commit is contained in:
261
main.cpp
261
main.cpp
@ -1,83 +1,240 @@
|
|||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <cstdlib>
|
#include <cstdlib>
|
||||||
#include <ctime>
|
#include <ctime>
|
||||||
|
#include <chrono>
|
||||||
|
#include <thread>
|
||||||
|
#include <windows.h>
|
||||||
|
|
||||||
using std::cout; using std::endl; using std::cin; using std::string; typedef unsigned int unint;
|
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 main() {
|
||||||
|
//
|
||||||
//переменные
|
//ПЕРЕМЕННЫЕ
|
||||||
int compwin=0, urwin=0, maxtimes, times=1, rng, usercount=101; string yn = "y";
|
//
|
||||||
const char *RAZD = "------------------"; unint dif; bool debug;
|
//целочисленные переменные - счетчики очков, попыток (в т.ч. максимум),
|
||||||
char const *TOOCOLD = "hell bro TOO COLD"; char const *TOOHOT = "yo brodie dat SO HOT";
|
//числа юзера и рандомайзера
|
||||||
|
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};
|
enum difficult {EASY = 1, HARD = 2, NIGHTMARE = 3, FEDYA = 4};
|
||||||
|
unint dif;
|
||||||
|
//
|
||||||
|
|
||||||
//заглавие
|
//
|
||||||
cout << RAZD << "\n" << RAZD << endl; cout << "ayyyy lmao welcome do Doka 3!" << endl;
|
//ЗАГЛАВИЕ
|
||||||
cout << "CHOOSE UR DESTINY.\n1.EASY gives u 10 tries.\n2.HARD - 6 tries.\n3.NIGHTMARE - 3 tries.\n4.BROOO DON'T TYPE FEDYA" << endl;
|
//пара разделителей и текст
|
||||||
cin >> 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) {
|
switch (dif) {
|
||||||
case EASY:
|
case EASY:
|
||||||
cout << "DADDY PLZ DON'T BEAT ME!" << endl; maxtimes = 10; break;
|
cout << "DADDY PLZ DON'T BEAT ME! (11 tries)" << endl; maxtimes = 11; break;
|
||||||
case HARD:
|
case HARD:
|
||||||
cout << "U WANNA PLAY? LET'S PLAY!" << endl; maxtimes = 6; break;
|
cout << "U WANNA PLAY? LET'S PLAY! (7 tries)" << endl; maxtimes = 7; break;
|
||||||
case NIGHTMARE:
|
case NIGHTMARE:
|
||||||
cout << "U'LL NEVER WIN." << endl; maxtimes = 3; break;
|
cout << "JEEZ DAT WAS SO COCKY. (4 tries)" << endl; maxtimes = 4; break;
|
||||||
case FEDYA:
|
case FEDYA:
|
||||||
cout << "DeLongia Software ebat'" << endl; maxtimes = 1; break;
|
cout << "DeLongia Software (tebe pizda)" << endl; maxtimes = 1; break;
|
||||||
default:
|
default:
|
||||||
cout << "invalid parameter (you are invalid too brodie.)" << endl; return 0;
|
cout << "invalid parameter (you are invalid too brodie.)" << endl; return 0;
|
||||||
}
|
}
|
||||||
|
//
|
||||||
|
//ДЕБАГ-МЕНЮ
|
||||||
//дебаг вкл-выкл
|
//дебаг вкл-выкл
|
||||||
cout << "need a debug option? (0/1)" << endl;
|
cout << "need a debug option? (0/1)" << endl;
|
||||||
cin >> debug; if (debug==true) {cout << "freaking cheater." << endl;}
|
cin >> debug; if (debug==true) {cout << "Now u will see Debug after every enter, freaking cheater.\n" << endl;}
|
||||||
cout << "I've generated number from 1 to 50. Can u guess it? ";
|
//
|
||||||
|
|
||||||
//ТЕЛО ИГРЫ
|
//ТЕЛО ИГРЫ
|
||||||
|
//В конце цикл спрашивает - y/n. y перезапускает тело игры
|
||||||
while (yn=="y") {
|
while (yn=="y") {
|
||||||
//рандомайзер
|
//
|
||||||
cout << "wut r u waitin' 4? type ur number:" << endl;
|
//Рандомайзер числа rng.
|
||||||
srand(static_cast<unint>(time(0)));
|
srand(static_cast<unint>(time(0)));
|
||||||
rng = (rand() % 50) + 1;
|
rng = (rand() % 50) + 1;
|
||||||
|
//
|
||||||
//дебаг-опция выводит верный ответ и счёт после каждого прокрута
|
//ДЕБАГ
|
||||||
if (debug==true) {cout << "rng:" << rng << "\ncompscore:" << compwin << "\nuserscore:" << urwin << endl;}
|
//дебаг-опция выводит верный ответ и остальные параметры игры
|
||||||
|
if (debug == true) {
|
||||||
//тело угадайки
|
cout << ":::::::::::::::DEBUG BEGINS HERE:::::::::::::::" << endl;
|
||||||
while (usercount != rng)
|
cout << "rng:" << rng << " | knower:" << knower << " | unknower:" << unknower << endl;
|
||||||
{
|
cout << "guessed:" << urwin << " | unguessed:" << compwin << endl;
|
||||||
cin >> usercount;
|
cout << "hotmassive:";
|
||||||
if (usercount>rng) {if (usercount-rng>=5) {cout << TOOCOLD << endl;} else {cout << TOOHOT << endl;}}
|
for (int counter = 0; counter < 9; counter++) cout << hot[counter] << " ";
|
||||||
if (usercount<rng) {if (rng-usercount>=5) {cout << TOOCOLD << endl;} else {cout << TOOHOT << endl;}}
|
cout << "\nhotflag:" << hotflag << " | times:" << times << " | botZN (1+,0-):" << botZN << " | mistakeflag:" << mistakeflag << endl;
|
||||||
if ((usercount==rng) or (maxtimes==times)) {break;}
|
cout << ":::::::::::::::DEBUG ENDS HERE:::::::::::::::" << endl;
|
||||||
++times;
|
}
|
||||||
};
|
//
|
||||||
|
//дуболомная проверка выхода за пределы хот-массива.
|
||||||
//итоги раунда
|
//в случае подтверждения ошибки бот берет для дальнейшего угадывания последнее ближайшее к загаданному число
|
||||||
if ((times==1) and (usercount==rng)) {++urwin; cout << "DAMMIT M8 U GUESSED IT FROM " << times << "st TIME!" << endl;}
|
//эту опцию нельзя засунуть в такое же условие ниже потому что алгоритм сломается и мне лень это чинить.
|
||||||
else if ((times<=maxtimes) and (usercount==rng)) {++urwin; cout << "sheee not bad u guessed it from " << times << " time!" << endl;}
|
if (hotflag) {
|
||||||
else {++compwin ;cout << "damn u lost." << endl;}
|
if ((unknower==topoutof) or (unknower==downoutof)) {
|
||||||
//прекол (только на уровне сложности ФЕДЯ)
|
botZN=corZN; mistakeflag=true; unknower=hot[hotpos];
|
||||||
if (maxtimes==1) {cout << "fedya also found u and took ur ass." << endl;}
|
}
|
||||||
|
}
|
||||||
//предложение нового раунда
|
//
|
||||||
cout << "wanna play another time? (y/n)" << endl;
|
//если нет хотфлага - в незнающего присвается нарандомленное.
|
||||||
times = 1;
|
if (!hotflag) {unknower = rng;}
|
||||||
cin >> yn;
|
//
|
||||||
|
//при наличии хотфлага идет сверка нарандомленного ранее ботом знака.
|
||||||
|
//при совпадении знаков - бот верно идет к правильному ответу.
|
||||||
|
//при несовпадении - идет в обратную сторону и неизбежно ошибается.
|
||||||
|
//ошибка отрабатывается при перезапуске цикла.
|
||||||
|
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 UR SESSION:" << endl;
|
cout << "SOME STATS OF SESSION:" << endl;
|
||||||
//только на уровне сложности ФЕДЯ
|
//только на уровне сложности ФЕДЯ
|
||||||
if (maxtimes==1) {cout << "fedya took ur ass " << compwin << " times.\nu r saved ur anus " << urwin << " times." << endl;}
|
if (maxtimes==1) {cout << "fedya took ur ass " << compwin << " times.\nu r saved ur anus " << urwin << " times." << endl;}
|
||||||
//в остальных случаях
|
//в остальных случаях
|
||||||
else {cout << "I'm won " << compwin << " times.\nu won me " << 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;}
|
if (compwin>urwin) {cout << "fuckyeah go back home lamer, u need some training." << endl;}
|
||||||
else {cout << "well, dat was not bad how u beat me." << 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;
|
return 1488;
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user