Advertisement
kiraventom

HFA 4.0 alpha6

Apr 12th, 2018
197
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 13.47 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdlib>
  3. #include <clocale>
  4. #include <string>
  5. #include <ctime>
  6. #include <conio.h>
  7. #include <windows.h>
  8.  
  9. using namespace std;
  10.  
  11. class Profile {
  12. public:
  13.     int Rarities[5];
  14.     string Name, Class;
  15.     //конструктор
  16.     Profile() {
  17.         setRarities(0, 0, 0, 0, 0);
  18.         setName("Бен Броуд");
  19.         setClass("Не выбран");
  20.     }
  21.     void setName(string NameInput) {
  22.         Name = NameInput;
  23.     }
  24.     void setClass(string ClassInput) {
  25.         Class = ClassInput;
  26.     }
  27.     void setRarities(int BasicsInput, int CommonsInput, int RaresInput, int EpicsInput, int LegendariesInput) {
  28.         /*Basics = BasicsInput;
  29.         Commons = CommonsInput;
  30.         Rares = RaresInput;
  31.         Epics = EpicsInput;
  32.         Legendaries = LegendariesInput;*/
  33.         Rarities[0] = BasicsInput;
  34.         Rarities[1] = CommonsInput;
  35.         Rarities[2] = RaresInput;
  36.         Rarities[3] = EpicsInput;
  37.         Rarities[4] = LegendariesInput;
  38.        
  39.     }
  40.     void getInfo() {
  41.         cout << "Имя:" << Name << endl;
  42.         cout << "Класс:" << Class << endl;
  43.     }
  44. };
  45. class Card {
  46. public:
  47.     int Rarity, Page, Position;
  48.     //конструктор
  49.     Card() {
  50.         setRarity(-1);
  51.         setCard(0, 0);
  52.     }
  53.     void setRarity(int RarityInput) {
  54.         Rarity = RarityInput;
  55.     }
  56.     void setCard(int PageInput, int PositionInput) {
  57.         Page = PageInput;
  58.         Position = PositionInput;
  59.     }
  60.     void getCard() {
  61.         cout << "Страница " << Page + 1 << ", " << Position + 1 << "-ая карта" << endl;
  62.     }
  63. };
  64.  
  65. void Localize();
  66. void Random();
  67. void ClearScreen();
  68.  
  69. void StartScreen();
  70. void Menu();
  71. void InitializeDraftClasses();
  72. string GenerateDraftClasses(int, string[]);
  73. string ChooseClass(string[]);
  74. void SetRarities();
  75. int RarityInput(int);
  76. void BuildDeck();
  77. void GenerateCard(int, int);
  78. void ShowDeckbyCard();
  79. void CardError(int);
  80. void ShowEntireDeck();
  81.  
  82. Profile Player;
  83. Card Deck[30];
  84. Card SortedDeck[30];
  85.  
  86. void Localize() {
  87.     setlocale(LC_CTYPE, "rus");
  88.     SetConsoleCP(1251);
  89.     SetConsoleOutputCP(1251);
  90. }
  91.  
  92. void Random() {
  93.     srand(time(NULL));
  94. } //Убрать эту ебалу
  95.  
  96. void ClearScreen() {
  97.     COORD topLeft = { 0, 0 };
  98.     HANDLE console = GetStdHandle(STD_OUTPUT_HANDLE);
  99.     CONSOLE_SCREEN_BUFFER_INFO screen;
  100.     DWORD written;
  101.  
  102.     GetConsoleScreenBufferInfo(console, &screen);
  103.     FillConsoleOutputCharacterA(
  104.         console, ' ', screen.dwSize.X * screen.dwSize.Y, topLeft, &written
  105.         );
  106.     FillConsoleOutputAttribute(
  107.         console, FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE,
  108.         screen.dwSize.X * screen.dwSize.Y, topLeft, &written
  109.         );
  110.     SetConsoleCursorPosition(console, topLeft);
  111.  
  112.     /*-----------*/
  113.     Player.getInfo();
  114.     cout << endl;
  115. }
  116.  
  117. void StartScreen() {
  118.     //Предупреждене о Lucida Console
  119.     cout << "\t\t  Дружественная арена Hearthstone" << endl;
  120.     cout << "\n\n\n\t\t\tНажмите любую кнопку" << endl;
  121.     cout << "\n\n\n\n\n\t\tEsli tekst otobrazahetsya nekorrektno, \n\tviberite shrift ''Lucida Console'' v nastroykah konsoli" << endl;
  122.     _getch();
  123. }
  124.  
  125. void Menu() {
  126.     char Input = '0';
  127.     string Name;
  128.     do {
  129.         ClearScreen();
  130.         Player.getInfo();
  131.         cout << "\t\t  Дружественная арена Hearthstone" << endl;
  132.         cout << "\n\t\t\t1. Начать новую арену" << endl;
  133.         cout << "\n\t\t     2. Правила дружеской арены" << endl;
  134.         cout << "\n\t\t\t      3. Выход" << endl;
  135.         Input = _getch();
  136.     } while (Input != '1' && Input != '2' && Input != '3');
  137.     switch (Input) {
  138.     case '1':
  139.         ClearScreen();
  140.         Player.getInfo();
  141.         cout << "Введите имя:" << endl;
  142.         cin >> Name;
  143.         Player.setName(Name);
  144.         ClearScreen();
  145.         Player.getInfo();
  146.         break;
  147.     case '2':
  148.         ClearScreen();
  149.         Player.getInfo();
  150.         cout << "\t\t\t  Смысл дружеской арены" << endl;
  151.         cout << "\n     Зачастую игроки Hearthstone не могут комфортно играть дуэли " << endl;
  152.         cout << "     друг между другом, сталкиваясь с проблемой разницы в наборе" << endl;
  153.         cout << " карт и колод. Также в игре существует режим ''Арена'', уравнивающий" << endl;
  154.         cout << "    опытных игроков и новичков, однако он недоступен для дружеской" << endl;
  155.         cout << "      дуэли. Эта небольшая утилита призвана решить эту проблему." << endl;
  156.         cout << "\n\t\t\t       Как играть" << endl;
  157.         cout << "\n    Игрок вводит своё имя, выбирает один из предложенных ему трёх" << endl;
  158.         cout << "     классов. Выбрав класс, игрок должен открыть свою коллекцию" << endl;
  159.         cout << "       в Hearthstone и создать пустую колоду выбранного класса." << endl;
  160.         cout << "    Далее игрок, выбирая при помощи внутриигровых фильтров поиска " << endl;
  161.         cout << "    карты определённой редкости, вводит номер последней страницы " << endl;
  162.         cout << "    коллекции при включенном фильтре той или иной редкости. После" << endl;
  163.         cout << "    этого утилита по очереди показывает игроку редкость, страницу " << endl;
  164.         cout << "       и положение на странице очередной карты, а игрок находит " << endl;
  165.         cout << "    соответствующую карту в коллекции и добавляет её в свою колоду." << endl;
  166.         cout << "      В случае невозможности добавить предложенную карту утилита" << endl;
  167.         cout << "     предусматривает перевыбор случайной карты. После добавления" << endl;
  168.         cout << " тридцатой карты игроку для удобства показывается вся колода целиком." << endl;
  169.  
  170.         cout << "\n\t       Нажмите любую кнопку, чтобы вернуться в меню" << endl;
  171.         _getch();
  172.         Menu();
  173.         break;
  174.     case '3':
  175.         exit(0);
  176.         break;
  177.     }
  178. }
  179.  
  180. void InitializeDraftClasses() {
  181.     string DraftClasses[] = { "NULL", "NULL", "NULL" };
  182.     for (int i = 0; i < 3; i++) { //Генерируем три класса для драфта
  183.         DraftClasses[i] = GenerateDraftClasses(i, DraftClasses);
  184.     }
  185.  
  186.     Player.setClass(ChooseClass(DraftClasses)); //Запоминаем класс игрока
  187.     ClearScreen();
  188.     Player.getInfo();
  189. }
  190.  
  191. string GenerateDraftClasses(int i, string DraftClasses[]) {
  192.     string AllClasses[] = { "Воин", "Шаман", "Разбойник", "Паладин", "Охотник", "Друид", "Чернокнижник", "Маг", "Жрец" };
  193.     string GeneratedClass = AllClasses[0 + rand() % 9];
  194.     switch (i) {
  195.     case 0: //Первый класс - выбираем случайный класс
  196.         return (GeneratedClass);
  197.         break;
  198.     case 1: //Второй класс - сравниваем с первым на несовпадение, иначе перезапускаем
  199.         while (GeneratedClass == DraftClasses[i - 1]) {
  200.             return GenerateDraftClasses(i, DraftClasses);
  201.         }
  202.         return (GeneratedClass);
  203.         break;
  204.     case 2: //Третий класс - сравниваем с первым и вторым на несовпадение, иначе перезапускаем
  205.         while (GeneratedClass == DraftClasses[i - 1] || GeneratedClass == DraftClasses[i - 2]) {
  206.             return GenerateDraftClasses(i, DraftClasses);
  207.         }
  208.         return (GeneratedClass);
  209.         break;
  210.     }
  211. }
  212.  
  213. string ChooseClass(string DraftClasses[]) {
  214.     char ClassInput = 0;
  215.     do { //выводим три сгенерированных класса
  216.         ClearScreen();
  217.         Player.getInfo();
  218.         cout << "Выберите номер класса:" << endl;
  219.         for (int i = 0; i < 3; i++) { //Выводим на экран три класса
  220.             cout << i + 1 << "." << DraftClasses[i] << endl;
  221.         }
  222.         ClassInput = _getch();
  223.     } while (ClassInput != '1' && ClassInput != '2' && ClassInput != '3');
  224.     switch (ClassInput) {
  225.     case '1':
  226.         return DraftClasses[((int)ClassInput - 48) - 1];
  227.         break;
  228.     case '2':
  229.         return DraftClasses[((int)ClassInput - 48) - 1];
  230.         break;
  231.     case '3':
  232.         return DraftClasses[((int)ClassInput - 48) - 1];
  233.         break;
  234.     }
  235. }
  236.  
  237. void SetRarities() {
  238.     int BasicsInput = 0, CommonsInput = 0, RaresInput = 0, EpicsInput = 0, LegendariesInput = 0;
  239.     for (int i = 0; i < 5; i++) {
  240.         switch (i) {
  241.         case 0:
  242.             BasicsInput = RarityInput(i);
  243.             break;
  244.         case 1:
  245.             CommonsInput = RarityInput(i);
  246.             break;
  247.         case 2:
  248.             RaresInput = RarityInput(i);
  249.             break;
  250.         case 3:
  251.             EpicsInput = RarityInput(i);
  252.             break;
  253.         case 4:
  254.             LegendariesInput = RarityInput(i);
  255.             break;
  256.         }
  257.     }
  258.     Player.setRarities(BasicsInput, CommonsInput, RaresInput, EpicsInput, LegendariesInput);
  259.     ClearScreen();
  260.     Player.getInfo();
  261. }
  262.  
  263. int RarityInput(int i) {
  264.     int Input;
  265.     string Rarities[] = { "базовых", "обычных", "редких", "эпических", "легендарных" };
  266.     do {
  267.         ClearScreen();
  268.         Player.getInfo();
  269.         cout << "Введите кол-во страниц " << Rarities[i] << " карт" << endl;
  270.         cin.clear();
  271.         cin.ignore(10000, '\n');
  272.         cin >> Input;
  273.     } while (cin.fail());
  274.     return (Input);
  275. }
  276.  
  277. void BuildDeck() {
  278.     int CardNumber, Chance;
  279.     for (CardNumber = 0; CardNumber < 30; CardNumber++) {
  280.         cout << "Генерируем колоду..." << ((CardNumber + 4) * 3) << "/100" << endl;
  281.         Chance = 0 + rand() % 100;
  282.         if (Chance < 15) { //Базовые
  283.             Deck[CardNumber].setRarity(0);
  284.             GenerateCard(Player.Rarities[0], CardNumber);
  285.         }
  286.         else if (Chance >= 15 && Chance < 45) { //Обычные
  287.             Deck[CardNumber].setRarity(1);
  288.             GenerateCard(Player.Rarities[1], CardNumber);
  289.         }
  290.         else if (Chance >= 45 && Chance < 85) { //Редкие
  291.             Deck[CardNumber].setRarity(2);
  292.             GenerateCard(Player.Rarities[2], CardNumber);
  293.         }
  294.         else if (Chance >= 85 && Chance < 95) { //Эпические
  295.             Deck[CardNumber].setRarity(3);
  296.             GenerateCard(Player.Rarities[3], CardNumber);
  297.         }
  298.         else if (Chance >= 95 && Chance < 100) { //Легендарные
  299.             Deck[CardNumber].setRarity(4);
  300.             GenerateCard(Player.Rarities[4], CardNumber);
  301.         }
  302.         ClearScreen();
  303.         Player.getInfo();
  304.     }
  305. }
  306.  
  307. void GenerateCard(int Pages, int CardNumber) {
  308.     int Page = 0 + rand() % Pages;
  309.     int Position = 0 + rand() % 8;
  310.     Deck[CardNumber].setCard(Page, Position);
  311. }
  312.  
  313. void ShowDeckbyCard() {
  314.     string AllRarities[] = { "Базовая", "Обычная", "Редкая", "Эпическая", "Легендарная" };
  315.     int RarityFilter = 4; //Фильтрует карты по убыванию редкости
  316.     int SortedCardNumber = 0; //Счетчик карт отфильтрованной колоды
  317.     while (RarityFilter >= 0) {
  318.         for (int CardNumber = 0; CardNumber < 30; CardNumber++) {
  319.             if (Deck[CardNumber].Rarity == RarityFilter) {
  320.                 cout << SortedCardNumber + 1 << "/30" << endl;
  321.                 cout << AllRarities[Deck[CardNumber].Rarity] << endl;
  322.                 Deck[CardNumber].getCard();
  323.                 cout << "Если ошибка 1, если нет любая кнопка" << endl;
  324.                 if (_getch() == '1') {
  325.                     CardError(CardNumber);
  326.                     cout << SortedCardNumber + 1 << "/30" << endl;
  327.                     cout << AllRarities[Deck[CardNumber].Rarity] << endl;
  328.                     Deck[CardNumber].getCard();
  329.                 };
  330.                 SortedDeck[SortedCardNumber].setCard(Deck[CardNumber].Page, Deck[CardNumber].Position);
  331.                 SortedDeck[SortedCardNumber].setRarity(Deck[CardNumber].Rarity);
  332.                 SortedCardNumber++;
  333.  
  334.             }
  335.             ClearScreen();
  336.             Player.getInfo();
  337.         }
  338.         RarityFilter--; //Все карты отфильтрованы, переходим к следующей редкости
  339.     }
  340. }
  341.  
  342. void CardError(int CardNumber) {
  343.     int OldPage = Deck[CardNumber].Page;
  344.     int OldPosition = Deck[CardNumber].Position;
  345.     do {
  346.         ClearScreen();
  347.         Player.getInfo();
  348.         GenerateCard(Player.Rarities[Deck[CardNumber].Rarity], CardNumber);
  349.     } while ((Deck[CardNumber].Page == OldPage) && (Deck[CardNumber].Position == OldPosition));
  350.     //НОРМАЛЬНАЯ ОБРАБОТКА ПОВТОРЕНИЯ КАРТЫ
  351. }
  352.  
  353. void ShowEntireDeck() {
  354.     string AllRarities[] = { "Базовая", "Обычная", "Редкая", "Эпическая", "Легендарная" };
  355.     ClearScreen();
  356.     Player.getInfo();
  357.     cout << "Номер \t Редкость \t Страница    Карта" << endl;
  358.     cout << "------------------------------------------" << endl;
  359.     for (int CardNumber = 0; CardNumber < 30; CardNumber++) {
  360.         if (SortedDeck[CardNumber].Rarity == 2) {
  361.             cout << CardNumber + 1 << "\t " << AllRarities[SortedDeck[CardNumber].Rarity] << "\t\t     " << SortedDeck[CardNumber].Page + 1 << "\t\t" << SortedDeck[CardNumber].Position + 1 << endl;
  362.             cout << "------------------------------------------" << endl;
  363.         }
  364.         else {
  365.             cout << CardNumber + 1 << "\t " << AllRarities[SortedDeck[CardNumber].Rarity] << "\t     " << SortedDeck[CardNumber].Page + 1 << "\t\t" << SortedDeck[CardNumber].Position + 1 << endl;
  366.             cout << "------------------------------------------" << endl;
  367.         }
  368.     }
  369.     cout << "Приятной игры!" << endl;
  370. }
  371.  
  372. int main() {
  373.     Localize();
  374.     Random();
  375.     StartScreen();
  376.     Menu();
  377.     InitializeDraftClasses();
  378.     SetRarities();
  379.     BuildDeck();
  380.     ShowDeckbyCard();
  381.     ShowEntireDeck();
  382.     /*---------------*/
  383.     cout << "Конец выполнения" << endl;
  384.     _getch();
  385.     return 0;
  386. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement