Advertisement
Guest User

tetris

a guest
Oct 19th, 2020
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.87 KB | None | 0 0
  1. #include <SFML/Graphics.hpp>
  2. #include <time.h>
  3. #include <sstream> //std::ostringstream
  4. using namespace sf;
  5.  
  6. const int M = 20; //Высота игрового поля
  7. const int N = 10; //Ширина игрового поля
  8.  
  9. int field[M][N] = { 0 }; //Игровое поле
  10.  
  11. //Массив фигурок-тетрамино
  12. int figures[7][4] =
  13. {
  14.     1,3,5,7, // I
  15.     2,4,5,7, // Z
  16.     3,5,4,6, // S
  17.     3,5,4,7, // T
  18.     2,3,5,7, // L
  19.     3,5,7,6, // J
  20.     2,3,4,5, // O
  21. };
  22.  
  23. struct Point
  24. {
  25.     int x, y;
  26. } a[4], b[4];
  27.  
  28. //Проверка на выход за границы игрового поля
  29. bool check()
  30. {
  31.     for (int i = 0; i < 4; i++)
  32.         if (a[i].x < 0 || a[i].x >= N || a[i].y >= M) return 0;
  33.         else if (field[a[i].y][a[i].x]) return 0;
  34.  
  35.     return 1;
  36.  
  37. };
  38.  
  39.  
  40. int main()
  41. {
  42.     srand(time(0));
  43.  
  44.     RenderWindow window(VideoMode(320, 480), "The Game!");
  45.  
  46.     //Создание и загрузка текстуры
  47.     Texture texture, texture_background, texture_frame;
  48.     texture.loadFromFile("images/tiles.png");
  49.     texture_background.loadFromFile("images/background.png");
  50.     texture_frame.loadFromFile("images/frame.png");
  51.    
  52.     //Загрузка шрифта
  53.     Font font;
  54.     if (!font.loadFromFile("Ubuntu-R.ttf"))
  55.     {
  56.         return 0;
  57.     }
  58.    
  59.     //Создание текстового объекта
  60.     Text text;
  61.    
  62.     //Задание параметров отображения текста
  63.     text.setFont(font);
  64.     text.setCharacterSize(24);
  65.     text.setPosition(10.f, 420.f);
  66.     //text.setFillColor(sf::Color::Black); //2.4
  67.     text.setColor(sf::Color::Black); //2.0
  68.    
  69.     //Переменные для подсчета и отображения очков
  70.     int o4ko = 0;
  71.     std::ostringstream o4ko_str;
  72.     o4ko_str << o4ko;
  73.    
  74.     //Создание спрайта
  75.     Sprite sprite(texture), sprite_background(texture_background), sprite_frame(texture_frame);
  76.     //Вырезаем из спрайта отдельный квадратик размером 18х18 пикселей
  77.     sprite.setTextureRect(IntRect(0, 0, 18, 18));
  78.  
  79.     //Переменные для горизонтального перемещения и вращения
  80.     int dx = 0; bool rotate = 0; int colorNum = 1; bool beginGame = true; int n = rand() % 7;
  81.  
  82.     //Переменные для таймера и задержки
  83.     float timer = 0, delay = 0.3;
  84.  
  85.     //Часы (таймер)
  86.     Clock clock;
  87.  
  88.  
  89.     //Главный цикл приложения. Выполняется, пока открыто окно.
  90.     while (window.isOpen())
  91.     {
  92.         //Получаем время, прошедшее с начала отсчета, и конвертируем его в секунды
  93.         float time = clock.getElapsedTime().asSeconds();
  94.         clock.restart();
  95.         timer += time;
  96.  
  97.         //Обрабатываем очередь событий в цикле
  98.         Event event;
  99.         while (window.pollEvent(event))
  100.         {
  101.             //Пользователь нажал на «крестик» и хочет окно закрыть?
  102.             if (event.type == Event::Closed)
  103.                 //Тогда закрываем его
  104.                 window.close();
  105.             //Была нажата кнопка на клавиатуре?
  106.             if (event.type == Event::KeyPressed)
  107.                 //Эта кнопка – стрелка вверх?…
  108.                 if (event.key.code == Keyboard::Up) rotate = true;
  109.             //…или же стрелка влево?…
  110.                 else if (event.key.code == Keyboard::Left) dx = -1;
  111.             ////…ну тогда может это стрелка вправо?
  112.                 else if (event.key.code == Keyboard::Right) dx = 1;
  113.         }
  114.  
  115.         //Нажали кнопку "вниз"? Ускоряем падение тетрамино
  116.         if (Keyboard::isKeyPressed(Keyboard::Down)) delay = 0.05;
  117.  
  118.         //// Горизонтальное перемещение ////
  119.         for (int i = 0; i < 4; i++) { b[i] = a[i]; a[i].x += dx; }
  120.         //Вышли за пределы поля после перемещения? Тогда возвращаем старые координаты
  121.         if (!check()) for (int i = 0; i < 4; i++) a[i] = b[i];
  122.  
  123.  
  124.         ////// Вращение //////
  125.         if (rotate)
  126.         {
  127.             Point p = a[1]; //Задаем центр вращения
  128.             for (int i = 0; i < 4; i++)
  129.             {
  130.                 int x = a[i].y - p.y; //y-y0
  131.                 int y = a[i].x - p.x; //x-x0
  132.                 a[i].x = p.x - x;
  133.                 a[i].y = p.y + y;
  134.             }
  135.             //Вышли за пределы поля после поворота? Тогда возвращаем старые координаты
  136.             if (!check()) { for (int i = 0; i < 4; i++) a[i] = b[i]; }
  137.         }
  138.  
  139.         ////// Движение тетрамино вниз («Тик» таймера) //////
  140.         if (timer > delay)
  141.         {
  142.             for (int i = 0; i < 4; i++) { b[i] = a[i]; a[i].y += 1; }
  143.             if (!check())
  144.             {
  145.                 for (int i = 0; i < 4; i++) field[b[i].y][b[i].x] = colorNum;
  146.                 colorNum = 1 + rand() % 7;
  147.                 n = rand() % 7;
  148.                 for (int i = 0; i < 4; i++)
  149.                 {
  150.                     a[i].x = figures[n][i] % 2;
  151.                     a[i].y = figures[n][i] / 2;
  152.                 }
  153.                
  154.             }
  155.             timer = 0;
  156.         }
  157.  
  158.         //----ПРОВЕРКА ЛИНИИ----//
  159.         int k = M - 1;
  160.         for (int i = M - 1; i > 0; i--)
  161.         {
  162.             int count = 0;
  163.             for (int j = 0; j < N; j++)
  164.             {
  165.                 if (field[i][j]) count++;
  166.                 field[k][j] = field[i][j];
  167.             }
  168.             if (count < N) {
  169.                 k--;
  170.             } else {
  171.                 //Линия сгорела, прибавляем очко
  172.                 o4ko++;
  173.                 o4ko_str.str("");
  174.                 o4ko_str << o4ko;
  175.             }
  176.         }
  177.        
  178.         //Первое появление тетрамино на поле?
  179.         if (beginGame)
  180.         {
  181.             beginGame = false;
  182.             n = rand() % 7;
  183.             for (int i = 0; i < 4; i++)
  184.             {
  185.                 a[i].x = figures[n][i] % 2;
  186.                 a[i].y = figures[n][i] / 2;
  187.             }
  188.         }
  189.         dx = 0; rotate = 0; delay = 0.3;
  190.        
  191.         //----ОТРИСОВКА----//
  192.         //Задаем цвет фона (Белый)
  193.         window.clear(Color::White);
  194.         window.draw(sprite_background);
  195.         for (int i = 0; i < M; i++)
  196.             for (int j = 0; j < N; j++)
  197.             {
  198.                 if (field[i][j] == 0) continue;
  199.                 sprite.setTextureRect(IntRect(field[i][j] * 18, 0, 18, 18));
  200.                 sprite.setPosition(j * 18, i * 18);
  201.                 sprite.move(28, 31); //Смещение
  202.                 window.draw(sprite);
  203.             }
  204.  
  205.         for (int i = 0; i < 4; i++)
  206.         {
  207.             //Разукрашиваем тетрамино
  208.             sprite.setTextureRect(IntRect(colorNum * 18, 0, 18, 18));
  209.             //Устанавливаем позицию каждого кусочка тетрамино
  210.             sprite.setPosition(a[i].x * 18, a[i].y * 18);
  211.             sprite.move(28, 31); //Смещение
  212.             //Отрисовка спрайта
  213.             window.draw(sprite);
  214.         }
  215.         //Отрисовка фрейма
  216.         window.draw(sprite_frame);
  217.        
  218.         //Отрисовка очков
  219.         text.setString(o4ko_str.str());
  220.        
  221.         window.draw(text);
  222.         //Отрисовка окна
  223.         window.display();
  224.     }
  225.  
  226.     return 0;
  227. }
  228.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement