Untitled
unknown
plain_text
a year ago
4.9 kB
9
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();
}Editor is loading...
Leave a Comment