Advertisement
JouJoy

Bricks Breaker

Dec 19th, 2020
764
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 11.87 KB | None | 0 0
  1. #include <iostream>
  2. #include <conio.h>
  3. #include <dos.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6. #include <Windows.h>
  7. #include <time.h>
  8.  
  9. #define SCREEN_WIDTH 52 //определяем ширину экрана
  10. #define SCREEN_HEIGHT 20 //определяем высоту экрана
  11.  
  12. #define MINX 3
  13. #define MINY 2
  14. #define MAXX 49
  15. #define MAXY 19
  16. using namespace std;
  17. HANDLE console = GetStdHandle(STD_OUTPUT_HANDLE);
  18. COORD CursorPosition;
  19.  
  20. void setCursorPosition(int x, int y) //функция из Window.h для установки курсора в нужное положение (для создания аналога system("cls"))
  21. {
  22.     static const HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
  23.     cout.flush();
  24.     COORD coord = { (SHORT)x, (SHORT)y };
  25.     SetConsoleCursorPosition(hOut, coord);
  26. }
  27.  
  28. void Cursor() { //убирает мерцание курсора консоли,делает его невидимым
  29.  
  30.     CONSOLE_CURSOR_INFO curs = { 0 };
  31.  
  32.     curs.dwSize = sizeof(curs);
  33.  
  34.     curs.bVisible = FALSE;
  35.  
  36.     ::SetConsoleCursorInfo(::GetStdHandle(STD_OUTPUT_HANDLE), &curs);
  37. }
  38. class Game //наша игра в виде класса
  39. {
  40. private:
  41.     int bricks[24][2]; //блоки, которые сбиваем
  42.     int visibleBricks[24]; //свойство, показывающее, видно ли блок (сбит или не сбит)
  43.     int sliderPos[2];//координаты слайдера
  44.     int ballPos[2];//координаты шара
  45.     int startBall;//свойство "запущен ли шар"
  46.     int dir;//направление движения мяча
  47.     int bricksLeft;//количество оствашихся блоков
  48.     int win;//победа ли
  49.     int lose;//проигрыш ли
  50.     int moving_rand;//случайный коэффициент движения
  51.     void setCursorPosition(int x, int y);//функция от класса
  52.     void setcursor(bool visible, DWORD size);//задает курсор
  53.     void drawBorder();//рисование доски
  54.     void drawBricks();//рисование блоков
  55.     void ballHitSlider();//функция столкновения шарика с слайдером
  56.     void ballHitBrick();//функция столкновения шарика с блоком
  57.     void instructions();//функция показа инструкции
  58.     void restart();//функция рестарта игры
  59. public:
  60.     Game()
  61.     {/////////////////СОЗДАЕМ БЛОКИ////////////////////////
  62.         int i, j, k = 1, s = 0, t = 0;
  63.         for (k = 1; k <= 3; k++)
  64.         {
  65.             for (i = 8*(k-1); i < 8*k; i++)
  66.             {
  67.                 for (j = 0; j < 2; j++)
  68.                 {
  69.                     if (j == 0)
  70.                         bricks[i][j] = 2 * k;
  71.                     if (j == 1)
  72.                         bricks[i][j] = 7 + s * 5;
  73.                 }
  74.                 s++;
  75.             }
  76.             s = 0;
  77.         }
  78.         /////////////////////ПРИСВАИВАЕМ ЗНАЧЕНИЯ АРГУМЕНТАМ////////////////////////
  79.         for (i = 0; i < 24; i++)
  80.         {
  81.             visibleBricks[i] = 1;
  82.         }
  83.         sliderPos[0] = 18;
  84.         sliderPos[1] = 22;
  85.         ballPos[0] = 17;
  86.         ballPos[1] = 26;
  87.         startBall = 0;
  88.         srand(time(0));
  89.         dir = rand()%2 + 1;
  90.         bricksLeft = 24;
  91.         win = 0;
  92.         lose = 0;
  93.         moving_rand = 2;
  94.     }
  95.     Game(const Game& ob)//Конструктор копирования
  96.     {
  97.         int i, j;
  98.         for (i = 0; i < 24; i++)
  99.         {
  100.             for (j = 0; j < 2; j++)
  101.             {
  102.                 bricks[i][j] = ob.bricks[i][j];
  103.             }
  104.         }
  105.         for (i = 0; i < 24; i++)
  106.         {
  107.             visibleBricks[i] = ob.visibleBricks[i];
  108.         }
  109.         for (i = 0; i < 2; i++)
  110.         {
  111.             sliderPos[i] = ob.sliderPos[i];
  112.             ballPos[i] = ob.ballPos[i];
  113.         }
  114.         startBall = ob.startBall;
  115.         dir = ob.dir;
  116.         bricksLeft = ob.bricksLeft;
  117.         win = ob.win;
  118.         lose = ob.lose;
  119.         moving_rand = ob.moving_rand;
  120.     }
  121.     void start(); //фкнция старта
  122.     void play();//функция непосредственно игры
  123. };
  124.  
  125. void Game::setCursorPosition(int x, int y)
  126. {
  127.     CursorPosition.X = x;
  128.     CursorPosition.Y = y;
  129.     SetConsoleCursorPosition(console, CursorPosition);
  130. }
  131. void Game::setcursor(bool visible, DWORD size)
  132. {
  133.     if (size == 0)
  134.         size = 20;
  135.     CONSOLE_CURSOR_INFO lpCursor;
  136.     lpCursor.bVisible = visible;
  137.     lpCursor.dwSize = size;
  138.     SetConsoleCursorInfo(console, &lpCursor);
  139. }
  140. void Game::restart()
  141. {
  142.     int i, j, k = 1, s = 0, t = 0;
  143.     for (k = 1; k <= 3; k++)
  144.     {
  145.         for (i = 8 * (k - 1); i < 8 * k; i++)
  146.         {
  147.             for (j = 0; j < 2; j++)
  148.             {
  149.                 if (j == 0)
  150.                     bricks[i][j] = 2 * k;
  151.                 if (j == 1)
  152.                     bricks[i][j] = 7 + s * 5;
  153.             }
  154.             s++;
  155.         }
  156.         s = 0;
  157.     }
  158.  
  159.     for (i = 0; i < 24; i++)
  160.     {
  161.         visibleBricks[i] = 1;
  162.     }
  163.     sliderPos[0] = 18;
  164.     sliderPos[1] = 22;
  165.     ballPos[0] = 17;
  166.     ballPos[1] = 25;
  167.     startBall = 0;
  168.     srand(time(0));
  169.     dir = rand() % 2 + 1;
  170.     bricksLeft = 24;
  171.     win = 0;
  172.     lose = 0;
  173. }
  174. void Game::drawBorder()
  175. {
  176.     setCursorPosition(0, 0);
  177.     cout << "----------------------------------------------------";
  178.     setCursorPosition(0, SCREEN_HEIGHT);
  179.     cout << "----------------------------------------------------";
  180.     for (int i = 0; i < SCREEN_HEIGHT; i++)
  181.     {
  182.         setCursorPosition(0, i);
  183.         cout << '|';
  184.         setCursorPosition(SCREEN_WIDTH, i);
  185.         cout << '|';
  186.     }
  187. }
  188. void Game::drawBricks()
  189. {
  190.     for (int i = 0; i < 24; i++)
  191.     {
  192.         if (visibleBricks[i] == 1)
  193.         {
  194.             setCursorPosition(bricks[i][1], bricks[i][0]);
  195.             cout << "####";
  196.         }
  197.         else
  198.         {
  199.             setCursorPosition(bricks[i][1], bricks[i][0]);
  200.             cout << "    ";
  201.         }
  202.     }
  203. }
  204.  
  205. void Game::ballHitSlider()
  206.  {
  207.     srand(time(0));
  208.     if (ballPos[0] == sliderPos[0] - 1)
  209.     {
  210.         if ((ballPos[1] >= (sliderPos[1] - 2)) && ballPos[1] <= sliderPos[1] + 8)
  211.         {
  212.             if ((ballPos[1] >= sliderPos[1] - 2) && (ballPos[1] <= sliderPos[1]))
  213.             {
  214.                 if (ballPos[0] == sliderPos[0] - 1)
  215.                 {
  216.                     dir = 2;
  217.                     srand(rand());
  218.                     moving_rand = rand() % 2 + 1;
  219.                 }
  220.             }
  221.             else if ((ballPos[1] >= sliderPos[1] + 6) && (ballPos[1] <= sliderPos[1] + 8))
  222.             {
  223.                 if (ballPos[0] == sliderPos[0] - 1)
  224.                 {
  225.                     dir = 1;
  226.                     srand(rand());
  227.                     moving_rand = rand() % 2 + 1;
  228.                 }
  229.             }
  230.             else if (ballPos[1] == sliderPos[1] + 3)
  231.             {
  232.                 if (ballPos[0] == sliderPos[0] - 1)
  233.                 {
  234.                     dir = 0;
  235.                 }
  236.             }
  237.             else if (dir = 5 && (ballPos[1] < sliderPos[1] + 3))
  238.             {
  239.                 if (ballPos[0] == sliderPos[0] - 1)
  240.                 {
  241.                     dir = 2;
  242.                 }
  243.             }
  244.             else if (dir = 5 && (ballPos[1] > sliderPos[1] + 3))
  245.             {
  246.                 if (ballPos[0] == sliderPos[0] - 1)
  247.                 {
  248.                     dir = 1;
  249.                 }
  250.             }
  251.             else if (ballPos[0] == sliderPos[0] - 1)
  252.             {
  253.                 if (dir == 3)
  254.                 {
  255.                     srand(rand());
  256.                     moving_rand = rand() % 2 + 1;
  257.                     dir = 2;
  258.                 }
  259.                 else if (dir == 4)
  260.                 {
  261.                     srand(rand());
  262.                     moving_rand = rand() % 2 + 1;
  263.                     dir = 1;
  264.                 }
  265.             }
  266.         }
  267.     }
  268. }
  269. void Game::ballHitBrick()
  270. {
  271.     for (int i = 0; i < 24; i++)
  272.     {
  273.         if (visibleBricks[i] == 1)
  274.         {
  275.             if (ballPos[1] >= bricks[i][1]-1 && ballPos[1] <= bricks[i][1] + 4)
  276.             {
  277.                 if (ballPos[0] == bricks[i][0])
  278.                 {
  279.                     visibleBricks[i] = 0;
  280.                     bricksLeft--;
  281.                 }
  282.             }
  283.         }
  284.     }
  285. }
  286. void Game::start()
  287. {
  288.     do {
  289.         setcursor(0, 0);
  290.         system("cls");
  291.         setCursorPosition(10, 5); cout << "-------------------------------";
  292.         setCursorPosition(10, 6); cout << "|        BRICK BREAKER        |";
  293.         setCursorPosition(10, 7); cout << "-------------------------------";
  294.         setCursorPosition(10, 9); cout << "1. Start Game";
  295.         setCursorPosition(10, 10); cout << "2. Instructions";
  296.         setCursorPosition(10, 11); cout << "3. Quit";
  297.         setCursorPosition(10, 13); cout << "Select option: ";
  298.         char op = _getche();
  299.         switch (op)
  300.         {
  301.         case '1':
  302.         {
  303.             play();
  304.             break;
  305.         }
  306.         case '2':
  307.         {
  308.             instructions();
  309.             break;
  310.         }
  311.         case '3':
  312.         {
  313.             exit(0);
  314.             break;
  315.         }
  316.         }
  317.     } while (1);
  318.    
  319. }
  320. void Game::play()
  321. {
  322.     restart();
  323.     system("cls");
  324.     setCursorPosition(ballPos[1], ballPos[0]);
  325.     cout << '0';
  326.     setCursorPosition(sliderPos[1], sliderPos[0]);
  327.     cout << "<==^==>";
  328.     while (1)
  329.     {
  330.         setCursorPosition(0, 0);
  331.         this->drawBricks();
  332.         this->drawBorder();
  333.         Cursor();
  334.  
  335.         if (_kbhit())
  336.         {
  337.             char ch = _getch();
  338.             if (ch == 'D' || ch == 77 || ch == 'В' || ch == 'в')
  339.                 ch == 'd';
  340.             if (ch == 'A' || ch == 75 || ch == 'Ф' || ch == 'ф')
  341.                 ch = 'a';
  342.             switch (ch)
  343.             {
  344.             case 'd':
  345.             {
  346.                 setCursorPosition(sliderPos[1], sliderPos[0]);
  347.                 cout << "        ";
  348.                 if (sliderPos[1] < 44)
  349.                     sliderPos[1] = sliderPos[1] + 2;
  350.                 if (startBall == 0 && sliderPos[1] < 44)
  351.                 {
  352.                     setCursorPosition(ballPos[1], ballPos[0]);
  353.                     cout << ' ';
  354.                     ballPos[1] += 2;
  355.                     setCursorPosition(ballPos[1], ballPos[0]);
  356.                     cout << '0';
  357.                 }
  358.                 setCursorPosition(sliderPos[1], sliderPos[0]);
  359.                 cout << "<==^==>";
  360.                 break;
  361.             }
  362.             case 'a':
  363.             {
  364.                 setCursorPosition(sliderPos[1], sliderPos[0]);
  365.                 cout << "        ";
  366.                 if (sliderPos[1] > 2)
  367.                     sliderPos[1] = sliderPos[1] - 2;
  368.                 if ((startBall == 0) && sliderPos[1] > 2)
  369.                 {
  370.                     setCursorPosition(ballPos[1], ballPos[0]);
  371.                     cout << ' ';
  372.                     ballPos[1] -= 2;
  373.                     setCursorPosition(ballPos[1], ballPos[0]);
  374.                     cout << '0';
  375.                 }
  376.                 setCursorPosition(sliderPos[1], sliderPos[0]);
  377.                 cout << "<==^==>";
  378.                 break;
  379.             }
  380.             case 32:
  381.             {
  382.                 startBall = 1;
  383.                 break;
  384.             }
  385.             case 27:
  386.             {
  387.                 system("cls");
  388.                 exit(0);
  389.                 break;
  390.             }
  391.             }
  392.         }
  393.         if (startBall == 1)
  394.         {
  395.             setCursorPosition(ballPos[1], ballPos[0]);
  396.             cout << ' ';
  397.             switch (dir)
  398.             {
  399.             case 0:
  400.             {
  401.                 ballPos[0] = ballPos[0] - 1;
  402.                 ballPos[1] = ballPos[1];
  403.                 if (ballPos[0] < MINY)
  404.                 {
  405.                     dir = 5;
  406.                 }
  407.                 break;
  408.             }
  409.             case 1:
  410.             {
  411.                 ballPos[0] = ballPos[0] - 1;
  412.                 ballPos[1] = ballPos[1] + moving_rand;
  413.                 if (ballPos[1] > MAXX)
  414.                 {
  415.                     dir = 2;
  416.                 }
  417.                 else if (ballPos[0] < MINY)
  418.                 {
  419.                     dir = 4;
  420.                 }
  421.                 break;
  422.             }
  423.             case 2:
  424.             {
  425.                 ballPos[0] = ballPos[0] - 1;
  426.                 ballPos[1] = ballPos[1] - moving_rand;
  427.                 if (ballPos[0] < MINY)
  428.                 {
  429.                     dir = 3;
  430.                 }
  431.                 else if (ballPos[1] < MINX)
  432.                 {
  433.                     dir = 1;
  434.                 }
  435.                 break;
  436.             }
  437.             case 3:
  438.             {
  439.                 ballPos[0] = ballPos[0] + 1;
  440.                 ballPos[1] = ballPos[1] - moving_rand;
  441.  
  442.                 if (ballPos[0] > MAXY)
  443.                 {
  444.                     lose = 1;
  445.                     break;
  446.                 }
  447.                 else if (ballPos[1] < MINX)
  448.                 {
  449.                     dir = 4;
  450.                 }
  451.                 break;
  452.             }
  453.             case 4:
  454.             {
  455.                 ballPos[0] = ballPos[0] + 1;
  456.                 ballPos[1] = ballPos[1] + moving_rand;
  457.  
  458.                 if (ballPos[1] > MAXX)
  459.                 {
  460.                     dir = 3;
  461.                 }
  462.                 else if (ballPos[0] > MAXY)
  463.                 {
  464.                     lose = 1;
  465.                     break;
  466.                 }
  467.                 break;
  468.             }
  469.             case 5:
  470.             {
  471.                 ballPos[0] = ballPos[0] + 1;
  472.                 ballPos[1] = ballPos[1];
  473.                 if (ballPos[0] > MAXY)
  474.                 {
  475.                     lose = 1;
  476.                     break;
  477.                 }
  478.                 break;
  479.             }
  480.             }
  481.             ballHitSlider();
  482.             setCursorPosition(ballPos[1], ballPos[0]);
  483.             cout << '0';
  484.         }
  485.         ballHitBrick();
  486.         if (bricksLeft == 0)
  487.         {
  488.             win = 1;
  489.         }
  490.         Sleep(100);
  491.  
  492.         if (lose == 1)
  493.         {
  494.             system("cls");
  495.             setCursorPosition(10, 5); cout << "--------------------------";
  496.             setCursorPosition(10, 6); cout << "|        YOU LOSE        |";
  497.             setCursorPosition(10, 7); cout << "--------------------------";
  498.             setCursorPosition(10, 9); cout << "Press any key to go back to Menu.";
  499.             lose = 0;
  500.             system("pause");
  501.             Sleep(1000);
  502.             _getch();
  503.             break;
  504.         }
  505.         if (win == 1)
  506.         {
  507.             system("cls");
  508.             setCursorPosition(10, 5); cout << "-------------------------";
  509.             setCursorPosition(10, 6); cout << "|        YOU WIN        |";
  510.             setCursorPosition(10, 7); cout << "-------------------------";
  511.             setCursorPosition(10, 9); cout << "Press any key to go back to Menu.";
  512.             win = 0;
  513.             system("pause");
  514.             Sleep(1000);
  515.             _getch();
  516.             break;
  517.         }
  518.     }
  519. }
  520.     void Game::instructions()
  521.     {
  522.         system("cls");
  523.         cout << "Instructions";
  524.         cout << "\n------------------";
  525.         cout << "\n1.Use 'a' key to move slider to left";
  526.         cout << "\n2.Use 'd' key to move slider to right";
  527.         cout << "\n3.Press spacebar to start game";
  528.         cout << "\n4. Press any key to go back to menu";
  529.         cout << "\n5.Press ESC to close game";
  530.         _getch();
  531.     }
  532.  
  533.     int main()
  534.     {
  535.         Game A;
  536.         A.start();
  537.         cout << endl << endl;
  538.         return 0;
  539.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement