Untitled
unknown
plain_text
a year ago
6.8 kB
7
Indexable
#include <SFML/Graphics.hpp>
#include <time.h>
#include <string>
using namespace sf;
const int windowHeight = 480;
const int windowWidth = 360;
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
};
void resetGame(int& score, int& colorNum, float& timer, float& delay, bool& gameOver)
{
for(int i = 0; i < M; i++)
{
for(int j = 0; j < N; j++) field[i][j] = 0;
}
score = 0;
colorNum = 1;
timer = 0;
delay = 0.3;
gameOver = false;
int n = rand() % 7;
int offset = rand() % 9;
for(int i = 0; i < 4; i++)
{
a[i].x = figures[n][i] % 2 + offset;
a[i].y = figures[n][i] / 2 - 4;
}
}
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(windowWidth, windowHeight), "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);
Font font;
font.loadFromFile("fonts/Roboto-Regular.ttf");
Text scoreText;
Text highScoreText;
Text gameOverText, playAgainText;
scoreText.setFont(font);
highScoreText.setFont(font);
gameOverText.setFont(font);
playAgainText.setFont(font);
scoreText.setFillColor(Color::Cyan);
highScoreText.setFillColor(Color::Cyan);
gameOverText.setFillColor(Color::Red);
playAgainText.setFillColor(Color::Blue);
scoreText.setCharacterSize(20);
highScoreText.setCharacterSize(20);
gameOverText.setCharacterSize(30);
playAgainText.setCharacterSize(20);
scoreText.setPosition(250, 20); // Position on the right side
highScoreText.setPosition(250, 50);
gameOverText.setPosition(40, 220);
playAgainText.setPosition(70, 260);
int dx = 0;
bool rotate = 0;
int colorNum = 1;
float timer = 0, delay = 0.3;
int score = 0;
int highScore = 0;
bool gameOver = false;
Clock clock;
// Initialize the first piece
resetGame(score, colorNum, timer, delay, gameOver);
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 (gameOver)
{
if (e.type == Event::KeyPressed && e.key.code == Keyboard::Space)
{
resetGame(score, colorNum, timer, delay, gameOver);
}
continue;
}
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 (gameOver)
{
window.clear(Color::White);
window.draw(background);
window.draw(scoreText);
window.draw(highScoreText);
window.draw(gameOverText);
playAgainText.setString("Press SPACE to Play Again");
window.draw(playAgainText);
window.draw(frame);
window.display();
continue;
}
// Check gameover
for(int i = 0; i < N; i++)
{
if(field[0][i])
{
gameOver = true;
break;
}
}
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;
int offset = rand() % 9;
for (int i = 0; i < 4; i++)
{
a[i].x = figures[n][i] % 2 + offset;
a[i].y = figures[n][i] / 2 - 4;
}
}
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--;
}
else
{
score += 100; // Increase score by 100 for each line cleared
}
}
// Update high score
if (score > highScore) highScore = score;
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);
}
std::string tHighScore = std::to_string(highScore);
std::string tScoreText = std::to_string(score);
scoreText.setString(tScoreText);
highScoreText.setString(tHighScore);
window.draw(scoreText);
window.draw(highScoreText);
window.draw(frame);
window.display();
}
return 0;
}Editor is loading...
Leave a Comment