main.cpp
unknown
c_cpp
a year ago
8.3 kB
10
Indexable
#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 18x18 pixels
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 - 2;
}
}
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;
};
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("Arial.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;
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[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 = 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 - 2;
}
}
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 = 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);
}
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;
}Editor is loading...
Leave a Comment