https://www.youtube.com/watch?v=zH_omFPqMO4
위의 영상을 그대로 따라 만든 것
해야할 일 )
- 여기에 사용된 함수 및 변수 등 코드 분석
- GameOver 기능 추가해보기
- 2인용 테트리스 게임 만들어보기
#include <SFML/Graphics.hpp>
#include <time.h> using namespace sf; const int M = 20; const int N = 10; int field[M][N]; struct Point { int x, y; }; Point a[4]; Point 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 }; bool check() { for (int i = 0; i < 4; ++i) { if (a[i].x < 0 || a[i].x >= N || a[i].y >= M) return false; else if (field[a[i].y][a[i].x]) return false; } return true; } int main() { srand(time(0)); RenderWindow window(VideoMode(320, 480), "The Game !"); Texture t1, t2, t3; t1.loadFromFile("images/tiles.png"); t2.loadFromFile("images/background.png"); t3.loadFromFile("images/frame.png"); Sprite frame(t3); Sprite background(t2); Sprite s(t1); //s.setTextureRect(IntRect(0, 0, 18, 18)); int dx = 0; bool rotate = false; int colorNum = 1; float timer = 0; float delay = 0.3; Clock clock; // 첫 스프라이트가 단일로 나오는 것을 해결 a[0].x = 0; a[0].y = 1; a[1].x = 1; a[1].y = 1; a[2].x = 1; a[2].y = 2; a[3].x = 1; a[3].y = 3; 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 (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 (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; for (int i = 0; i < 4; ++i) { a[i].x = figures[n][i] % 2; a[i].y = figures[n][i] / 2; } } timer = 0; } // check lines // int k = M - 1; for (int i = M - 1; i > 0; i--) { int count = 0; for (int j = 0; j < N; ++j) { if (field[i][j]) count++; field[k][j] = field[i][j]; } if (count < N) k--; } dx = 0; rotate = false; delay = 0.3; // draw // window.clear(Color::White); window.draw(background); for (int i = 0; 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(28, 31); 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(28, 31); window.draw(s); } window.draw(frame); window.display(); } return 0; }