Untitled

mail@pastecode.io avatar
unknown
plain_text
a month ago
9.3 kB
2
Indexable
Never
#include <SFML/Graphics.hpp>
#include <time.h>
#include <string>
#include <iostream>
using namespace sf;

const int windowHeight = 480;
const int windowWidth = 360;
const int M = 23;
const int N = 10;

// Grid dimensions
const int gridWidth = 10;
const int gridHeight = 23;
const int blockSize = 18; // Each block is 32x32 pixels

int field[M][N] = { 0 };

struct Point
{
    int x, y;
} a[4], b[4], c[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, int& nextColorNum, int& nextTemo, 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 + rand() % 7;
	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 - 2;
	}
	nextColorNum = 1 + rand() % 7;
	nextTemo = rand() % 7;
	for (int i = 0; i < 4; i++)
    {
        c[i].x = figures[nextTemo][i] % 2;
        c[i].y = figures[nextTemo][i] / 2 - 1;
    }
}

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;
};

bool isDraw()
{
	for (int i = 0; i < 4; i++)
        if (a[i].y < 3) return 0;
    return 1;
}

void checkLines(int& score)
{
	int fieldTem[M][N] = { 0 };
	int x = M - 1;
	for(int i = M - 1; i >= 4; i--)
	{
		int count = 0;
		for(int j = 0; j < N; j++){
			if(field[i][j]) count++;
		}
		if(count < N)
		{
			for(int j = 0; j < N; j++)
			{
				fieldTem[x][j] = field[i][j];
			}
			x--;
		}
		else score += 100;
	}
	for(int i = 4; i < M; i++){
		for(int j = 0; j < N; j++)
		{
			field[i][j] = fieldTem[i][j];
		}
	}
}

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

	// Create a grid
    sf::RectangleShape gridLines[gridWidth * gridHeight];

    // Initialize grid lines
    for (int i = 0; i < gridHeight; ++i)
    {
        for (int j = 0; j < gridWidth; ++j)
        {
            gridLines[i * gridWidth + j].setSize(sf::Vector2f(blockSize - 1, blockSize - 1)); // Adjust size for line thickness
            gridLines[i * gridWidth + j].setFillColor(sf::Color::Transparent);
            gridLines[i * gridWidth + j].setOutlineThickness(1);
            gridLines[i * gridWidth + j].setOutlineColor(sf::Color::Black);
            gridLines[i * gridWidth + j].setPosition(j * blockSize, i * blockSize);
			gridLines[i * gridWidth + j].move(36, 18*3);
        }
    }

    int dx = 0;
    bool rotate = 0;
    int colorNum = 1;
	int nextColorNum = 1 + rand() % 7;
	int nextTemo = rand() % 7;
    float timer = 0, delay = 0.3;
    int score = 0;
    int highScore = 0;
    bool gameOver = false;

    Clock clock;

    // Initialize the first piece
	resetGame(score, colorNum, nextColorNum, nextTemo, 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, nextColorNum, nextTemo, 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[3][i] > 0)
			{
				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 = nextColorNum;
                int n = nextTemo;
				nextColorNum = 1 + rand() % 7;
				nextTemo = rand() % 7;
				int offset = rand() % 9;
                for (int i = 0; i < 4; i++)
                {
                    a[i].x = c[i].x  + offset;
                    a[i].y = c[i].y;
                }
				for (int i = 0; i < 4; i++)
                {
                    c[i].x = figures[nextTemo][i] % 2;
                    c[i].y = figures[nextTemo][i] / 2 - 1;
                }
				
            }
            timer = 0;
        }

        ///////check lines//////////
		checkLines(score);
        /*int k = M - 1;
        for (int i = M - 1; i > 3; i--)
        {
            int count = 0;
            for (int j = 0; j < N; j++)
            {
                if (field[i][j] > 0) 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 < 4; i++)
        {
            s.setTextureRect(IntRect(nextColorNum * 18, 0, 18, 18));
            s.setPosition(c[i].x * 18, c[i].y * 18);
            s.move(250, 300); //offset
            window.draw(s);
        }

        for (int i = 3; 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(36, 18*3); //offset
                window.draw(s);
            }
		if(isDraw()){
        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(36, 18*3); //offset
            window.draw(s);
        }
		}
		for (int i = 0; i < gridWidth * gridHeight; ++i)
        {
			//gridLines[i].move(28, 31);
            window.draw(gridLines[i]);
        }
		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);
		frame.setPosition(6, 18*4+5);
        window.draw(frame);
        window.display();
    }

    return 0;
}
Leave a Comment