Untitled
unknown
plain_text
23 days ago
4.9 kB
3
Indexable
Never
#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