Advertisement
kiraventom

HFA 4.0 stable

Apr 14th, 2018
190
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 15.58 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 ClearScreen();
  67.  
  68. void StartScreen();
  69. void Menu();
  70. void InitializeDraftClasses();
  71. string GenerateDraftClasses(int, string[]);
  72. string ChooseClass(string[]);
  73. void SetRarities();
  74. int RarityInput(int);
  75. void BuildDeck();
  76. void GenerateCard(int, int, int);
  77. void ShowDeckbyCard();
  78. void CardRepeatError(int);
  79. int LastPageError(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 ClearScreen() {
  93.     COORD topLeft = { 0, 0 };
  94.     HANDLE console = GetStdHandle(STD_OUTPUT_HANDLE);
  95.     CONSOLE_SCREEN_BUFFER_INFO screen;
  96.     DWORD written;
  97.  
  98.     GetConsoleScreenBufferInfo(console, &screen);
  99.     FillConsoleOutputCharacterA(
  100.         console, ' ', screen.dwSize.X * screen.dwSize.Y, topLeft, &written
  101.     );
  102.     FillConsoleOutputAttribute(
  103.         console, FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE,
  104.         screen.dwSize.X * screen.dwSize.Y, topLeft, &written
  105.     );
  106.     SetConsoleCursorPosition(console, topLeft);
  107. }
  108.  
  109. void StartScreen() {
  110.     //Предупреждене о Lucida Console
  111.     cout << "\t\t  Дружественная арена Hearthstone" << endl;
  112.     cout << "\n\n\n\t\t\tНажмите любую кнопку" << endl;
  113.     cout << "\n\n\n\n\n\t\tEsli tekst otobrazahetsya nekorrektno, \n\tviberite shrift ''Lucida Console'' v nastroykah konsoli" << endl;
  114.     _getch();
  115. }
  116.  
  117. void Menu() {
  118.     char Input = '0';
  119.     string Name;
  120.     do {
  121.         ClearScreen();
  122.         Player.getInfo();
  123.         cout << "\t\t  Дружественная арена Hearthstone" << endl;
  124.         cout << "\n\t\t\t1. Начать новую арену" << endl;
  125.         cout << "\n\t\t     2. Правила дружеской арены" << endl;
  126.         cout << "\n\t\t\t      3. Выход" << endl;
  127.         Input = _getch();
  128.     } while (Input != '1' && Input != '2' && Input != '3');
  129.     switch (Input) {
  130.     case '1':
  131.         ClearScreen();
  132.         Player.getInfo();
  133.         cout << "Введите имя:" << endl;
  134.         cin >> Name;
  135.         Player.setName(Name);
  136.         ClearScreen();
  137.         Player.getInfo();
  138.         break;
  139.     case '2':
  140.         ClearScreen();
  141.         Player.getInfo();
  142.         cout << "\t\t\t  Смысл дружеской арены" << endl;
  143.         cout << "\n     Зачастую игроки Hearthstone не могут комфортно играть дуэли " << endl;
  144.         cout << "     друг между другом, сталкиваясь с проблемой разницы в наборе" << endl;
  145.         cout << " карт и колод. Также в игре существует режим ''Арена'', уравнивающий" << endl;
  146.         cout << "    опытных игроков и новичков, однако он недоступен для дружеской" << endl;
  147.         cout << "      дуэли. Эта небольшая утилита призвана решить эту проблему." << endl;
  148.         cout << "\n\t\t\t       Как играть" << endl;
  149.         cout << "\n    Игрок вводит своё имя, выбирает один из предложенных ему трёх" << endl;
  150.         cout << "     классов. Выбрав класс, игрок должен открыть свою коллекцию" << endl;
  151.         cout << "       в Hearthstone и создать пустую колоду выбранного класса." << endl;
  152.         cout << "    Далее игрок, выбирая при помощи внутриигровых фильтров поиска " << endl;
  153.         cout << "    карты определённой редкости, вводит номер последней страницы " << endl;
  154.         cout << "    коллекции при включенном фильтре той или иной редкости. После" << endl;
  155.         cout << "    этого утилита по очереди показывает игроку редкость, страницу " << endl;
  156.         cout << "       и положение на странице очередной карты, а игрок находит " << endl;
  157.         cout << "    соответствующую карту в коллекции и добавляет её в свою колоду." << endl;
  158.         cout << "      В случае невозможности добавить предложенную карту утилита" << endl;
  159.         cout << "     предусматривает перевыбор случайной карты. После добавления" << endl;
  160.         cout << " тридцатой карты игроку для удобства показывается вся колода целиком." << endl;
  161.  
  162.         cout << "\n\t       Нажмите любую кнопку, чтобы вернуться в меню" << endl;
  163.         _getch();
  164.         Menu();
  165.         break;
  166.     case '3':
  167.         exit(0);
  168.         break;
  169.     }
  170. }
  171.  
  172. void InitializeDraftClasses() {
  173.     string DraftClasses[] = { "NULL", "NULL", "NULL" };
  174.     for (int i = 0; i < 3; i++) { //Генерируем три класса для драфта
  175.         DraftClasses[i] = GenerateDraftClasses(i, DraftClasses);
  176.     }
  177.  
  178.     Player.setClass(ChooseClass(DraftClasses)); //Запоминаем класс игрока
  179.     ClearScreen();
  180.     Player.getInfo();
  181. }
  182.  
  183. string GenerateDraftClasses(int i, string DraftClasses[]) {
  184.     string AllClasses[] = { "Воин", "Шаман", "Разбойник", "Паладин", "Охотник", "Друид", "Чернокнижник", "Маг", "Жрец" };
  185.     string GeneratedClass = AllClasses[0 + rand() % 9];
  186.     switch (i) {
  187.     case 0: //Первый класс - выбираем случайный класс
  188.         return (GeneratedClass);
  189.         break;
  190.     case 1: //Второй класс - сравниваем с первым на несовпадение, иначе перезапускаем
  191.         while (GeneratedClass == DraftClasses[i - 1]) {
  192.             return GenerateDraftClasses(i, DraftClasses);
  193.         }
  194.         return (GeneratedClass);
  195.         break;
  196.     case 2: //Третий класс - сравниваем с первым и вторым на несовпадение, иначе перезапускаем
  197.         while (GeneratedClass == DraftClasses[i - 1] || GeneratedClass == DraftClasses[i - 2]) {
  198.             return GenerateDraftClasses(i, DraftClasses);
  199.         }
  200.         return (GeneratedClass);
  201.         break;
  202.     }
  203. }
  204.  
  205. string ChooseClass(string DraftClasses[]) {
  206.     char ClassInput = 0;
  207.     do { //выводим три сгенерированных класса
  208.         ClearScreen();
  209.         Player.getInfo();
  210.         cout << "Выберите номер класса:" << endl;
  211.         for (int i = 0; i < 3; i++) { //Выводим на экран три класса
  212.             cout << i + 1 << "." << DraftClasses[i] << endl;
  213.         }
  214.         ClassInput = _getch();
  215.     } while (ClassInput != '1' && ClassInput != '2' && ClassInput != '3');
  216.     switch (ClassInput) {
  217.     case '1':
  218.         return DraftClasses[((int)ClassInput - 48) - 1];
  219.         break;
  220.     case '2':
  221.         return DraftClasses[((int)ClassInput - 48) - 1];
  222.         break;
  223.     case '3':
  224.         return DraftClasses[((int)ClassInput - 48) - 1];
  225.         break;
  226.     }
  227. }
  228.  
  229. void SetRarities() {
  230.     int BasicsInput = 0, CommonsInput = 0, RaresInput = 0, EpicsInput = 0, LegendariesInput = 0;
  231.     for (int i = 0; i < 5; i++) {
  232.         switch (i) {
  233.         case 0:
  234.             BasicsInput = RarityInput(i);
  235.             break;
  236.         case 1:
  237.             CommonsInput = RarityInput(i);
  238.             break;
  239.         case 2:
  240.             RaresInput = RarityInput(i);
  241.             break;
  242.         case 3:
  243.             EpicsInput = RarityInput(i);
  244.             break;
  245.         case 4:
  246.             LegendariesInput = RarityInput(i);
  247.             break;
  248.         }
  249.     }
  250.     Player.setRarities(BasicsInput, CommonsInput, RaresInput, EpicsInput, LegendariesInput);
  251.     ClearScreen();
  252.     Player.getInfo();
  253. }
  254.  
  255. int RarityInput(int i) {
  256.     int Input;
  257.     string Rarities[] = { "базовых", "обычных", "редких", "эпических", "легендарных" };
  258.     do {
  259.         ClearScreen();
  260.         Player.getInfo();
  261.         cout << "Введите кол-во страниц " << Rarities[i] << " карт" << endl;
  262.         cin.clear();
  263.         cin.ignore(10000, '\n');
  264.         cin >> Input;
  265.     } while (cin.fail());
  266.     return (Input);
  267. }
  268.  
  269. void BuildDeck() {
  270.     int CardNumber, Chance;
  271.     for (CardNumber = 0; CardNumber < 30; CardNumber++) {
  272.         cout << "Генерируем колоду..." << ((CardNumber + 4) * 3) << "/100" << endl;
  273.         Chance = 0 + rand() % 100;
  274.         if (Chance < 15) { //Базовые
  275.             Deck[CardNumber].setRarity(0);
  276.             GenerateCard(Player.Rarities[0], CardNumber, 8);
  277.         }
  278.         else if (Chance >= 15 && Chance < 45) { //Обычные
  279.             Deck[CardNumber].setRarity(1);
  280.             GenerateCard(Player.Rarities[1], CardNumber, 8);
  281.         }
  282.         else if (Chance >= 45 && Chance < 85) { //Редкие
  283.             Deck[CardNumber].setRarity(2);
  284.             GenerateCard(Player.Rarities[2], CardNumber, 8);
  285.         }
  286.         else if (Chance >= 85 && Chance < 95) { //Эпические
  287.             Deck[CardNumber].setRarity(3);
  288.             GenerateCard(Player.Rarities[3], CardNumber, 8);
  289.         }
  290.         else if (Chance >= 95 && Chance < 100) { //Легендарные
  291.             Deck[CardNumber].setRarity(4);
  292.             GenerateCard(Player.Rarities[4], CardNumber, 8);
  293.         }
  294.         ClearScreen();
  295.         Player.getInfo();
  296.     }
  297. }
  298.  
  299. void GenerateCard(int Pages, int CardNumber, int CardsOnPage) {
  300.     int Page = 0 + rand() % Pages;
  301.     int Position = 0 + rand() % CardsOnPage;
  302.     Deck[CardNumber].setCard(Page, Position);
  303. }
  304.  
  305. void ShowDeckbyCard() {
  306.     string AllRarities[] = { "Базовая", "Обычная", "Редкая", "Эпическая", "Легендарная" };
  307.     int RarityFilter = 4; //Фильтрует карты по убыванию редкости
  308.     int SortedCardNumber = 0; //Счетчик карт отфильтрованной колоды
  309.     while (RarityFilter >= 0) {
  310.         for (int CardNumber = 0; CardNumber < 30; CardNumber++) {
  311.             if (Deck[CardNumber].Rarity == RarityFilter) {
  312.                 cout << SortedCardNumber + 1 << "/30" << endl;
  313.                 cout << AllRarities[Deck[CardNumber].Rarity] << endl;
  314.                 Deck[CardNumber].getCard();
  315.                 CardRepeatError(CardNumber);
  316.                 ClearScreen();
  317.                 Player.getInfo();
  318.                 Deck[CardNumber].getCard();
  319.                 //cout << "Если ошибка 1, если нет любая кнопка" << endl;
  320.                 /*if (_getch() == '1') {
  321.                     CardError(CardNumber);
  322.                     cout << SortedCardNumber + 1 << "/30" << endl;
  323.                     cout << AllRarities[Deck[CardNumber].Rarity] << endl;
  324.                     Deck[CardNumber].getCard();
  325.                 };*/
  326.                 SortedDeck[SortedCardNumber].setCard(Deck[CardNumber].Page, Deck[CardNumber].Position);
  327.                 SortedDeck[SortedCardNumber].setRarity(Deck[CardNumber].Rarity);
  328.                 SortedCardNumber++;
  329.  
  330.             }
  331.             ClearScreen();
  332.             Player.getInfo();
  333.         }
  334.         RarityFilter--; //Все карты отфильтрованы, переходим к следующей редкости
  335.     }
  336. }
  337.  
  338. void CardRepeatError(int CardNumber) {
  339.     int OldPage = Deck[CardNumber].Page;
  340.     int OldPosition = Deck[CardNumber].Position;
  341.     int RepeatFlag = 1;
  342.     int RepeatCounter = 0;
  343.     int CardsOnPage = LastPageError(CardNumber);
  344.     if (CardsOnPage == 8) {
  345.         if (Deck[CardNumber].Rarity == 4) {
  346.             do {
  347.                 GenerateCard(Player.Rarities[Deck[CardNumber].Rarity], CardNumber, 8);
  348.                 for (int i = 0; i < CardNumber; i++) {
  349.                     if ((Deck[i].Page == Deck[CardNumber].Page) && (Deck[i].Position == Deck[CardNumber].Position)) {
  350.                         RepeatFlag = 0;
  351.                         break;
  352.                     }
  353.                 }
  354.             } while (RepeatFlag != 1);
  355.         }
  356.         else {
  357.             do {
  358.                 GenerateCard(Player.Rarities[Deck[CardNumber].Rarity], CardNumber, 8);
  359.                 for (int i = 0; i < CardNumber; i++) {
  360.                     if ((Deck[i].Page == Deck[CardNumber].Page) && (Deck[i].Position == Deck[CardNumber].Position) && (RepeatCounter == 0)) {
  361.                         RepeatCounter++;
  362.                     }
  363.                     else if ((Deck[i].Page == Deck[CardNumber].Page) && (Deck[i].Position == Deck[CardNumber].Position) && (RepeatCounter != 0)) {
  364.                         RepeatFlag = 0;
  365.                         break;
  366.                     }
  367.                 }
  368.             } while (RepeatFlag != 1);
  369.         }
  370.     }
  371.     else {
  372.         if (Deck[CardNumber].Rarity == 4) {
  373.             do {
  374.                 GenerateCard(Player.Rarities[Deck[CardNumber].Rarity], CardNumber, CardsOnPage);
  375.                 for (int i = 0; i < CardNumber; i++) {
  376.                     if ((Deck[i].Page == Deck[CardNumber].Page) && (Deck[i].Position == Deck[CardNumber].Position)) {
  377.                         RepeatFlag = 0;
  378.                         break;
  379.                     }
  380.                 }
  381.             } while (RepeatFlag != 1);
  382.         }
  383.         else {
  384.             do {
  385.                 GenerateCard(Player.Rarities[Deck[CardNumber].Rarity], CardNumber, CardsOnPage);
  386.                 for (int i = 0; i < CardNumber; i++) {
  387.                     if ((Deck[i].Page == Deck[CardNumber].Page) && (Deck[i].Position == Deck[CardNumber].Position) && (RepeatCounter == 0)) {
  388.                         RepeatCounter++;
  389.                     }
  390.                     else if ((Deck[i].Page == Deck[CardNumber].Page) && (Deck[i].Position == Deck[CardNumber].Position) && (RepeatCounter != 0)) {
  391.                         RepeatFlag = 0;
  392.                         break;
  393.                     }
  394.                 }
  395.             } while (RepeatFlag != 1);
  396.         }
  397.     }
  398. }
  399.  
  400. int LastPageError(int CardNumber) {
  401.     int CardsOnPage = 8;
  402.     cout << "Если на странице не 8 карт, нажмите 1" << endl;
  403.         if (_getch() == '1') {
  404.             do {
  405.                 ClearScreen();
  406.                 Player.getInfo();
  407.                 cout << "Введите кол-во карт на странице" << endl;
  408.                 cin.clear();
  409.                 cin.ignore(10000, '\n');
  410.                 cin >> CardsOnPage;
  411.             } while ((cin.fail()) || CardsOnPage > 7 || CardsOnPage < 1);
  412.         }
  413.         return CardsOnPage;
  414. }
  415.  
  416. void ShowEntireDeck() {
  417.     string AllRarities[] = { "Базовая", "Обычная", "Редкая", "Эпическая", "Легендарная" };
  418.     ClearScreen();
  419.     Player.getInfo();
  420.     cout << "Номер \t Редкость \t Страница    Карта" << endl;
  421.     cout << "------------------------------------------" << endl;
  422.     for (int CardNumber = 0; CardNumber < 30; CardNumber++) {
  423.         if (SortedDeck[CardNumber].Rarity == 2) {
  424.             cout << CardNumber + 1 << "\t " << AllRarities[SortedDeck[CardNumber].Rarity] << "\t\t     " << SortedDeck[CardNumber].Page + 1 << "\t\t" << SortedDeck[CardNumber].Position + 1 << endl;
  425.             cout << "------------------------------------------" << endl;
  426.         }
  427.         else {
  428.             cout << CardNumber + 1 << "\t " << AllRarities[SortedDeck[CardNumber].Rarity] << "\t     " << SortedDeck[CardNumber].Page + 1 << "\t\t" << SortedDeck[CardNumber].Position + 1 << endl;
  429.             cout << "------------------------------------------" << endl;
  430.         }
  431.     }
  432.     cout << "Приятной игры!" << endl;
  433. }
  434.  
  435. int main() {
  436.     Localize();
  437.     srand(time(NULL));
  438.     StartScreen();
  439.     Menu();
  440.     InitializeDraftClasses();
  441.     SetRarities();
  442.     BuildDeck();
  443.     ShowDeckbyCard();
  444.     ShowEntireDeck();
  445.     /*---------------*/
  446.     cout << "Конец выполнения" << endl;
  447.     _getch();
  448.     return 0;
  449. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement