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