Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added an end game... #9

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
265 changes: 149 additions & 116 deletions 01 Tetris/main.cpp
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#include <SFML/Graphics.hpp>
#include <time.h>
using namespace sf;

#include <SFML/Graphics.hpp>
#include <time.h>
using namespace sf;
const int M = 20;
const int N = 10;

Expand All @@ -19,135 +19,168 @@ int figures[7][4] =
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[i].x<0 || a[i].x>=N || a[i].y>=M) return 0;
else if (field[a[i].y][a[i].x]) return 0;

return 1;
};


int main()
{
srand(time(0));

RenderWindow window(VideoMode(320, 480), "The Game!");

Texture t1,t2,t3;
};


int main()
{

/*
A boolean created in order to signal the end of the game
*/
bool endGame = false;

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())
{
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();

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[i]=a[i]; a[i].x+=dx; }
if (!check()) for (int i=0;i<4;i++) a[i]=b[i];

//////Rotate//////
if (rotate)
{
Point p = a[1]; //center of rotation
for (int i=0;i<4;i++)
{
int x = a[i].y-p.y;
int y = a[i].x-p.x;
a[i].x = p.x - x;
a[i].y = p.y + y;
}
if (!check()) for (int i=0;i<4;i++) a[i]=b[i];
}

///////Tick//////
if (timer>delay)
{
for (int i=0;i<4;i++) { b[i]=a[i]; a[i].y+=1; }

if (!check())
{
for (int i=0;i<4;i++) field[b[i].y][b[i].x]=colorNum;

colorNum=1+rand()%7;
int n=rand()%7;
for (int i=0;i<4;i++)
{
a[i].x = figures[n][i] % 2;
a[i].y = figures[n][i] / 2;
}
else if (e.key.code==Keyboard::Right) dx=1;
}

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[i][j]) count++;
field[k][j]=field[i][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[i][j]==0) continue;
s.setTextureRect(IntRect(field[i][j]*18,0,18,18));
s.setPosition(j*18,i*18);
s.move(28,31); //offset
window.draw(s);
}

for (int i=0;i<4;i++)
{
s.setTextureRect(IntRect(colorNum*18,0,18,18));
s.setPosition(a[i].x*18,a[i].y*18);
s.move(28,31); //offset
window.draw(s);
}

window.draw(frame);
window.display();
}

return 0;
/*
If the end of the game has been triggered from pieces
stacking too high, this 'if' statement is skipped along
with any further movement inside the game window.
*/
if (endGame != true)
{

if (Keyboard::isKeyPressed(Keyboard::Down)) delay=0.05;

//// <- Move -> ///
for (int i=0;i<4;i++) { b[i]=a[i]; a[i].x+=dx; }
if (!check()) for (int i=0;i<4;i++) a[i]=b[i];

//////Rotate//////
if (rotate)
{
Point p = a[1]; //center of rotation
for (int i=0;i<4;i++)
{
int x = a[i].y-p.y;
int y = a[i].x-p.x;
a[i].x = p.x - x;
a[i].y = p.y + y;
}
if (!check()) for (int i=0;i<4;i++) a[i]=b[i];
}

///////Tick//////
if (timer>delay)
{
for (int i=0;i<4;i++) { b[i]=a[i]; a[i].y+=1; }

if (!check())
{
for (int i=0;i<4;i++) field[b[i].y][b[i].x]=colorNum;

colorNum=1+rand()%7;
int n=rand()%7;
for (int i=0;i<4;i++)
{
a[i].x = figures[n][i] % 2;
a[i].y = figures[n][i] / 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[i][j]) count++;
field[k][j]=field[i][j];
}
if (count<N) k--;
}

/*
Row 2 in the 2D array field (the game field) is the row where the
top-most portion of each new puzzle piece exists. Since there is
always more of the puzzle piece below this row, this is the
vertical threshold that, when met from pieces stacking too high,
triggers the end of the game by making endGame true.
*/
for (int z = 0; z < 10; z++)
{

if (field[2][z] != 0)
{
endGame = true;
}

}

}

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[i][j]==0) continue;
s.setTextureRect(IntRect(field[i][j]*18,0,18,18));
s.setPosition(j*18,i*18);
s.move(28,31); //offset
window.draw(s);
}

for (int i=0;i<4;i++)
{
s.setTextureRect(IntRect(colorNum*18,0,18,18));
s.setPosition(a[i].x*18,a[i].y*18);
s.move(28,31); //offset
window.draw(s);
}

window.draw(frame);
window.display();
}

return 0;
}