Untitled

mail@pastecode.io avatar
unknown
plain_text
5 months ago
4.9 kB
3
Indexable
#include "Game.h"
#include <iostream>

Game::Game() 
    : window(sf::VideoMode(720, 960), "The Game!"), timer(0), delay(0.3f), gameOver(false) {
    // Khởi tạo tất cả các phần tử trong mảng `field` về 0
    for (int i = 0; i < 23; ++i) {
        for (int j = 0; j < 10; ++j) {
            field[i][j] = 0;
        }
    }

    // Load textures and fonts
    t1.loadFromFile("images/tiles.png");
    t2.loadFromFile("images/background.png");
    t3.loadFromFile("images/frame.png");
    font.loadFromFile("Roboto-Regular.ttf");

    s.setTexture(t1);
    s.setScale(2, 2);
    backgroundSprite.setTexture(t2);
    frame.setTexture(t3);

    background.setSize(sf::Vector2f(720, 960));
    background.setFillColor(sf::Color(200, 220, 255, 180));

    // Initialize text objects
    scoreText.setFont(font);
    scoreText.setCharacterSize(24);
    scoreText.setFillColor(sf::Color::White);
    scoreText.setPosition(550, 400);

    highScoreText.setFont(font);
    highScoreText.setCharacterSize(24);
    highScoreText.setFillColor(sf::Color::White);
    highScoreText.setPosition(550, 450);

    gameOverText.setFont(font);
    gameOverText.setCharacterSize(48);
    gameOverText.setFillColor(sf::Color::Red);
    gameOverText.setPosition(180, 300);
    gameOverText.setString("Game Over");

    playAgainText.setFont(font);
    playAgainText.setCharacterSize(24);
    playAgainText.setFillColor(sf::Color::White);
    playAgainText.setPosition(200, 400);
    playAgainText.setString("Press Enter to Play Again");

    resetGame();
}

void Game::resetGame() {
    // Đặt lại tất cả các phần tử của mảng `field` về 0
    for (int i = 0; i < 23; ++i) {
        for (int j = 0; j < 10; ++j) {
            field[i][j] = 0;
        }
    }

    currentTetromino.generateNewTetromino();
    nextTetromino.generateNewTetromino();  // Khởi tạo tetromino tiếp theo
    score.reset();
    gameOver = false;
    timer = 0;
}

void Game::run() {
    while (window.isOpen()) {
        processEvents();
        if (!gameOver) {
            update();
        }
        render();
    }
}

void Game::processEvents() {
    sf::Event event;
    while (window.pollEvent(event)) {
        if (event.type == sf::Event::Closed)
            window.close();
        
        if (event.type == sf::Event::KeyPressed) {
            if (event.key.code == sf::Keyboard::Up)
                currentTetromino.rotate(field);
            else if (event.key.code == sf::Keyboard::Left)
                currentTetromino.move(-1, field);
            else if (event.key.code == sf::Keyboard::Right)
                currentTetromino.move(1, field);
            else if (event.key.code == sf::Keyboard::Down)
                delay = 0.05;
            else if (event.key.code == sf::Keyboard::Enter && gameOver)
                resetGame();
        }
    }
}

void Game::update() {
    float time = clock.getElapsedTime().asSeconds();
    clock.restart();
    timer += time;

    if (timer > delay) {
        if (!currentTetromino.moveDown(field)) {
            // Ghi vào mảng field và kiểm tra các dòng hoàn thành
            currentTetromino.place(field);
            checkLines();
            currentTetromino = nextTetromino; // Chuyển tetromino tiếp theo thành tetromino hiện tại
            nextTetromino.generateNewTetromino(); // Tạo tetromino tiếp theo mới
            if (!currentTetromino.isValidPosition(field)) {
                gameOver = true;
            }
        }
        timer = 0;
    }
}

void Game::checkLines() {
    int k = 22;
    for (int i = 22; i > 0; --i) {
        int count = 0;
        for (int j = 0; j < 10; ++j) {
            if (field[i][j]) count++;
            field[k][j] = field[i][j];
        }
        if (count < 10) k--;
        else score.addScore(100); // Cộng điểm khi phá được một dòng
    }
}

void Game::render() {
    window.clear();
    window.draw(backgroundSprite);

    // Vẽ grid
    for (int i = 0; i < 23; ++i) {
        for (int j = 0; j < 10; ++j) {
            if (field[i][j] == 0) continue;
            s.setTextureRect(sf::IntRect(field[i][j] * 18, 0, 18, 18));
            s.setPosition(j * 36, i * 36);
            s.move(28, 31); // offset
            window.draw(s);
        }
    }

    // Vẽ tetromino hiện tại và tiếp theo
    currentTetromino.draw(window, s);
    nextTetromino.drawNext(window, s);

    // Hiển thị điểm số
    scoreText.setString("Score: " + std::to_string(score.getScore()));
    window.draw(scoreText);

    highScoreText.setString("High Score: " + std::to_string(score.getHighScore()));
    window.draw(highScoreText);

    // Vẽ frame và các thông tin khác
    window.draw(frame);

    if (gameOver) {
        window.draw(gameOverText);
        window.draw(playAgainText);
    }

    window.display();
}
Leave a Comment