diff --git a/Task3_Tetris.pro b/Task3_Tetris.pro
new file mode 100644
index 0000000..9041ee5
--- /dev/null
+++ b/Task3_Tetris.pro
@@ -0,0 +1,29 @@
+QT += core gui
+
+greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
+
+CONFIG += c++17
+
+# You can make your code fail to compile if it uses deprecated APIs.
+# In order to do so, uncomment the following line.
+#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
+
+SOURCES += \
+ figure.cpp \
+ griddrawer.cpp \
+ main.cpp \
+ mainwindow.cpp \
+ nextfigure.cpp \
+ tetris.cpp
+
+HEADERS += \
+ figure.h \
+ griddrawer.h \
+ mainwindow.h \
+ nextfigure.h \
+ tetris.h
+
+# Default rules for deployment.
+qnx: target.path = /tmp/$${TARGET}/bin
+else: unix:!android: target.path = /opt/$${TARGET}/bin
+!isEmpty(target.path): INSTALLS += target
diff --git a/Task3_Tetris.pro.user b/Task3_Tetris.pro.user
new file mode 100644
index 0000000..5f3f973
--- /dev/null
+++ b/Task3_Tetris.pro.user
@@ -0,0 +1,266 @@
+
+
+
+
+
+ EnvironmentId
+ {df4a09b1-8411-4997-95c2-b475eb81ec4c}
+
+
+ ProjectExplorer.Project.ActiveTarget
+ 0
+
+
+ ProjectExplorer.Project.EditorSettings
+
+ true
+ false
+ true
+
+ Cpp
+
+ CppGlobal
+
+
+
+ QmlJS
+
+ QmlJSGlobal
+
+
+ 2
+ UTF-8
+ false
+ 4
+ false
+ 80
+ true
+ true
+ 1
+ false
+ true
+ false
+ 0
+ true
+ true
+ 0
+ 8
+ true
+ false
+ 1
+ true
+ true
+ true
+ *.md, *.MD, Makefile
+ false
+ true
+ true
+
+
+
+ ProjectExplorer.Project.PluginSettings
+
+
+ true
+ false
+ true
+ true
+ true
+ true
+
+
+ 0
+ true
+
+ true
+ true
+ Builtin.DefaultTidyAndClazy
+ 4
+ true
+
+
+
+ true
+
+
+ true
+
+
+
+
+ ProjectExplorer.Project.Target.0
+
+ Desktop
+ Qt 6.6.0 for macOS
+ Qt 6.6.0 for macOS
+ qt.qt6.660.clang_64_kit
+ 0
+ 0
+ 0
+
+ 0
+ /Users/Mura/build-Task3_Tetris-Qt_6_6_0_for_macOS-Debug
+ /Users/Mura/build-Task3_Tetris-Qt_6_6_0_for_macOS-Debug
+
+
+ true
+ QtProjectManager.QMakeBuildStep
+ false
+
+
+
+ true
+ Qt4ProjectManager.MakeStep
+
+ 2
+ Сборка
+ Сборка
+ ProjectExplorer.BuildSteps.Build
+
+
+
+ true
+ Qt4ProjectManager.MakeStep
+ clean
+
+ 1
+ Очистка
+ Очистка
+ ProjectExplorer.BuildSteps.Clean
+
+ 2
+ false
+
+ false
+
+ Отладка
+ Qt4ProjectManager.Qt4BuildConfiguration
+ 2
+
+
+ /Users/Mura/build-Task3_Tetris-Qt_6_6_0_for_macOS-Release
+ /Users/Mura/build-Task3_Tetris-Qt_6_6_0_for_macOS-Release
+
+
+ true
+ QtProjectManager.QMakeBuildStep
+ false
+
+
+
+ true
+ Qt4ProjectManager.MakeStep
+
+ 2
+ Сборка
+ Сборка
+ ProjectExplorer.BuildSteps.Build
+
+
+
+ true
+ Qt4ProjectManager.MakeStep
+ clean
+
+ 1
+ Очистка
+ Очистка
+ ProjectExplorer.BuildSteps.Clean
+
+ 2
+ false
+
+ false
+
+ Выпуск
+ Qt4ProjectManager.Qt4BuildConfiguration
+ 0
+ 0
+
+
+ 0
+ /Users/Mura/build-Task3_Tetris-Qt_6_6_0_for_macOS-Profile
+ /Users/Mura/build-Task3_Tetris-Qt_6_6_0_for_macOS-Profile
+
+
+ true
+ QtProjectManager.QMakeBuildStep
+ false
+
+
+
+ true
+ Qt4ProjectManager.MakeStep
+
+ 2
+ Сборка
+ Сборка
+ ProjectExplorer.BuildSteps.Build
+
+
+
+ true
+ Qt4ProjectManager.MakeStep
+ clean
+
+ 1
+ Очистка
+ Очистка
+ ProjectExplorer.BuildSteps.Clean
+
+ 2
+ false
+
+ false
+
+ Профилирование
+ Qt4ProjectManager.Qt4BuildConfiguration
+ 0
+ 0
+ 0
+
+ 3
+
+
+ 0
+ Развёртывание
+ Развёртывание
+ ProjectExplorer.BuildSteps.Deploy
+
+ 1
+
+ false
+ ProjectExplorer.DefaultDeployConfiguration
+
+ 1
+
+ true
+ true
+ true
+
+ 2
+
+ false
+ Qt4ProjectManager.Qt4RunConfiguration:/Users/Mura/Task3_Tetris/Task3_Tetris.pro
+ /Users/Mura/Task3_Tetris/Task3_Tetris.pro
+ true
+ true
+ true
+ /Users/Mura/build-Task3_Tetris-Qt_6_6_0_for_macOS-Debug/Task3_Tetris.app/Contents/MacOS
+
+ 1
+
+
+
+ ProjectExplorer.Project.TargetCount
+ 1
+
+
+ ProjectExplorer.Project.Updater.FileVersion
+ 22
+
+
+ Version
+ 22
+
+
diff --git a/figure.cpp b/figure.cpp
new file mode 100644
index 0000000..84bfa50
--- /dev/null
+++ b/figure.cpp
@@ -0,0 +1,120 @@
+#include "figure.h"
+
+figure::figure()
+{
+ m_x = 0;
+ m_y = 0;
+ m_condition = 0;
+ m_color = QColor(Qt::red);
+ m_data = {{{1}}};
+}
+
+int figure::x() const
+{
+ return m_x;
+}
+
+void figure::setX(int newX)
+{
+ m_x = newX;
+}
+
+int figure::y() const
+{
+ return m_y;
+}
+
+void figure::setY(int newY)
+{
+ m_y = newY;
+}
+
+int figure::condition() const
+{
+ return m_condition;
+}
+
+void figure::setCondition(int newCondition)
+{
+ m_condition = newCondition;
+}
+
+QColor figure::color() const
+{
+ return m_color;
+}
+
+void figure::setColor()
+{
+ QRandomGenerator *rg = QRandomGenerator::global();
+ int randomNumber = rg->bounded(0, 6);
+
+ QVector colorRand = {Qt::red, Qt::blue, Qt::green, Qt::yellow, Qt::cyan, Qt::magenta};
+ m_color = colorRand[randomNumber];
+}
+
+void figure::setSpecificColor(QColor color_)
+{
+ m_color = color_;
+}
+
+QVector>> figure::data() const
+{
+ return m_data;
+}
+
+void figure::setData()
+{
+ QRandomGenerator *rg = QRandomGenerator::global();
+ int randomNumber = rg->bounded(1, 7);
+ switch (randomNumber) {
+ case 1:
+ m_data = {{{1,1,1,1}}, {{1},{1},{1},{1}}};
+ break;
+ case 2:
+ m_data = {{{1,0},{1,1},{1,0}},
+ {{1,1,1},{0,1,0}},
+ {{0,1},{1,1},{0,1}},
+ {{0,1,0},{1,1,1}}
+ };
+ break;
+ case 3:
+ m_data = {{{1,1},{1,0},{1,0}},
+ {{1,1,1},{0,0,1}},
+ {{0,1},{0,1},{1,1}},
+ {{1,0,0},{1,1,1}}
+ };
+ break;
+ case 4:
+ m_data = {{{1,1},{0,1},{0,1}},
+ {{0,0,1},{1,1,1}},
+ {{1,0},{1,0},{1,1}},
+ {{1,1,1},{1,0,0}}
+ };
+ break;
+ case 5:
+ m_data = {{{1,0},{1,1},{0,1}},
+ {{0,1,1},{1,1,0}}
+ };
+ break;
+ case 6:
+ m_data = {{{0,1},{1,1},{1,0}},
+ {{1,1,0},{0,1,1}}
+ };
+ break;
+ default:
+ break;
+ }
+}
+
+void figure::setSpecificData(QVector>> data_){
+ m_data = data_;
+}
+
+void figure::nextCondition(){
+ setCondition((condition() + 1)%data().size());
+}
+
+void figure::prevCondition(){
+ setCondition((condition() + data().size()- 1)%data().size());
+}
diff --git a/figure.h b/figure.h
new file mode 100644
index 0000000..8b83a4e
--- /dev/null
+++ b/figure.h
@@ -0,0 +1,41 @@
+#ifndef FIGURE_H
+#define FIGURE_H
+
+#include
+#include
+#include
+#include
+
+class figure : public QObject
+{
+ Q_OBJECT
+ Q_PROPERTY(int x READ x WRITE setX)
+ Q_PROPERTY(int y READ y WRITE setY)
+ Q_PROPERTY(int condition READ condition WRITE setCondition)
+
+public:
+ figure();
+ int x() const;
+ void setX(int newX);
+ int y() const;
+ void setY(int newY);
+ int condition() const;
+ void setCondition(int newCondition);
+ QColor color() const;
+ void setColor();
+ QVector>> data() const;
+ void setData();
+ void setSpecificColor(QColor color_);
+ void setSpecificData(QVector>> data_);
+ void nextCondition();
+ void prevCondition();
+
+private:
+ int m_x;
+ int m_y;
+ int m_condition;
+ QColor m_color;
+ QVector>> m_data;
+};
+
+#endif // FIGURE_H
diff --git a/griddrawer.cpp b/griddrawer.cpp
new file mode 100644
index 0000000..862ad04
--- /dev/null
+++ b/griddrawer.cpp
@@ -0,0 +1,82 @@
+#include "griddrawer.h"
+
+GridDrawer::GridDrawer(QWidget *parent):QWidget(parent), m_columns(3), m_rows(4), m_sizeCell(30)
+{
+ for (int i = 0; i < m_columns; i++) {
+ QVector cellsRow = {};
+ for (int j = 0; j < m_rows; j++) {
+ cellsRow.push_back(Qt::gray);
+ }
+ cellColors.push_back(cellsRow);
+ }
+}
+
+int GridDrawer::columns() const
+{
+ return m_columns;
+}
+
+void GridDrawer::setColumns(int newColumns)
+{
+ m_columns = newColumns;
+ cellColors.clear();
+ for (int i = 0; i < m_columns; i++) {
+ QVector cellsRow = {};
+ for (int j = 0; j < rows(); j++) {
+ cellsRow.push_back(Qt::gray);
+ }
+ cellColors.push_back(cellsRow);
+ }
+}
+
+int GridDrawer::rows() const
+{
+ return m_rows;
+}
+
+void GridDrawer::setRows(int newRows)
+{
+ m_rows = newRows;
+ cellColors.clear();
+ for (int i = 0; i < columns(); i++) {
+ QVector cellsRow = {};
+ for (int j = 0; j < m_rows; j++) {
+ cellsRow.push_back(Qt::gray);
+ }
+ cellColors.push_back(cellsRow);
+ }
+}
+
+int GridDrawer::sizeCell() const
+{
+ return m_sizeCell;
+}
+
+void GridDrawer::setSizeCell(int newSizeCell)
+{
+ m_sizeCell = newSizeCell;
+}
+
+QVector> GridDrawer::getCellColors() const
+{
+ return cellColors;
+}
+
+void GridDrawer::setCellColors(const QVector > &newGetCellColors)
+{
+ cellColors = newGetCellColors;
+}
+
+void GridDrawer::draw(QPainter *painter) {
+ int cellWidth = m_sizeCell;
+ int cellHeight = m_sizeCell;
+
+ for (int i = 0; i < m_columns; i++) {
+ for (int j = 0; j < m_rows; j++) {
+ painter->setPen(Qt::white);
+ painter->setBrush(cellColors[i][j]);
+ painter->drawRect(i * cellWidth, j * cellHeight, cellWidth, cellHeight);
+ }
+ }
+ this->update();
+}
diff --git a/griddrawer.h b/griddrawer.h
new file mode 100644
index 0000000..2a97009
--- /dev/null
+++ b/griddrawer.h
@@ -0,0 +1,38 @@
+#ifndef GRIDDRAWER_H
+#define GRIDDRAWER_H
+
+#include
+#include
+#include
+
+class GridDrawer : public QWidget {
+ Q_OBJECT
+ Q_PROPERTY(int columns READ columns WRITE setColumns)
+ Q_PROPERTY(int rows READ rows WRITE setRows)
+ Q_PROPERTY(int sizeCell READ sizeCell WRITE setSizeCell)
+
+public:
+ GridDrawer(QWidget *parent = 0);
+
+ int columns() const;
+ void setColumns(int newColumns);
+
+ int rows() const;
+ void setRows(int newRows);
+
+ int sizeCell() const;
+ void setSizeCell(int newSizeCell);
+
+ QVector > getCellColors() const;
+ void setCellColors(const QVector > &newGetCellColors);
+
+ void draw(QPainter *painter);
+
+private:
+ int m_columns;
+ int m_rows;
+ int m_sizeCell;
+ QVector> cellColors;
+};
+
+#endif // GRIDDRAWER_H
diff --git a/main.cpp b/main.cpp
index f1c8bd9..b48f94e 100644
--- a/main.cpp
+++ b/main.cpp
@@ -1,10 +1,11 @@
+#include "mainwindow.h"
#include
-#include "tetris.h"
+int main(int argc, char *argv[])
+{
+ QApplication a(argc, argv);
+ MainWindow w;
+ w.show();
-int main(int argc, char *argv[]) {
- QApplication a(argc, argv);
- Tetris w;
- w.show();
- return a.exec();
+ return a.exec();
}
diff --git a/mainwindow.cpp b/mainwindow.cpp
new file mode 100644
index 0000000..b16a979
--- /dev/null
+++ b/mainwindow.cpp
@@ -0,0 +1,74 @@
+#include "mainwindow.h"
+
+MainWindow::MainWindow(QWidget *parent)
+ : QMainWindow(parent)
+{
+ int score = 0;
+ tetris *tetris_ = new tetris();
+ nextfigure *nextfigure_ = new nextfigure();
+
+ QPushButton *buttonNewGame = new QPushButton("Новая игра");
+ QPushButton *buttonExit = new QPushButton("Выход");
+ QLabel *labelScore = new QLabel("Cчетчик очков: " + QString::number(score));
+ QLabel *labelGameOver = new QLabel();
+
+ connect(buttonNewGame, &QPushButton::clicked, tetris_, &tetris::newGame);
+ connect(buttonNewGame, &QPushButton::clicked, [=]() mutable{
+ score = 0;
+ labelScore->setText("Cчетчик очков: " + QString::number(score));
+ labelGameOver->setText("");
+ });
+ connect(buttonExit, &QPushButton::clicked, this, &QMainWindow::close);
+ connect(tetris_, &tetris::fullRow, [=]() mutable{
+ score += 5;
+ labelScore->setText("Cчетчик очков: " + QString::number(score));
+ });
+ connect(tetris_, &tetris::gameFinished, [=]() mutable{
+ labelGameOver->setText("ИГРА ОКОНЧЕНА");
+ });
+ connect(tetris_, &tetris::nextStep, nextfigure_, &nextfigure::nextStep);
+ connect(nextfigure_, &nextfigure::figureChanged, tetris_, &tetris::onFigureChanged);
+
+
+ QAction *newGameAction = new QAction("Начать новую игру", this);
+ connect(newGameAction, &QAction::triggered, tetris_, &tetris::newGame);
+
+ QAction *exitAction = new QAction("Выйти", this);
+ connect(exitAction, &QAction::triggered, this, &QMainWindow::close);
+
+ QAction *helpAction = new QAction("Справка", this);
+ connect(helpAction, &QAction::triggered, this, [=](){
+ QMessageBox::information(this, "Справка", QString(u8"\u2193") + " - спускает фигуру на одну ячейку вниз\n" + QString(u8"\u2190") + " - сдвигает фигуру на одну ячейку влево\n" + QString(u8"\u2192") + " - сдвигает фигуру на одну ячейку вправо\n" + QString(u8"\u2191") + " - поворачивает фигуру\n Пробел - сбрасывает фигуру вниз");
+ });
+
+ QMenu *gameMenu = menuBar()->addMenu("Игра");
+ gameMenu->addAction(newGameAction);
+ gameMenu->addAction(exitAction);
+
+ QMenu *helpMenu = menuBar()->addMenu("Справка");
+ helpMenu->addAction(helpAction);
+
+ QHBoxLayout *hLayout = new QHBoxLayout;
+ QVBoxLayout *vLayout = new QVBoxLayout;
+ hLayout->addWidget(tetris_);
+ vLayout->addWidget(nextfigure_);
+ vLayout->addWidget(buttonNewGame);
+ vLayout->addWidget(labelScore);
+ vLayout->addWidget(labelGameOver);
+ vLayout->addWidget(buttonExit);
+ hLayout->addLayout(vLayout);
+
+
+ setCentralWidget(new QWidget);
+ centralWidget()->setLayout(hLayout);
+
+ GridDrawer *tetrisGrid = tetris_->getGrid();
+ GridDrawer *nextFigureGrid = nextfigure_->getGridDrawer();
+ int width_ = tetrisGrid->columns() * tetrisGrid->sizeCell() + nextFigureGrid->columns()*nextFigureGrid->sizeCell() + 250;
+ int hieght_ = tetrisGrid->rows() * tetrisGrid->sizeCell() + 300;
+ resize(width_, hieght_);
+
+ tetris_->setFocus();
+}
+MainWindow::~MainWindow() {}
+
diff --git a/mainwindow.h b/mainwindow.h
new file mode 100644
index 0000000..f1bba4e
--- /dev/null
+++ b/mainwindow.h
@@ -0,0 +1,25 @@
+#ifndef MAINWINDOW_H
+#define MAINWINDOW_H
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+#include "griddrawer.h"
+#include "tetris.h"
+#include "nextfigure.h"
+
+class MainWindow : public QMainWindow {
+ Q_OBJECT
+
+public:
+ MainWindow(QWidget *parent = nullptr);
+ ~MainWindow();
+};
+
+#endif // MAINWINDOW_H
diff --git a/nextfigure.cpp b/nextfigure.cpp
new file mode 100644
index 0000000..0d7f97b
--- /dev/null
+++ b/nextfigure.cpp
@@ -0,0 +1,67 @@
+#include "nextfigure.h"
+
+nextfigure::nextfigure(QWidget *parent):QWidget(parent), grid(new GridDrawer()), figure_(new figure()) {
+ figure_->setData();
+ figure_->setColor();
+ int x = (4 - figure_->data()[0].size())/2;
+ figure_->setX(x);
+ int y = (4 - figure_->data()[0][0].size())/2;
+ figure_->setY(y);
+
+ QVector> cellColors = grid->getCellColors();
+ for(int i = 0; i < figure_->data()[0].size(); i++){
+ for(int j = 0; j < figure_->data()[0][i].size(); j++){
+ if(figure_->data()[0][i][j]){
+ cellColors[i + x][j + y] = figure_->color();
+ }
+ }
+ }
+ grid->setCellColors(cellColors);
+}
+
+void nextfigure::paintEvent(QPaintEvent *event) {
+ QPainter painter(this);
+ grid->draw(&painter);
+ int height_ = grid->y()*grid->sizeCell() + 10;
+ painter.drawText(0, 150, "Следующая фигура");
+ this->update();
+}
+
+GridDrawer *nextfigure::getGridDrawer()
+{
+ return grid;
+}
+
+void nextfigure::nextStep()
+{
+ figure* nextFigure_ = new figure();
+ nextFigure_->setSpecificColor(figure_->color());
+ nextFigure_->setSpecificData(figure_->data());
+ emit figureChanged(nextFigure_);
+ updateFigure();
+}
+
+void nextfigure::updateFigure(){
+ figure_->setData();
+ figure_->setColor();
+ int maximumHeightFigure = 4;
+ int x = (maximumHeightFigure - figure_->data()[0].size())/2;
+ figure_->setX(x);
+ int y = (maximumHeightFigure - figure_->data()[0][0].size())/2;
+ figure_->setY(y);
+
+ QVector> cellColors = grid->getCellColors();
+ for(int i = 0; i < cellColors.size(); i++){
+ for(int j = 0; j < cellColors[i].size(); j++){
+ cellColors[i][j] = Qt::gray;
+ }
+ }
+ for(int i = 0; i < figure_->data()[0].size(); i++){
+ for(int j = 0; j < figure_->data()[0][i].size(); j++){
+ if(figure_->data()[0][i][j]){
+ cellColors[i + x][j + y] = figure_->color();
+ }
+ }
+ }
+ grid->setCellColors(cellColors);
+}
diff --git a/nextfigure.h b/nextfigure.h
new file mode 100644
index 0000000..bffed8e
--- /dev/null
+++ b/nextfigure.h
@@ -0,0 +1,30 @@
+#ifndef NEXTFIGURE_H
+#define NEXTFIGURE_H
+
+#include "griddrawer.h"
+#include "figure.h"
+#include
+#include
+#include
+
+class nextfigure : public QWidget {
+ Q_OBJECT
+
+signals:
+ void figureChanged(figure* newFigure);
+
+public slots:
+ void nextStep();
+
+public:
+ nextfigure(QWidget *parent = 0);
+ GridDrawer *getGridDrawer();
+ void updateFigure();
+protected:
+ void paintEvent(QPaintEvent *event) override;
+private:
+ GridDrawer* grid;
+ figure* figure_;
+};
+
+#endif // NEXTFIGURE_H
diff --git a/tetris.cpp b/tetris.cpp
index 50cf380..9980ad4 100644
--- a/tetris.cpp
+++ b/tetris.cpp
@@ -1,9 +1,357 @@
#include "tetris.h"
-#include "ui_tetris.h"
+tetris::tetris(QWidget *parent): QWidget(parent), grid(new GridDrawer()), figure_(new figure())
+{
+ int maximumHeightFigure = 4;
+ gameOn = 1;
+ grid->setColumns(7);
+ grid->setRows(10);
-Tetris::Tetris(QWidget *parent) : QMainWindow(parent), ui(new Ui::Tetris) {
- ui->setupUi(this);
+ figure_->setData();
+ figure_->setColor();
+ int cond = figure_->condition();
+ int x = (grid->columns() + 2 - figure_->data()[cond].size())/2;
+ figure_->setX(x);
+ int y = 2;
+ if(figure_->data()[cond][0].size() == maximumHeightFigure){
+ y = 0;
+ }
+ figure_->setY(y);
+ qDebug() << x << " " << y;
+
+ for(int i = 0; i < grid->columns()+2; i++){
+ QVector vectorInt;
+ gridInt.push_back(vectorInt);
+ for(int j = 0; j < grid->rows()+5; j++){
+ if(i == 0 || i == grid->columns() + 1 || j == grid->rows() + 4){
+ gridInt[i].push_back(1);
+ }else{
+ gridInt[i].push_back(0);
+ }
+ }
+ }
+
+ for(int i = 0; i < figure_->data()[cond].size(); i++){
+ for(int j = 0; j < figure_->data()[cond][i].size(); j++){
+ if(figure_->data()[cond][i][j]){
+ gridInt[i + x][j + y] = 2;
+ }
+ }
+ }
+
+ for(int i = 0; i < grid->columns()+2; i++){
+ qDebug() << gridInt[i];
+ }
+
+ QVector> cellColors = grid->getCellColors();
+
+ for(int i = 1; i < grid->columns()+1; i++){
+ for(int j = maximumHeightFigure; j < grid->rows()+maximumHeightFigure; j++){
+ if(gridInt[i][j] == 0){
+ cellColors[i-1][j-maximumHeightFigure] = Qt::black;
+ }
+ if(gridInt[i][j] == 1){
+ cellColors[i-1][j-maximumHeightFigure] = Qt::gray;
+ }
+ if(gridInt[i][j] == 2){
+ cellColors[i-1][j-maximumHeightFigure] = figure_->color();
+ }
+ }
+ }
+ grid->setCellColors(cellColors);
+
+
+ timer_ = new QTimer();
+ connect(timer_, &QTimer::timeout, this, &tetris::TikTime);
+ timer_->start(1000);
+}
+
+GridDrawer *tetris::getGridDrawer()
+{
+ return grid;
+}
+
+void tetris::checkRows()
+{
+ for(int j = grid->rows() + 3; j >= 0; j--){
+ bool ind = true;
+ for(int i = 0; i < grid->columns()+2; i++){
+ if(gridInt[i][j] == 0){
+ ind = false;
+ break;
+ }
+ }
+ if(ind){
+ emit fullRow();
+ for(int i = 0; i < grid->columns()+2; i++){
+ gridInt[i].remove(j);
+ if(i == 0 || i == grid->columns()+1){
+ gridInt[i].push_front(1);
+ }else{
+ gridInt[i].push_front(0);
+ }
+ }
+ j++;
+ }
+ }
+}
+
+int tetris::checkLastRow()
+{
+ int maximumHeightFigure = 4;
+ for(int i = 1; i < grid->columns()+1; i++){
+ if(gridInt[i][maximumHeightFigure] != 0){
+ gameOn = 0;
+ emit gameFinished();
+ return 0;
+ }
+ }
+ return 1;
+}
+
+void tetris::newGame()
+{
+ int maximumHeightFigure = 4;
+ qDebug() << "new game";
+ for(int i = 1; i < grid->columns()+1; i++){
+ for(int j = 0; j < grid->rows()+maximumHeightFigure; j++){
+ gridInt[i][j] = 0;
+ }
+ }
+
+ emit nextStep();
+ figure_->setData();
+ figure_->setColor();
+ figure_->setCondition(0);
+ int cond = figure_->condition();
+ int x = (grid->columns() + 2 - figure_->data()[cond].size())/2;
+ figure_->setX(x);
+ int y = 2;
+ if(figure_->data()[cond][0].size() == maximumHeightFigure){
+ y = 0;
+ }
+ figure_->setY(y);
+
+ for(int i = 0; i < figure_->data()[cond].size(); i++){
+ for(int j = 0; j < figure_->data()[cond][i].size(); j++){
+ if(figure_->data()[cond][i][j]){
+ gridInt[i + x][j + y] = 2;
+ }
+ }
+ }
+
+ updateCellColors();
+ gameOn = 1;
}
-Tetris::~Tetris() { delete ui; }
+void tetris::paintEvent(QPaintEvent *event) {
+ QPainter painter(this);
+ grid->draw(&painter);
+ this->update();
+}
+
+void tetris::updateCellColors(){
+ QVector> cellColors = grid->getCellColors();
+ int maximumHeightFigure = 4;
+ for(int i = 1; i < grid->columns()+1; i++){
+ for(int j = maximumHeightFigure; j < grid->rows()+maximumHeightFigure; j++){
+ if(gridInt[i][j] == 0){
+ cellColors[i-1][j-maximumHeightFigure] = Qt::black;
+ }
+ if(gridInt[i][j] == 1){
+ cellColors[i-1][j-maximumHeightFigure] = Qt::gray;
+ }
+ if(gridInt[i][j] == 2){
+ cellColors[i-1][j-maximumHeightFigure] = figure_->color();
+ }
+ }
+ }
+ grid->setCellColors(cellColors);
+}
+
+bool tetris::moveFigureDown(){
+ int maximumHeightFigure = 4;
+ bool ind = true;
+ QVector> tmpGridInt = gridInt;
+ for(int j = grid->rows()+maximumHeightFigure; j > 0; j--){
+ if(ind){
+ for(int i = 0; i < grid->columns()+2; i++){
+ if(gridInt[i][j-1] != 1 && gridInt[i][j-1] != 0 && gridInt[i][j] == 1){
+ ind = false;
+ break;
+ }else{
+ if(gridInt[i][j] != 1 && gridInt[i][j-1] != 1){
+ tmpGridInt[i][j] = gridInt[i][j-1];
+ tmpGridInt[i][j-1] = 0;
+ }
+ }
+ }
+ }else{
+ break;
+ }
+ }
+ if(ind){
+ gridInt = tmpGridInt;
+ figure_->setY(figure_->y() + 1);
+ }else{
+ checkRows();
+ qDebug() << checkLastRow();
+// перекраска в серый цвет
+ for(int i = 0; i < grid->columns()+2; i++){
+ for(int j = 0; j < grid->rows()+5; j++){
+ if(gridInt[i][j] > 1){
+ gridInt[i][j] = 1;
+ }
+ }
+ }
+ if(checkLastRow()){
+ emit nextStep();
+ figure_->setCondition(0);
+ int cond = figure_->condition();
+ int x = (grid->columns() + 2 - figure_->data()[cond].size())/2;
+ figure_->setX(x);
+ int y = 2;
+ if(figure_->data()[cond][0].size() == maximumHeightFigure){
+ y = 0;
+ }
+ figure_->setY(y);
+
+ for(int i = 0; i < figure_->data()[cond].size(); i++){
+ for(int j = 0; j < figure_->data()[0][i].size(); j++){
+ if(figure_->data()[cond][i][j]){
+ gridInt[i + x][j + y] = 2;
+ }
+ }
+ }
+
+ for(int i = 0; i < grid->columns()+2; i++){
+ qDebug() << gridInt[i];
+ }
+ }
+ }
+ updateCellColors();
+ return ind;
+}
+
+GridDrawer *tetris::getGrid()
+{
+ return grid;
+}
+
+void tetris::keyPressEvent(QKeyEvent *event)
+{
+ qDebug() << "Key event";
+
+ if (event->key() == Qt::Key_Down){
+ qDebug() << "Key Down Pressed";
+ moveFigureDown();
+ }
+
+ if(event->key() == Qt::Key_Space){
+ qDebug() << "Key Space Pressed";
+ bool ind = true;
+ while(ind && gameOn){
+ ind = moveFigureDown();
+ qDebug() << ind;
+ }
+ }
+
+ if (event->key() == Qt::Key_Left){
+ qDebug() << "Key Right Pressed";
+ bool ind = true;
+ QVector> tmpGridInt = gridInt;
+ for(int i = 1; i < grid->columns()+2; i++){
+ if(ind){
+ for(int j = 0; j < grid->rows() + 5; j++){
+ if(gridInt[i][j] != 1 && gridInt[i][j] != 0 && gridInt[i-1][j] == 1){
+ ind = false;
+ break;
+ }else{
+ if(gridInt[i][j] != 1 && gridInt[i-1][j] != 1){
+ tmpGridInt[i-1][j] = gridInt[i][j];
+ tmpGridInt[i][j] = 0;
+ }
+ }
+ }
+ }else{
+ break;
+ }
+ }
+ if(ind){
+ gridInt = tmpGridInt;
+ figure_->setX(figure_->x() - 1);
+ }
+ updateCellColors();
+ }
+
+ if (event->key() == Qt::Key_Right){
+ qDebug() << "Key Right Pressed";
+ bool ind = true;
+ QVector> tmpGridInt = gridInt;
+ for(int i = grid->columns()+1; i >0; i--){
+ if(ind){
+ for(int j = 0; j < grid->rows() + 5; j++){
+ if(gridInt[i-1][j] != 1 && gridInt[i-1][j] != 0 && gridInt[i][j] == 1){
+ ind = false;
+ break;
+ }else{
+ if(gridInt[i][j] != 1 && gridInt[i-1][j] != 1){
+ tmpGridInt[i][j] = gridInt[i-1][j];
+ tmpGridInt[i-1][j] = 0;
+ }
+ }
+ }
+ }else{
+ break;
+ }
+ }
+ if(ind){
+ gridInt = tmpGridInt;
+ figure_->setX(figure_->x() + 1);
+ }
+ updateCellColors();
+ }
+ for(int i = 0; i < grid->columns()+2; i++){
+ qDebug() << gridInt[i];
+ }
+
+ if (event->key() == Qt::Key_Up){
+ QVector> tmpGridInt = gridInt;
+ for(int i = grid->columns()+1; i >0; i--){
+ for(int j = 0; j < grid->rows() + 5; j++){
+ if(tmpGridInt[i][j] > 1){
+ tmpGridInt[i][j] = 0;
+ }
+ }
+ }
+ figure_->nextCondition();
+ int cond = figure_->condition();
+ bool ind = 1;
+ for(int i = 0; i < figure_->data()[cond].size(); i++){
+ if(ind){
+ for(int j = 0; j < figure_->data()[cond][i].size(); j++){
+ if(figure_->data()[cond][i][j] && tmpGridInt[i+figure_->x()][j+figure_->y()] == 0){
+ tmpGridInt[i+figure_->x()][j+figure_->y()] = 2;
+ }else{
+ if(figure_->data()[cond][i][j] && tmpGridInt[i+figure_->x()][j+figure_->y()]){
+ ind = false;
+ break;
+ }
+ }
+ }
+ }
+ }
+ if(ind){
+ gridInt = tmpGridInt;
+ updateCellColors();
+ }else{
+ figure_->prevCondition();
+ }
+ }
+ this->update();
+}
+
+void tetris::TikTime()
+{
+ moveFigureDown();
+}
diff --git a/tetris.h b/tetris.h
index 1245a26..1b7054b 100644
--- a/tetris.h
+++ b/tetris.h
@@ -1,22 +1,51 @@
#ifndef TETRIS_H
#define TETRIS_H
-#include
+#include "griddrawer.h"
+#include "figure.h"
+#include "nextfigure.h"
+#include
+#include
+#include
+#include
-QT_BEGIN_NAMESPACE
-namespace Ui {
-class Tetris;
-}
-QT_END_NAMESPACE
+class tetris : public QWidget {
+ Q_OBJECT
-class Tetris : public QMainWindow {
- Q_OBJECT
+signals:
+ void nextStep();
+ void gameFinished();
+ void fullRow();
- public:
- Tetris(QWidget *parent = nullptr);
- ~Tetris();
+public slots:
+ void onFigureChanged(figure* newFigure) {
+ figure_ = newFigure;
+ }
+ void newGame();
+
+public:
+ tetris(QWidget *parent = 0);
+
+ GridDrawer *getGridDrawer();
+ void checkRows();
+ int checkLastRow();
+ void updateCellColors();
+ bool moveFigureDown();
+ GridDrawer *getGrid();
+ void TikTime();
+
+protected:
+ void paintEvent(QPaintEvent *event) override;
+ void keyPressEvent(QKeyEvent *event) override;
+
+private:
+ GridDrawer* grid;
+ figure* figure_;
+ QVector> gridInt;
+ bool gameOn;
+ QTimer *timer_;
- private:
- Ui::Tetris *ui;
};
-#endif // TETRIS_H
+
+
+#endif // TETRIS_H