Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <SFML/Graphics.hpp>
- #include <time.h>
- using namespace sf;
- const int M = 20;
- const int N = 10;
- int field[M][N] = {0};
- struct Point
- {int x,y;
- } a[4], b[4];
- int figures[7][4] =
- {
- 1,3,5,7, // I
- 2,4,5,7, // Z
- 3,5,4,6, // S
- 3,5,4,7, // T
- 2,3,5,7, // L
- 3,5,7,6, // J
- 2,3,4,5, // O
- };
- bool check()
- {
- for (int i=0;i<4;i++)
- if (a.x<0 || a.x>=N || a.y>=M) return 0;
- else if (field[a.y][a.x]) return 0;
- return 1;
- };
- int main()
- {
- srand(time(0));
- RenderWindow window(VideoMode(320, 480), "The Game!");
- Texture t1,t2,t3;
- t1.loadFromFile("images/tiles.png");
- t2.loadFromFile("images/background.png");
- t3.loadFromFile("images/frame.png");
- Sprite s(t1), background(t2), frame(t3);
- int dx=0; bool rotate=0; int colorNum=1;
- float timer=0,delay=0.3;
- Clock clock;
- while (window.isOpen())
- {
- float time = clock.getElapsedTime().asSeconds();
- clock.restart();
- timer+=time;
- Event e;
- while (window.pollEvent(e))
- {
- if (e.type == Event::Closed)
- window.close();
- if (e.type == Event::KeyPressed)
- if (e.key.code==Keyboard::Up) rotate=true;
- else if (e.key.code==Keyboard::Left) dx=-1;
- else if (e.key.code==Keyboard::Right) dx=1;
- }
- if (Keyboard::isKeyPressed(Keyboard::Down)) delay=0.05;
- //// <- Move -> ///
- for (int i=0;i<4;i++) { b=a; a.x+=dx; }
- if (!check()) for (int i=0;i<4;i++) a=b;
- //////Rotate//////
- if (rotate)
- {
- Point p = a[1]; //center of rotation
- for (int i=0;i<4;i++)
- {
- int x = a.y-p.y;
- int y = a.x-p.x;
- a.x = p.x - x;
- a.y = p.y + y;
- }
- if (!check()) for (int i=0;i<4;i++) a=b;
- }
- ///////Tick//////
- if (timer>delay)
- {
- for (int i=0;i<4;i++) { b=a; a.y+=1; }
- if (!check())
- {
- for (int i=0;i<4;i++) field[b.y][b.x]=colorNum;
- colorNum=1+rand()%7;
- int n=rand()%7;
- for (int i=0;i<4;i++)
- {
- a.x = figures[n] % 2;
- a.y = figures[n] / 2;
- }
- }
- timer=0;
- }
- ///////check lines//////////
- int k=M-1;
- for (int i=M-1;i>0;i--)
- {
- int count=0;
- for (int j=0;j<N;j++)
- {
- if (field[j]) count++;
- field[k][j]=field[j];
- }
- if (count<N) k--;
- }
- dx=0; rotate=0; delay=0.3;
- /////////draw//////////
- window.clear(Color::White);
- window.draw(background);
- for (int i=0;i<M;i++)
- for (int j=0;j<N;j++)
- {
- if (field[j]==0) continue;
- s.setTextureRect(IntRect(field[j]18,0,18,18));
- s.setPosition(j18,i18);
- s.move(28,31); //offset
- window.draw(s);
- }
- for (int i=0;i<4;i++)
- {
- s.setTextureRect(IntRect(colorNum18,0,18,18));
- s.setPosition(a.x18,a.y18);
- s.move(28,31); //offset
- window.draw(s);
- }
- window.draw(frame);
- window.display();
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement