From 777b15741d92810807a1f6decb19cf54a402041c Mon Sep 17 00:00:00 2001 From: ElnuDev Date: Thu, 3 Mar 2022 22:42:38 -0800 Subject: [PATCH] Implement crude Tetris --- src/Main.cpp | 116 +++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 112 insertions(+), 4 deletions(-) diff --git a/src/Main.cpp b/src/Main.cpp index c2fa060..23cd57b 100644 --- a/src/Main.cpp +++ b/src/Main.cpp @@ -1,10 +1,64 @@ #include +#include +#include +#include +#include +#include +#include + +class TileType { + public: + sf::Color color; + TileType(sf::Color _color) { + color = _color; + } +}; + +class BlockType { + public: + TileType* tile_type; + std::array, 2> grid; + BlockType(TileType* _tile_type, const std::array, 2>& _grid) { + tile_type = _tile_type; + grid = _grid; + } +}; int main() { - sf::RenderWindow window(sf::VideoMode(200, 200), "SFML works!"); - sf::CircleShape shape(100.f); - shape.setFillColor(sf::Color::Green); + #define WINDOW_WIDTH 400 + #define WINDOW_HEIGHT 400 + sf::RenderWindow window(sf::VideoMode(WINDOW_WIDTH, WINDOW_HEIGHT), "elnutris"); + window.setFramerateLimit(8); + + TileType white(sf::Color::White); + TileType red(sf::Color::Red); + TileType green(sf::Color::Green); + TileType blue(sf::Color::Blue); + TileType yellow(sf::Color::Yellow); + TileType magenta(sf::Color::Magenta); + TileType cyan(sf::Color::Cyan); + + // https://stackoverflow.com/questions/12844475 + BlockType i(&white, {{{{0, 0, 0, 0}}, {{1, 1, 1, 1}}}}); + BlockType j(&red, {{{{1, 0, 0, 0}}, {{1, 1, 1, 0}}}}); + BlockType l(&green, {{{{0, 0, 0, 0}}, {{1, 1, 1, 1}}}}); + BlockType o(&blue, {{{{0, 1, 1, 0}}, {{0, 1, 1, 0}}}}); + BlockType s(&yellow, {{{{0, 1, 1, 0}}, {{1, 1, 0, 0}}}}); + BlockType t(&magenta, {{{{0, 1, 0, 0}}, {{1, 1, 1, 0}}}}); + BlockType z(&cyan, {{{{1, 1, 0, 0}}, {{0, 1, 1, 0}}}}); + BlockType block_types[] = {i, j, l, o, s, t, z}; + + auto current_block = &block_types[rand() % 7];; + auto current_block_position = sf::Vector2i(0, 0); + + #define GRID_WIDTH 20 + #define GRID_HEIGHT 20 + TileType* grid[GRID_HEIGHT][GRID_WIDTH] = { nullptr }; + + int shape_width = WINDOW_WIDTH / GRID_WIDTH; + int shape_height = WINDOW_HEIGHT / GRID_HEIGHT; + sf::RectangleShape shape(sf::Vector2f(shape_width, shape_height)); while (window.isOpen()) { @@ -16,7 +70,61 @@ int main() } window.clear(); - window.draw(shape); + + if (sf::Keyboard::isKeyPressed(sf::Keyboard::Key::Left)) { + current_block_position.x--; + } + if (sf::Keyboard::isKeyPressed(sf::Keyboard::Key::Right)) { + current_block_position.x++; + } + + shape.setFillColor(current_block->tile_type->color); + bool landed = false; + for (int y = 0; y < 2; y++) { + for (int x = 0; x < 4; x++) { + if (!current_block->grid[y][x]) { + continue; + } + int global_x = x + current_block_position.x; + int global_y = y + current_block_position.y; + if (global_y == GRID_HEIGHT - 1 || grid[global_y + 1][global_x] != nullptr) { + landed = true; + } + shape.setPosition(global_x * shape_width, global_y * shape_height); + window.draw(shape); + } + } + if (landed) { + for (int y = 0; y < 2; y++) { + for (int x = 0; x < 4; x++) { + if (!current_block->grid[y][x]) { + continue; + } + int global_x = x + current_block_position.x; + int global_y = y + current_block_position.y; + grid[global_y][global_x] = current_block->tile_type; + } + } + landed = false; + current_block = &block_types[rand() % 7]; + current_block_position = sf::Vector2i(0, 0); + } else { + current_block_position.y++; + } + + for (int y = 0; y < GRID_HEIGHT; y++) { + for (int x = 0; x < GRID_WIDTH; x++) { + auto tile_type = grid[y][x]; + if (tile_type == nullptr) { + // If tile_type is a nullptr (no block), continue + continue; + } + shape.setFillColor(tile_type->color); + shape.setPosition(x * shape_width, y * shape_height); + window.draw(shape); + } + } + window.display(); }