Advertisement
Garey

Oki_Kursova1

Apr 22nd, 2019
512
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.71 KB | None | 0 0
  1. #include <SFML/Graphics.hpp>
  2. #include <time.h>
  3.  
  4. using namespace sf;
  5.  
  6. int ts = 63; //tile size
  7.  
  8. // Sprite offsets( for matching the mini boxes
  9. Vector2i offset(43, 22);
  10.  
  11. struct Piece
  12. {
  13.     int x, y, col, row, kind, match, alpha; // Coordinates(x,y) (column, row), type of piece, number of matches, transparency
  14.  
  15.     // Called when creating grid[9][9]
  16.     Piece() {
  17.         match = 0; // How much pieces have matched
  18.         alpha = 255; // Transparency
  19.     }
  20. } grid[9][9]; // Global grid for the game
  21.  
  22.  
  23. // Helper function to help swapping two pieces' places
  24. void swap(Piece p1, Piece p2)
  25. {
  26.     // Swaps the values of the pieces(column, row)
  27.     std::swap(p1.col, p2.col);
  28.     std::swap(p1.row, p2.row);
  29.  
  30.     // Moves every piece to its' new coordinates(column, row)
  31.     grid[p1.row][p1.col] = p1;
  32.     grid[p2.row][p2.col] = p2;
  33. }
  34.  
  35.  
  36. int main()
  37. {
  38.     // Random Number Seeder by current time { time(null) or time(0) }
  39.     srand(time(0));
  40.  
  41.     // Create a window to show the application( Graphic User Interface Window )
  42.     RenderWindow app(VideoMode(740, 480), "Gem Crush!");
  43.  
  44.     // Set maximum frames per second
  45.     app.setFramerateLimit(60);
  46.  
  47.     // Textures from images
  48.     Texture t1, t2, t3;
  49.  
  50.     // Load textures from files
  51.     t1.loadFromFile("images/background.png");
  52.     t2.loadFromFile("images/gems.png");
  53.     t3.loadFromFile("images/cursor.png");
  54.  
  55.     // Create sprites from textures
  56.     Sprite background(t1), gems(t2), cursor(t3);
  57.  
  58.     // Create the board grid itself
  59.     for (int i = 1; i <= 7; i++)
  60.         for (int j = 1; j <= 7; j++)
  61.         {
  62.             grid[i][j].kind = rand() % 3; // Get random type
  63.             grid[i][j].col = j; // Set the column
  64.             grid[i][j].row = i; // Set current row
  65.             grid[i][j].x = j * ts; // Get box tile size and multiply by the column to match the size of the sprite
  66.             grid[i][j].y = i * ts; // Get box tile size and multiply by the row to match the size of the sprite
  67.         }
  68.  
  69.     /*! Helper variables for coordinates, mouse clicks and position of click plus animations and swaps */
  70.     int x0, y0, x, y; int click = 0; Vector2i pos;
  71.     bool isSwap = false, isMoving = false;
  72.  
  73.     /*! While the application is open */
  74.     while (app.isOpen())
  75.     {
  76.  
  77.         // Detect new event
  78.         Event e;
  79.  
  80.         // While new event has come and is processing
  81.         while (app.pollEvent(e))
  82.         {
  83.             // Check if the event is for closing the window
  84.             if (e.type == Event::Closed)
  85.                 // If yes, close
  86.                 app.close();
  87.  
  88.             // Check if the event is for mouse clicking
  89.             if (e.type == Event::MouseButtonPressed)
  90.                
  91.                 // Check if the mouse click is by left mouse button
  92.                 if (e.key.code == Mouse::Left) {
  93.                     // If it is and nothing is moving or swapping right now
  94.                     if (!isSwap && !isMoving)
  95.                         // Increment clicks
  96.                         click++;
  97.  
  98.                     // Get mouse click position minus the offset of the sprites
  99.                     pos = Mouse::getPosition(app) - offset;
  100.                 }
  101.         }
  102.  
  103.         // if mouse is clicked only once
  104.         if (click == 1)
  105.         {
  106.             // get that position of the click and divide it by the tilesize square + 1
  107.             x0 = pos.x / ts + 1;
  108.             y0 = pos.y / ts + 1;
  109.  
  110.             // Set the bounding box(limit box), where 300 is coordinate of x, 100 is y, 48 is width and 52 is height
  111.             cursor.setTextureRect(IntRect(300, 100, 48, 52));
  112.            
  113.             // Set current position
  114.             cursor.setPosition(pos.x, pos.y);
  115.  
  116.             // Set visible colour to 255 transparency(full visibility)
  117.             cursor.setColor(Color(255, 255, 255, 255));
  118.  
  119.             // Draw the cursor
  120.             app.draw(cursor);
  121.         }
  122.  
  123.         // If mouse is clicked second time
  124.         if (click == 2)
  125.         {
  126.             // get that position of the click and divide it by the tilesize square + 1
  127.             x = pos.x / ts + 1;
  128.             y = pos.y / ts + 1;
  129.  
  130.             // Set the bounding box(limit box), where 0 is coordinate of x, 0 is y, 48 is width and 52 is height
  131.             cursor.setTextureRect(IntRect(0, 0, 48, 52));
  132.  
  133.             // Set current position
  134.             cursor.setPosition(x, y);
  135.  
  136.             // Set visible colour to 255 transparency(full visibility)
  137.             cursor.setColor(Color(255, 255, 255, 255));
  138.  
  139.             // Set the texture
  140.             cursor.setTexture(t3);
  141.  
  142.             // Draw the cursor
  143.             app.draw(cursor);
  144.            
  145.             // Check if the absolute value of the summary of x - x0 and y - y0 is equal to 1
  146.             if (abs(x - x0) + abs(y - y0) == 1)
  147.             {
  148.                 // if yes, swap the two pieces
  149.                 swap(grid[y0][x0], grid[y][x]);
  150.  
  151.                 // Set the swap flag
  152.                 isSwap = 1;
  153.  
  154.                 // Reset clicks count
  155.                 click = 0;
  156.             }
  157.             else
  158.                 // Set the click to one, because we pressed the same position
  159.                 click = 1;
  160.         }
  161.  
  162.         // Match finding
  163.         // Go through the grid of the game
  164.         for (int i = 1; i <= 8; i++)
  165.             for (int j = 1; j <= 8; j++)
  166.             {
  167.                 // If the grid matches the one on the same column with him(row, row + 1, row - 1)
  168.                 if (grid[i][j].kind == grid[i + 1][j].kind)
  169.                     if (grid[i][j].kind == grid[i - 1][j].kind)
  170.                        
  171.                         // Go through the possibilities
  172.                         for (int n = -1; n <= 1; n++)
  173.  
  174.                             // Increment matches for this piece
  175.                             grid[i + n][j].match++;
  176.  
  177.                 // If the grid matches the one on the same row with him(column, column + 1, column - 1)
  178.                 if (grid[i][j].kind == grid[i][j + 1].kind)
  179.                     if (grid[i][j].kind == grid[i][j - 1].kind)
  180.  
  181.                         // Go through the possibilities
  182.                         for (int n = -1; n <= 1; n++)
  183.  
  184.                             // Increment matches for this piece
  185.                             grid[i][j + n].match++;
  186.             }
  187.  
  188.         // Moving animation
  189.         // Sets the flag for the movement animation
  190.         isMoving = false;
  191.  
  192.         // Go through the game grid
  193.         for (int i = 1; i <= 7; i++)
  194.             for (int j = 1; j <= 7; j++)
  195.             {
  196.                 // Get the current piece
  197.                 Piece &p = grid[i][j];
  198.                
  199.                 // Will be used for new coordinates
  200.                 int dx, dy;
  201.  
  202.                 // Set the speed in a for loop
  203.                 for (int n = 0; n < 4; n++)   // 4 - speed
  204.                 {
  205.                     // Get the projection of the new points(dx, dy)
  206.                     dx = p.x - p.col*ts;
  207.                     dy = p.y - p.row*ts;
  208.  
  209.                     // Check if they are legit values
  210.                     if (dx)
  211.  
  212.                         // Set the new position of the piece
  213.                         p.x -= dx / abs(dx);
  214.  
  215.                     // Check if they are legit values
  216.                     if (dy)
  217.  
  218.                         // Set the new position of the piece
  219.                         p.y -= dy / abs(dy);
  220.                 }
  221.  
  222.                 // If both are legit, set the flag to return moving
  223.                 if (dx || dy)
  224.                     isMoving = 1;
  225.             }
  226.  
  227.         // Deleting amimation
  228.         // If they are not moving
  229.         if (!isMoving)
  230.  
  231.             // Go through the game grid
  232.             for (int i = 1; i <= 8; i++)
  233.                 for (int j = 1; j <= 8; j++)
  234.  
  235.                     // If the grid matches when placing
  236.                     if (grid[i][j].match)
  237.  
  238.                         // And if the piece's transparency is higher than 10
  239.                         if (grid[i][j].alpha > 10) {
  240.  
  241.                             /*! Lower the value by 10 to hide*/
  242.                         grid[i][j].alpha -= 10;
  243.  
  244.                         // Move out the board
  245.                         isMoving = true;
  246.                     }
  247.  
  248.         // Get score
  249.         int score = 0;
  250.  
  251.         // Go through the grid
  252.         for (int i = 1; i <= 8; i++)
  253.             for (int j = 1; j <= 8; j++)
  254.  
  255.                 // For every match make a point to the score;
  256.                 score += grid[i][j].match;
  257.  
  258.         // Second swap if no match is found
  259.         if (isSwap && !isMoving)
  260.         {
  261.             // If the score is not a legitimate value
  262.             if (!score)
  263.  
  264.                 // Swap back
  265.                 swap(grid[y0][x0], grid[y][x]);
  266.  
  267.             // Reset the swap flag
  268.             isSwap = 0;
  269.         }
  270.  
  271.         // Update grid
  272.         if (!isMoving)
  273.         {
  274.             // Go through the grid both ways
  275.             for (int i = 8; i > 0; i--)
  276.                 for (int j = 1; j <= 8; j++)
  277.  
  278.                     // if a match is found
  279.                     if (grid[i][j].match)
  280.                        
  281.                         // Check that match
  282.                         for (int n = i; n > 0; n--)
  283.                             // if it is not a legit value
  284.                             if (!grid[n][j].match) {
  285.  
  286.                                 // Swap back and update
  287.                                 swap(grid[n][j], grid[i][j]);
  288.  
  289.                                 // End
  290.                                 break;
  291.                             }
  292.  
  293.             // Go through the grid both ways
  294.             for (int j = 1; j <= 8; j++)
  295.                 for (int i = 8, n = 0; i > 0; i--)
  296.  
  297.                     // if a match is found
  298.                     if (grid[i][j].match)
  299.                     {
  300.                         // Set new random kind
  301.                         grid[i][j].kind = rand() % 7;
  302.  
  303.                         // Set new y value and move it in the grid, then increment the grid number
  304.                         grid[i][j].y = -ts * n++;
  305.  
  306.                         // Set that no match is found
  307.                         grid[i][j].match = 0;
  308.  
  309.                         // Set transparency to full visibility
  310.                         grid[i][j].alpha = 255;
  311.                     }
  312.         }
  313.  
  314.  
  315.         //////draw///////
  316.         // Draw the background image
  317.         app.draw(background);
  318.  
  319.         // Draw the grid
  320.         for (int i = 1; i <= 8; i++)
  321.             for (int j = 1; j <= 8; j++)
  322.             {
  323.                 // Every new piece
  324.                 Piece p = grid[i][j];
  325.                
  326.                 // There is a rectangular texture with the kind's size multiplied by the offset
  327.                 gems.setTextureRect(IntRect(p.kind * 49, 0, 49, 49));
  328.  
  329.                 // Has a color, set by default to full visibility
  330.                 gems.setColor(Color(255, 255, 255, p.alpha));
  331.  
  332.                 // Has a position
  333.                 gems.setPosition(p.x, p.y);
  334.  
  335.                 // Moves with animation towards its' own position
  336.                 gems.move(offset.x - ts, offset.y - ts);
  337.                
  338.                 // Is drawing
  339.                 app.draw(gems);
  340.             }
  341.  
  342.         // Show the application itself
  343.         app.display();
  344.     }
  345.  
  346.     // Carriage return
  347.     return 0;
  348. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement