Rock_Hero

Game Black Jeck

Sep 11th, 2020 (edited)
449
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include<iostream>
  2. #include<array>
  3. #include<ctime>
  4. #include"Cin_check.h"
  5.  
  6. // для удобства///
  7. using std::cout;
  8. using std::endl;
  9. using std::cin;
  10. /////////////////
  11. ///////////// Глобальные переменные что бы не набивать и так не маленькие параметры функций
  12. static int g_count_diller = 0;
  13. static int g_count_player = 0;
  14. static int g_maney_diller = 100;
  15. static int g_maney_player = 100;
  16. static int g_reset = 0;
  17. ///////////////////////////////////////////////////////////////////////////////////////////
  18. enum Value_of_cards  // достоинства карт
  19. {
  20.     CARD,           // 1
  21.     CARD_TWO,       // 2
  22.     CARD_THREE,     // 3
  23.     CARD_FOUR,      // 4
  24.     CARD_FIVE,      // 5
  25.     CARD_SIX,       // 6
  26.     CARD_SEVEN,     // 7
  27.     CARD_EIGHT,     // 8
  28.     CARD_NINE,      // 9
  29.     CARD_TEN,       // 10
  30.     CARD_JACK,      // 11
  31.     CARD_QUEEN,     // 12
  32.     CARD_KING,      // 13
  33.     CARD_ACE,       // 14
  34.     CARD_LENGHT,    // 15
  35. };
  36.  
  37. enum Suit_of_cards // масть карт
  38. {
  39.     PEAK,           // 1
  40.     CROSS,          // 2
  41.     DIAMOND,        // 3
  42.     HEART,          // 4
  43.     SUIT_LENGHT,    // 5
  44. };
  45.  
  46.  
  47. struct Card  // структура параметром которой стоит перечисление
  48. {
  49.     Value_of_cards rank;
  50.     Suit_of_cards suit;
  51. };
  52. int Random();
  53. void printHend(std::array<Card, 10>& arr);
  54. int getCardValue(const Card& card);
  55. void Gamestart(std::array<Card, 52>& deck, std::array<Card, 10>& player_arr, std::array<Card, 10>& diller_arr, int& player_score, int& diller_score, int& random);
  56. void swapCard(Card& card_a, Card& card_b);
  57. void shuffleDeck(std::array<Card, 52>& deck);
  58. void printDeck(const std::array<Card, 52>& deck);
  59. void printCard(const Card& card);
  60. void getCardPlayer(std::array<Card, 52>& deck, std::array<Card, 10>& player_arr, int& player_score, int& random);
  61. void getCardDiller(std::array<Card, 52>& deck, std::array<Card, 10>& diller_arr, int& diller_score, int& random);
  62. void gameLogick(int& diller_score, int& player_score, std::array<Card, 10>& diller_arr, std::array<Card, 10>& player_arr);
  63.  
  64. // возвращает значение полученных карт
  65. int getCardValue(const Card& card)
  66. {
  67.     switch (card.rank)
  68.     {
  69.     case CARD_TWO:          return 2;
  70.     case CARD_THREE:        return 3;
  71.     case CARD_FOUR:         return 4;
  72.     case CARD_FIVE:         return 5;
  73.     case CARD_SIX:          return 6;
  74.     case CARD_SEVEN:        return 7;
  75.     case CARD_EIGHT:        return 8;
  76.     case CARD_NINE:         return 9;
  77.     case CARD_TEN:          return 10;
  78.     case CARD_JACK:         return 10;
  79.     case CARD_QUEEN:        return 10;
  80.     case CARD_KING:         return 10;
  81.     case CARD_ACE:          return 11;
  82.     }
  83.  
  84.     return 0;
  85. }
  86.  
  87. // показывает какие карты в руке
  88. void printHend(std::array<Card,10> &arr)
  89. {
  90.     for (int i = 0; arr[i].rank != '\0'; i++) // выполнять до того как не найдет в массиве нуль терминатор
  91.     {
  92.         printCard(arr[i]);
  93.         cout<< " ,";
  94.     }
  95.     cout << '\b';  //Cursor moves 1 position backwards
  96.     cout << " ";   //Overwrites letter 'i' with space
  97.     // что бы убрать последнюю запятую
  98. }
  99.  
  100. // показывает что за карта в массиве
  101. void printCard(const Card& card)
  102. {
  103.     switch (card.rank)
  104.     {
  105.  
  106.     case CARD_TWO:          std::cout << "2"; break;
  107.     case CARD_THREE:        std::cout << "3"; break;
  108.     case CARD_FOUR:         std::cout << "4"; break;
  109.     case CARD_FIVE:         std::cout << "5"; break;
  110.     case CARD_SIX:          std::cout << "6"; break;
  111.     case CARD_SEVEN:        std::cout << "7"; break;
  112.     case CARD_EIGHT:        std::cout << "8"; break;
  113.     case CARD_NINE:         std::cout << "9"; break;
  114.     case CARD_TEN:          std::cout << "10"; break;
  115.     case CARD_JACK:         std::cout << "Валет"; break;
  116.     case CARD_QUEEN:        std::cout << "Дама"; break;
  117.     case CARD_KING:         std::cout << "Король"; break;
  118.     case CARD_ACE:          std::cout << "Туз"; break;
  119.     }
  120.  
  121.     switch (card.suit)
  122.     {
  123.     case PEAK:              std::cout << " Пик"; break;
  124.     case CROSS:             std::cout << " Крест"; break;
  125.     case DIAMOND:           std::cout << " Бубей"; break;
  126.     case HEART:             std::cout << " Черв"; break;
  127.     }
  128.     //std::cout<<std::endl;
  129. }
  130.  
  131. // вывод всех карт
  132. void printDeck(const std::array<Card, 52>& deck)
  133. {
  134.     for (const auto& number : deck)
  135.     {
  136.         printCard(number);
  137.     }
  138. }
  139.  
  140. // перемешивание всех карт
  141. void shuffleDeck( std::array<Card, 52>& deck)
  142. {
  143.  
  144.     for (int i = 0; i < 150; i++)
  145.     {
  146.         int r1 = 0 + rand() % (52 - 0), r2 = 0 + rand() % (52 - 0);
  147.         swapCard(deck[r1], deck[r2]);
  148.     }
  149. }
  150.  
  151. // перемещение 2 карт
  152. void swapCard(Card& card_a, Card& card_b)
  153. {
  154.     std::swap(card_a, card_b);
  155. }
  156.  
  157. // старт игры(раздачи)  игрокам выдаются начальные карты и мешается колода
  158. void Gamestart(std::array<Card, 52>& deck,std::array<Card,10> &player_arr, std::array<Card,10> &diller_arr, int &player_score, int & diller_score,int &random)
  159. {
  160.     shuffleDeck(deck);
  161.  
  162.      random = 0 + rand() % (42 - 0);
  163.  
  164.     diller_arr[g_count_diller] = deck[random];
  165.     diller_score += getCardValue(deck[random]);
  166.     random++;
  167.  
  168.     player_arr[g_count_player] = deck[random];
  169.     player_score += getCardValue(deck[random]);
  170.     random++;
  171.     g_count_player++;
  172.     player_arr[g_count_player] = deck[random];
  173.     player_score += getCardValue(deck[random]);
  174.    
  175.  
  176. }
  177.  
  178. // игрок хочет взять еще 1 карту
  179. void getCardPlayer(std::array<Card, 52>& deck, std::array<Card, 10>& player_arr, int& player_score, int& random)
  180. {
  181.  
  182.     random++;
  183.     g_count_player++;
  184.     player_arr[g_count_player] = deck[random];
  185.     player_score += getCardValue(deck[random]);
  186. }
  187.  
  188. // дилер хочет взять еще 1 карту
  189. void getCardDiller(std::array<Card, 52>& deck, std::array<Card, 10>& diller_arr, int& diller_score, int& random)
  190. {
  191.  
  192.     random++;
  193.     g_count_diller++;
  194.     diller_arr[g_count_diller] = deck[random];
  195.     diller_score += getCardValue(deck[random]);
  196. }
  197.  
  198. //сравнение результатов и завершение раунда
  199. void gameLogick(int& diller_score, int& player_score, std::array<Card, 10>& diller_arr, std::array<Card, 10>& player_arr)
  200. {
  201.     system("cls<NUL");
  202.  
  203.     if (diller_score > 21)
  204.     {
  205.         cout<< "############################ Black Jack ############################" << endl
  206.             << "### " << "Ваши деньги " << g_maney_player; cout << " ######################### " << "Деньги диллера " << g_maney_diller; cout << " ###" << endl
  207.             << "####################################################################" << endl
  208.             << endl
  209.             << endl
  210.             << "Карты дилера - "; printHend(diller_arr); cout << "= " << diller_score << " очков" << endl
  211.             << endl
  212.             << endl
  213.             << "Ваши карты -    "; printHend(player_arr); cout << "= " << player_score << " очков" << endl
  214.             << endl
  215.             << endl;
  216.             cout << "Карты дилера превысили 21 очко,он проиграл раунд" << endl;
  217.             g_maney_diller -= 10;
  218.         system("pause");
  219.         system("cls<NUL");
  220.     }
  221.     else if (player_score > 21)
  222.     {
  223.         cout << "############################ Black Jack ############################" << endl
  224.             << "### " << "Ваши деньги " << g_maney_player; cout << " ######################### " << "Деньги диллера " << g_maney_diller; cout << " ###" << endl
  225.             << "####################################################################" << endl
  226.             << endl
  227.             << endl
  228.             << "Карты дилера - "; printHend(diller_arr); cout << "= " << diller_score << " очков" << endl
  229.             << endl
  230.             << endl
  231.             << "Ваши карты -    "; printHend(player_arr); cout << "= " << player_score << " очков" << endl
  232.             << endl
  233.             << endl;
  234.         cout << "Ваши карты превысили 21 очко,вы проиграли раунд" << endl;
  235.         g_maney_player -= 10;
  236.         system("pause");
  237.         system("cls<NUL");
  238.  
  239.  
  240.  
  241.  
  242.     }
  243.     else if (player_score > diller_score)
  244.     {
  245.         cout << "############################ Black Jack ############################" << endl
  246.             << "### " << "Ваши деньги " << g_maney_player; cout << " ######################### " << "Деньги диллера " << g_maney_diller; cout << " ###" << endl
  247.             << "####################################################################" << endl
  248.             << endl
  249.             << endl
  250.             << "Карты дилера - "; printHend(diller_arr); cout << "= " << diller_score << " очков" << endl
  251.             << endl
  252.             << endl
  253.             << "Ваши карты -    "; printHend(player_arr); cout << "= " << player_score << " очков" << endl
  254.             << endl
  255.             << endl;
  256.         cout << "Сумма ваших очков выше чем у дилера,вы выиграли раунд!" << endl;
  257.         g_maney_diller -= 10;
  258.         system("pause");
  259.         system("cls<NUL");
  260.     }
  261.     else if (player_score < diller_score)
  262.     {
  263.         cout << "############################ Black Jack ############################" << endl
  264.             << "### " << "Ваши деньги " << g_maney_player; cout << " ######################### " << "Деньги диллера " << g_maney_diller; cout << " ###" << endl
  265.             << "####################################################################" << endl
  266.             << endl
  267.             << endl
  268.             << "Карты дилера - "; printHend(diller_arr); cout << "= " << diller_score << " очков" << endl
  269.             << endl
  270.             << endl
  271.             << "Ваши карты -    "; printHend(player_arr); cout << "= " << player_score << " очков" << endl
  272.             << endl
  273.             << endl;
  274.         cout << "Сумма очков дилера выше чем ваша,вы проиграли раунд!" << endl;
  275.         g_maney_player -= 10;
  276.         system("pause");
  277.         system("cls<NUL");
  278.     }
  279.     else if (player_score == diller_score)
  280.     {
  281.         cout << "############################ Black Jack ############################" << endl
  282.             << "### " << "Ваши деньги " << g_maney_player; cout << " ######################### " << "Деньги диллера " << g_maney_diller; cout << " ###" << endl
  283.             << "####################################################################" << endl
  284.             << endl
  285.             << endl
  286.             << "Карты дилера - "; printHend(diller_arr); cout << "= " << diller_score << " очков" << endl
  287.             << endl
  288.             << endl
  289.             << "Ваши карты -    "; printHend(player_arr); cout << "= " << player_score << " очков" << endl
  290.             << endl
  291.             << endl;
  292.         cout << "Очки дилера и ваши равны,ничья!Следующий рануд!" << endl;
  293.        
  294.         system("pause");
  295.         system("cls<NUL");
  296.     }
  297.  
  298.    
  299.     g_reset++;
  300. }
  301.  
  302.  
  303.  
  304.  
  305.  
  306.  
  307.  
  308. int main()
  309. {
  310.     bool while_lock = true; // переменная для выхода из игры
  311.  
  312.     srand(Random()); // Сранд с параметром в виде вихря Марсена
  313.  
  314.     setlocale(0, ""); // рус язык
  315.  
  316.     /////////////////////////////////// Заполнение массива структурным значением из перечисления
  317.     std::array<Card,52> deck;
  318.  
  319.     int card = 0;
  320.     for (int suit = 0; suit < SUIT_LENGHT; ++suit)
  321.         for (int rank = 1; rank < CARD_LENGHT; ++rank)
  322.         {
  323.             deck[card].suit = static_cast<Suit_of_cards>(suit);
  324.             deck[card].rank = static_cast<Value_of_cards>(rank);
  325.             ++card;
  326.         }
  327.     ////////////////////////////////////////////////////////////////////////////////////////////
  328.  
  329.    
  330.  
  331.     while (while_lock)   ///Цикл глав меню
  332.     {
  333.         system("cls<NUL");
  334.         int menu_value = 0;                  //глав меню
  335.         int game_menu_value = 0;             // меню в игре
  336.         int diller_score = 0;                // очки дилера
  337.         std::array <Card,10> diller_hend {}; // то что в руке у дилера
  338.         int player_score = 0;                // очки игрока
  339.         std::array <Card, 10> player_hend{}; // то что в руке у игрока
  340.         bool game = true;                    // продолжение игры
  341.         int random_card = 0;                 // для того что бы карты не повторялись
  342.         g_maney_diller = 100;                // Востановление глоб. переменной для рестарта игры
  343.         g_maney_player = 100;                //Востановление глоб. переменной для рестарта игры
  344.  
  345.         std::cout << "\t\t\tВас приветствует игра Black Jack!" << endl
  346.                 << "1) Начать Игру" << endl
  347.                 << "2) Прочитать правила игры" << endl
  348.                 << "3) Выход" << endl;
  349.  
  350.         cin >> menu_value;
  351.         Proverka(menu_value);// проверка корректности ввода
  352.  
  353.         switch (menu_value) // меню
  354.         {
  355.         case 1:
  356.            
  357.             Gamestart(deck, player_hend, diller_hend, player_score, diller_score, random_card);
  358.  
  359.             while (game)
  360.             {
  361.                 system("cls<NUL");
  362.                 ////////////////////////////////////Проверка денег игроков/////
  363.                 if (g_maney_diller == 0)
  364.                 {
  365.                     cout << "Поздравляем!!! Вы разорили диллера!" << endl<<endl;
  366.                     system("pause");
  367.                     break;
  368.                 }
  369.                 else if(g_maney_player == 0)
  370.                 {
  371.                     cout << "Увы диллер переиграл вас..." << endl << endl;
  372.                     system("pause");
  373.                     break;
  374.                 }
  375.                 ///////////////////////////////////////////////////////////////
  376.  
  377.  
  378.                 /////////////////////////////////////////////////////////////////////Графика игры///////////////////
  379.                 cout<< "############################ Black Jack ############################" << endl
  380.                     << "### "<<"Ваши деньги "<< g_maney_player; cout << " ######################### "<<"Деньги диллера "<< g_maney_diller; cout << " ###" << endl
  381.                     << "####################################################################" << endl
  382.                     << endl
  383.                     << endl
  384.                     << "Карты диллера - "; printHend(diller_hend); cout << "= " << diller_score << " очков" << endl
  385.                     << endl
  386.                     << endl
  387.                     << "Ваши карты -    "; printHend(player_hend); cout << "= " << player_score << " очков" << endl
  388.                     << endl
  389.                     << endl;
  390.                 cout<< endl
  391.                     << "1)Взять карту" << endl
  392.                     << "2)Хватит " << endl
  393.                     << "9)Выйти в меню" << endl
  394.                     << endl;
  395.                 cin >> game_menu_value;
  396.                 Proverka(game_menu_value);// проверка корректности ввода
  397.                 /////////////////////////////////////////////////////////////////////////////////////////////////////
  398.  
  399.                 switch (game_menu_value) // выбор действий в игре
  400.                 {
  401.                 case 1: // игрок берет карту и проверяется есть ли перебор
  402.  
  403.                     getCardPlayer(deck, player_hend, player_score, random_card);
  404.                     if (player_score > 21)
  405.                     {
  406.                         gameLogick(diller_score, player_score, diller_hend, player_hend);
  407.                         shuffleDeck(deck);
  408.                     }
  409.                     break;
  410.  
  411.                 case 2:  // диллер берет карты после чего идет сравнение кто победил в раунде
  412.                     while (true)
  413.                     {
  414.                         if (diller_score > 17)
  415.                         {
  416.                             break;
  417.                         }
  418.  
  419.                         getCardDiller(deck, diller_hend, diller_score, random_card);
  420.                     }
  421.                     gameLogick(diller_score, player_score, diller_hend, player_hend);
  422.                     shuffleDeck(deck);
  423.                     break;
  424.  
  425.  
  426.                 case 9: // выход в глав меню
  427.                    
  428.  
  429.                     game = false;
  430.  
  431.                     break;
  432.                 default:
  433.                     break;
  434.                 }
  435.  
  436.  
  437.                 if (g_reset) // Ресет  для того что бы повторно начать игру
  438.                 {
  439.                     menu_value = 0;
  440.                     game_menu_value = 0;
  441.                     diller_score = 0;
  442.                     diller_hend = {};
  443.                     player_score = 0;
  444.                     player_hend = {};
  445.                     game = true;
  446.                     random_card = 0;
  447.                     g_count_diller = 0;
  448.                     g_count_player = 0;
  449.  
  450.  
  451.                     Gamestart(deck, player_hend, diller_hend, player_score, diller_score, random_card);
  452.  
  453.                     g_reset--;
  454.                 }
  455.  
  456.             }
  457.  
  458.             break; // выход 1 кейса
  459.  
  460.         case 2:  // правила игры
  461.  
  462.             system("cls<NUL");
  463.             cout << "Цель игры" << endl
  464.  
  465.                 << "Главная цель игры в блэк джек - победа над дилером."<<endl
  466.                 << "Если сумма ваших очков больше, чем сумма очков крупье то вы выигрываете сдачу." << endl
  467.                 << "Лучшей комбинацией при игре в блэк джек считается та, которая оценивается 21. " << endl
  468.                 << "Если же на руках игрока более 21 очка, то он автоматически проигрывает раздачу. " << endl
  469.                 << endl
  470.                 << "Значение карт " << endl
  471.                 << endl
  472.                 << "Карты в блэк джеке оцениваются в соответствии с номиналом.Туз  11 очков, " << endl
  473.                 << "а валет, дама и король - 10 очков.Остальные карты оцениваются от 2 до 9. " << endl<<endl;
  474.  
  475.             system("pause");
  476.  
  477.             break;// выход 2 кейса
  478.  
  479.         case 3: // выход из игры
  480.             while_lock = false;
  481.             break;
  482.  
  483.         default:
  484.            
  485.             break;// выход 3 кейса
  486.         }
  487.  
  488.     }
  489.  
  490.     system("cls<NUL");
  491.     cout << "Cпасибо за игру всего доброго!" << endl;
  492.     system("pause");
  493.  
  494.     return 1;
  495. }
RAW Paste Data Copied