kiraventom

HFA 4.0 alpha

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