From 26dcade12a4a3270f8c25d6874660bd95fc9fcdf Mon Sep 17 00:00:00 2001 From: Shatokhin Vladimir Nikolaevich Date: Mon, 4 Dec 2023 21:00:07 +0300 Subject: [PATCH] Tetris v.1 --- Piece.h | 12 +++ TetrisTask.pro | 13 ++- figures.cpp | 84 ++++++++++++++++ figures.h | 153 +++++++++++++++++++++++++++++ gamefield.cpp | 32 ------ gamefield.h | 36 ------- logic.cpp | 198 +++++++++++++++++++++++++++++++++++++ logic.h | 43 ++++++++ main.cpp | 14 +-- mainwindow.cpp | 260 +++++++++++++++++++++++++++++++++++++++++++++++++ mainwindow.h | 41 ++++++++ mainwindow.ui | 81 +++++++++++++++ tetris.cpp | 9 -- tetris.h | 22 ----- tetris.ui | 46 --------- 15 files changed, 887 insertions(+), 157 deletions(-) create mode 100644 Piece.h create mode 100644 figures.cpp create mode 100644 figures.h delete mode 100644 gamefield.cpp delete mode 100644 gamefield.h create mode 100644 logic.cpp create mode 100644 logic.h create mode 100644 mainwindow.cpp create mode 100644 mainwindow.h create mode 100644 mainwindow.ui delete mode 100644 tetris.cpp delete mode 100644 tetris.h delete mode 100644 tetris.ui diff --git a/Piece.h b/Piece.h new file mode 100644 index 0000000..2e44666 --- /dev/null +++ b/Piece.h @@ -0,0 +1,12 @@ +#ifndef PIECE_H +#define PIECE_H +#include +#include +class Piece +{ +public: + std::vector > PieceArray; + int PieceColor; + int X, Y; +}; +#endif // PIECE_H diff --git a/TetrisTask.pro b/TetrisTask.pro index f4de819..dbd9dda 100644 --- a/TetrisTask.pro +++ b/TetrisTask.pro @@ -9,16 +9,19 @@ CONFIG += c++17 #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 SOURCES += \ - gamefield.cpp \ + figures.cpp \ + logic.cpp \ main.cpp \ - tetris.cpp + mainwindow.cpp HEADERS += \ - gamefield.h \ - tetris.h + Piece.h \ + figures.h \ + logic.h \ + mainwindow.h FORMS += \ - tetris.ui + mainwindow.ui # Default rules for deployment. qnx: target.path = /tmp/$${TARGET}/bin diff --git a/figures.cpp b/figures.cpp new file mode 100644 index 0000000..a2a7747 --- /dev/null +++ b/figures.cpp @@ -0,0 +1,84 @@ +#include "figures.h" +Figures::Figures() +{ +} +Figures::~Figures() +{ +} +std::vector > Figures::getFigure(int figure, int state) { + if ( figure < 1 ) figure = 1; + else if ( figure > 7 ) figure = 7; + if ( state < 1 ) state = 1; + else if ( state > 4 ) state = 4; + std::vector > v; + for ( int i = 0; i < 4; i++ ) { + std::vector a; + for ( int j = 0; j < 4; j++ ) { + if ( figure == 1 ) { + a.push_back(Figures::figure1_1[i][j]); + } else if ( figure == 2 ) { + if ( state == 1 ) { + a.push_back(Figures::figure2_1[i][j]); + } else if ( state == 2 ) { + a.push_back(Figures::figure2_2[i][j]); + } else if ( state == 3 ) { + a.push_back(Figures::figure2_3[i][j]); + } else if ( state == 4 ) { + a.push_back(Figures::figure2_4[i][j]); + } + } else if ( figure == 3 ) { + if ( state == 1 ) { + a.push_back(Figures::figure3_1[i][j]); + } else if ( state == 2 ) { + a.push_back(Figures::figure3_2[i][j]); + } else if ( state == 3 ) { + a.push_back(Figures::figure3_3[i][j]); + } else if ( state == 4 ) { + a.push_back(Figures::figure3_4[i][j]); + } + } else if ( figure == 4 ) { + if ( state == 1 ) { + a.push_back(Figures::figure4_1[i][j]); + } else if ( state == 2 ) { + a.push_back(Figures::figure4_2[i][j]); + } else if ( state == 3 ) { + a.push_back(Figures::figure4_3[i][j]); + } else if ( state == 4 ) { + a.push_back(Figures::figure4_4[i][j]); + } + } else if ( figure == 5 ) { + if ( state == 1 ) { + a.push_back(Figures::figure5_1[i][j]); + } else if ( state == 2 ) { + a.push_back(Figures::figure5_2[i][j]); + } else if ( state == 3 ) { + a.push_back(Figures::figure5_3[i][j]); + } else if ( state == 4 ) { + a.push_back(Figures::figure5_4[i][j]); + } + } else if ( figure == 6 ) { + if ( state == 1 ) { + a.push_back(Figures::figure6_1[i][j]); + } else if ( state == 2 ) { + a.push_back(Figures::figure6_2[i][j]); + } else if ( state == 3 ) { + a.push_back(Figures::figure6_3[i][j]); + } else if ( state == 4 ) { + a.push_back(Figures::figure6_4[i][j]); + } + } else if ( figure == 7 ) { + if ( state == 1 ) { + a.push_back(Figures::figure7_1[i][j]); + } else if ( state == 2 ) { + a.push_back(Figures::figure7_2[i][j]); + } else if ( state == 3 ) { + a.push_back(Figures::figure7_1[i][j]); + } else if ( state == 4 ) { + a.push_back(Figures::figure7_2[i][j]); + } + } + } + v.push_back(a); + } + return v; +} diff --git a/figures.h b/figures.h new file mode 100644 index 0000000..78bec46 --- /dev/null +++ b/figures.h @@ -0,0 +1,153 @@ +#ifndef FIGURES_H +#define FIGURES_H + +#include +class Figures +{ + public: + Figures(); + virtual ~Figures(); + int figure1_1[4][4] = { + { 0, 1, 1, 0 }, + { 0, 1, 1, 0 }, + { 0, 0, 0, 0 }, + { 0, 0, 0, 0 } + }; + int figure2_1[4][4] = { + { 0, 0, 1, 1 }, + { 0, 1, 1, 0 }, + { 0, 0, 0, 0 }, + { 0, 0, 0, 0 } + }; + int figure2_2[4][4] = { + { 0, 1, 0, 0 }, + { 0, 1, 1, 0 }, + { 0, 0, 1, 0 }, + { 0, 0, 0, 0 } + }; + int figure2_3[4][4] = { + { 0, 0, 1, 1 }, + { 0, 1, 1, 0 }, + { 0, 0, 0, 0 }, + { 0, 0, 0, 0 } + }; + int figure2_4[4][4] = { + { 0, 1, 0, 0 }, + { 0, 1, 1, 0 }, + { 0, 0, 1, 0 }, + { 0, 0, 0, 0 } + }; + int figure3_1[4][4] = { + { 0, 1, 1, 0 }, + { 0, 1, 0, 0 }, + { 0, 1, 0, 0 }, + { 0, 0, 0, 0 } + }; + int figure3_2[4][4] = { + { 0, 1, 1, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 0 }, + { 0, 0, 0, 0 } + }; + int figure3_3[4][4] = { + { 0, 0, 1, 0 }, + { 0, 0, 1, 0 }, + { 0, 1, 1, 0 }, + { 0, 0, 0, 0 } + }; + int figure3_4[4][4] = { + { 0, 1, 0, 0 }, + { 0, 1, 1, 1 }, + { 0, 0, 0, 0 }, + { 0, 0, 0, 0 } + }; + int figure4_1[4][4] = { + { 0, 1, 1, 0 }, + { 0, 0, 1, 1 }, + { 0, 0, 0, 0 }, + { 0, 0, 0, 0 } + }; + int figure4_2[4][4] = { + { 0, 0, 1, 0 }, + { 0, 1, 1, 0 }, + { 0, 1, 0, 0 }, + { 0, 0, 0, 0 } + }; + int figure4_3[4][4] = { + { 0, 1, 1, 0 }, + { 0, 0, 1, 1 }, + { 0, 0, 0, 0 }, + { 0, 0, 0, 0 } + }; + int figure4_4[4][4] = { + { 0, 0, 1, 0 }, + { 0, 1, 1, 0 }, + { 0, 1, 0, 0 }, + { 0, 0, 0, 0 } + }; + int figure5_1[4][4] = { + { 0, 0, 1, 0 }, + { 0, 1, 1, 1 }, + { 0, 0, 0, 0 }, + { 0, 0, 0, 0 } + }; + int figure5_2[4][4] = { + { 0, 1, 0, 0 }, + { 0, 1, 1, 0 }, + { 0, 1, 0, 0 }, + { 0, 0, 0, 0 } + }; + int figure5_3[4][4] = { + { 0, 1, 1, 1 }, + { 0, 0, 1, 0 }, + { 0, 0, 0, 0 }, + { 0, 0, 0, 0 } + }; + int figure5_4[4][4] = { + { 0, 0, 1, 0 }, + { 0, 1, 1, 0 }, + { 0, 0, 1, 0 }, + { 0, 0, 0, 0 } + }; + int figure6_1[4][4] = { + { 0, 1, 1, 0 }, + { 0, 0, 1, 0 }, + { 0, 0, 1, 0 }, + { 0, 0, 0, 0 } + }; + int figure6_2[4][4] = { + { 0, 0, 0, 1 }, + { 0, 1, 1, 1 }, + { 0, 0, 0, 0 }, + { 0, 0, 0, 0 } + }; + int figure6_3[4][4] = { + { 0, 1, 0, 0 }, + { 0, 1, 0, 0 }, + { 0, 1, 1, 0 }, + { 0, 0, 0, 0 } + }; + int figure6_4[4][4] = { + { 0, 1, 1, 1 }, + { 0, 1, 0, 0 }, + { 0, 0, 0, 0 }, + { 0, 0, 0, 0 } + }; + int figure7_1[4][4] = { + { 1, 1, 1, 1 }, + { 0, 0, 0, 0 }, + { 0, 0, 0, 0 }, + { 0, 0, 0, 0 } + }; + int figure7_2[4][4] = { + { 0, 1, 0, 0 }, + { 0, 1, 0, 0 }, + { 0, 1, 0, 0 }, + { 0, 1, 0, 0 } + }; + std::vector > getFigure(int figure, int state); + protected: + private: +}; + +#endif // FIGURES_H diff --git a/gamefield.cpp b/gamefield.cpp deleted file mode 100644 index 6a5ce13..0000000 --- a/gamefield.cpp +++ /dev/null @@ -1,32 +0,0 @@ -#include "gamefield.h" - -#include - -GameField::GameField(QWidget *parent) : QWidget{parent} { - connect(this, &GameField::InitialisationStarted, this, &GameField::SetCells, - Qt::QueuedConnection); - - emit InitialisationStarted(); -} - -uint GameField::GetRowsNumber() const { return rowsNumber_; } - -void GameField::SetRowsNumber(uint rowsNumber) { - if (rowsNumber_ == rowsNumber) return; - - rowsNumber_ = rowsNumber; - emit RowsNumberChanged(); -} - -uint GameField::GetColumnsNumber() const { return columnsNumber_; } - -void GameField::SetColumnNumber(uint columnsCount) { - if (columnsNumber_ == columnsCount) return; - - columnsNumber_ = columnsCount; - emit ColumnsNumberChanged(); -} - -void GameField::SetCells() { - qDebug() << rowsNumber_ << " " << columnsNumber_ << "|"; -} diff --git a/gamefield.h b/gamefield.h deleted file mode 100644 index e36baa8..0000000 --- a/gamefield.h +++ /dev/null @@ -1,36 +0,0 @@ -#ifndef GAMEFIELD_H -#define GAMEFIELD_H - -#include - -class GameField : public QWidget { - Q_OBJECT - public: - explicit GameField(QWidget *parent = nullptr); - - Q_PROPERTY(uint rowsNumber READ GetRowsNumber WRITE SetRowsNumber NOTIFY - RowsNumberChanged FINAL) - Q_PROPERTY(uint columnsNumber READ GetColumnsNumber WRITE SetColumnNumber - NOTIFY ColumnsNumberChanged FINAL) - - signals: - void RowsNumberChanged(); - void ColumnsNumberChanged(); - void InitialisationStarted(); - - private slots: - void SetCells(); - - public: - uint GetRowsNumber() const; - void SetRowsNumber(uint newRowsNumber); - - uint GetColumnsNumber() const; - void SetColumnNumber(uint newColumnsCount); - - private: - uint rowsNumber_ = 0; - uint columnsNumber_ = 0; -}; - -#endif // GAMEFIELD_H diff --git a/logic.cpp b/logic.cpp new file mode 100644 index 0000000..3a6fdad --- /dev/null +++ b/logic.cpp @@ -0,0 +1,198 @@ +#include "logic.h" +#include "mainwindow.h" +#include +#include +MainWindow* main_app; +int num_lines = 0; +Logic::Logic(MainWindow* context) +{ + gameover = false; + dropping = false; + NextPiece.PieceColor = -1; + main_app = context; + score = 0; + for (int i = 0; i < 22; i++) + for (int j = 0; j < 12; j++) + Board[i][j] = 0; + std::time_t result = std::time(0); + srand(result); + InitPiece(); +} +void Logic::SetPiece(Piece* p, int piece_nr, int piece_rot) +{ + p->PieceColor = piece_nr + 1; + p->X = 3; + p->Y = 0; + // int s = piece_nr * (16 * 4) + piece_rot * 16; + p->PieceArray = figure.getFigure(piece_nr, piece_rot); +} +void Logic::CopyPiece(Piece source, Piece * dest) +{ + dest->PieceColor = source.PieceColor; + dest->X = source.X; + dest->Y = source.Y; + for (int i = 0; i < 4; i++) + for (int j = 0; j < 4; j++) + dest->PieceArray[i][j] = source.PieceArray[i][j]; +} +int Logic::GetPieceWidth(Piece p) +{ + int maxw = 0; + for (int j=0; j<4; j++) + { + for (int i = 0; i<4; i++) + if (p.PieceArray[i][j]) { maxw++; break; } + } + return maxw * 29; +} +int Logic::GetPieceHeight(Piece p) +{ + int maxh = 0; + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) + if (p.PieceArray[i][j]) { maxh++; break; } + } + return maxh * 29; +} + +void Logic::InitPiece() +{ + if (NextPiece.PieceColor == -1) { + piece = rand() % 6 + 1; + rot = rand() % 3 + 1; + SetPiece(&CurrentPiece, piece, rot); + next_piece = rand() % 7 + 1; + next_rot = rand() % 4 + 1; + SetPiece(&NextPiece, next_piece, next_rot); + } else { + CopyPiece(NextPiece, &CurrentPiece); + piece = next_piece; + rot = next_rot; + next_piece = rand() % 7 + 1; + next_rot = rand() % 4 + 1; + SetPiece(&NextPiece, next_piece, next_rot); + } +} +void Logic::ReloadPiece() +{ + CurrentPiece.PieceArray = figure.getFigure(piece, rot); +} +bool Logic::PieceIsBlocked() +{ + for (int i = 0; i < 4; i++) + for (int j = 0; j < 4; j++) + { + if (CurrentPiece.PieceArray[i][j] && Board[CurrentPiece.Y + i + 1][CurrentPiece.X + j] != 0) + return true; + if (CurrentPiece.PieceArray[i][j] && i + CurrentPiece.Y + 1 ==20) return true; + } + return false; +} +void Logic::DropPiece() +{ + if (!PieceIsBlocked() && !gameover) + CurrentPiece.Y++; + else if (gameover) + { + } + else + { + BlockPiece(); + Gameover(); + RowFull(); + InitPiece(); + } +} + +void Logic::Gameover() +{ + for (int i = 0; i < 10; i++) + if (Board[0][i] != 0) + { + gameover = true; + main_app->game_over(); + break; + } +} +void Logic::RowFull() +{ + for (int k = 19; k >= 1; k--) + { + int c = 0; + for (int i = 0; i < 10; i++) + if (Board[k][i] != 0) + c++; + if (c == 10) + { + for (int i = k; i >= 1; i--) + for (int j = 0; j < 10; j++) + Board[i][j] = Board[i - 1][j]; + score += 100; + k++; + num_lines++; + if (num_lines % 5 == 0) + main_app->increase_speed(); + } + } +} +void Logic::BlockPiece() +{ + for (int i = 0; i < 4; i++) + for (int j = 0; j < 4; j++) + { + if (CurrentPiece.PieceArray[i][j]) + Board[CurrentPiece.Y + i][CurrentPiece.X + j] = CurrentPiece.PieceColor; + } + if (dropping) + { + main_app->reset_speed(); + dropping = false; + } + score += 10; +} + +bool Logic::PieceCanGoRight() +{ + for (int i = 0; i < 4; i++) + for (int j = 0; j < 4; j++) + { + if (CurrentPiece.PieceArray[i][j]) + { + if (CurrentPiece.X + j + 1 == 10) return false; + if (Board[CurrentPiece.Y + i][CurrentPiece.X + j + 1] != 0) + return false; + } + } + return true; +} +bool Logic::PieceCanGoLeft() +{ + if (CurrentPiece.X + 1 == 0) return false; + for (int i = 0; i < 4; i++) + for (int j = 0; j < 4; j++) + { + if (CurrentPiece.PieceArray[i][j]) + { + if (CurrentPiece.X + j - 1 >= 0) + if (Board[CurrentPiece.Y + i][CurrentPiece.X + j - 1] != 0) + return false; + } + } + return true; +} +bool Logic::PieceCanRotate(int piece_rot) +{ + for (int i = 0; i < 4; i++) + for (int j = 0; j < 4; j++) + { + bool b = figure.getFigure(piece, piece_rot)[i][j] == 0 ? false : true; + if (b) + { + if (i + CurrentPiece.Y > 19) return false; + if (j + CurrentPiece.X > 9) return false; + if (Board[i + CurrentPiece.Y][j + CurrentPiece.X] != 0) return + false; + } + } + return true; +} diff --git a/logic.h b/logic.h new file mode 100644 index 0000000..a75981d --- /dev/null +++ b/logic.h @@ -0,0 +1,43 @@ +#ifndef LOGIC_H +#define LOGIC_H +#include +#include +#include "Piece.h" +#include "mainwindow.h" +#include "figures.h" +class Logic +{ +private: + void SetPiece(Piece*, int, int); + void CopyPiece(Piece, Piece*); +public: + Logic(MainWindow*); + void InitPiece(); + void ReloadPiece(); + bool PieceIsBlocked(); + void DropPiece(); + void Gameover(); + void RowFull(); + void BlockPiece(); + bool PieceCanGoRight(); + bool PieceCanGoLeft(); + bool PieceCanRotate(int); + int GetPieceWidth(Piece); + int GetPieceHeight(Piece); + Figures figure; + int Board[22][12]; + Piece CurrentPiece; + Piece NextPiece; + bool gameover; + bool dropping; + int rot; + int piece; + int next_rot; + int next_piece; + int score; +}; + + + + +#endif // LOGIC_H diff --git a/main.cpp b/main.cpp index f1c8bd9..115a22b 100644 --- a/main.cpp +++ b/main.cpp @@ -1,10 +1,10 @@ +#include "mainwindow.h" #include -#include "tetris.h" - -int main(int argc, char *argv[]) { - QApplication a(argc, argv); - Tetris w; - w.show(); - return a.exec(); +int main(int argc, char *argv[]) +{ + QApplication a(argc, argv); + MainWindow w; + w.show(); + return a.exec(); } diff --git a/mainwindow.cpp b/mainwindow.cpp new file mode 100644 index 0000000..fd12cb2 --- /dev/null +++ b/mainwindow.cpp @@ -0,0 +1,260 @@ +#include "mainwindow.h" +#include "ui_mainwindow.h" + +#include +#include +#include +#include +#include "figures.h" +#include "logic.h" +#include + +QTimer *timer; +Logic* boardlogic; + +MainWindow::MainWindow( QWidget *parent) : + QMainWindow(parent), + ui( new Ui::MainWindow) +{ + ui->setupUi(this); + this->grabKeyboard(); + // Connecting the timer + speed = 450; + boardlogic = new Logic(this); + timer = new QTimer(this); + + + + + + + connect(timer, SIGNAL(timeout()), this, SLOT(tmr_game())); +} +MainWindow::~MainWindow() +{ + delete ui; +} + + +void MainWindow::paintEvent(QPaintEvent *) +{ + QPainter painter(this); + // Draw board + for (int i = 0; i < 20; i++) + for (int j = 0; j < 10; j++) + { + painter.setPen(QColor(0,0,0)); + switch(boardlogic->Board[i][j]) + { + case 0: + painter.setBrush(QColor(255,255,255)); + break; + case 1: + painter.setBrush(QColor(251,188,93)); + break; + case 2: + painter.setBrush(QColor(223,112,79)); + break; + case 3: + painter.setBrush(QColor(168,87,91)); + break; + case 4: + painter.setBrush(QColor(120,55,67)); + break; + case 5: + painter.setBrush(QColor(109,85,118)); + break; + case 6: + painter.setBrush(QColor(117, 145, 224)); + break; + case 7: + painter.setBrush(QColor(196,196,167)); + break; + case 8: + painter.setBrush(QColor(194, 165, 240)); + break; + } + painter.drawRect(j * 29 + 165, i * 29 + 10, 29, 29); + } + // Draw next piece box + painter.setPen(QColor(0,0,0)); + painter.setBrush(QColor(255,255,255)); + painter.drawRect(520, 210, 161, 161); + if (timer->isActive()) { + // Draw current piece + for (int i = 0; i < 4; i++) + for (int j = 0; j < 4; j++) + { + painter.setPen(QColor(0,0,0)); + switch(boardlogic->CurrentPiece.PieceColor) + { + case 0: + painter.setBrush(QColor(255,255,255)); + break; + case 1: + painter.setBrush(QColor(251,188,93)); + break; + case 2: + painter.setBrush(QColor(223,112,79)); + break; + case 3: + painter.setBrush(QColor(168,87,91)); + break; + case 4: + painter.setBrush(QColor(120,55,67)); + break; + case 5: + painter.setBrush(QColor(109,85,118)); + break; + case 6: + painter.setBrush(QColor(117, 145, 224)); + break; + case 7: + painter.setBrush(QColor(196,196,167)); + break; + case 8: + painter.setBrush(QColor(194, 165, 240)); + break; + } + if (boardlogic->CurrentPiece.PieceArray[i][j]) + painter.drawRect(165 + (boardlogic->CurrentPiece.X + j) * + 29, 10 + (boardlogic->CurrentPiece.Y + i) * 29, 29, 29); + } + // Draw next piece + for (int i = 0; i < 4; i++) + for (int j = 0; j < 4; j++) + { + painter.setPen(QColor(0,0,0)); + switch(boardlogic->NextPiece.PieceColor) + { + case 0: + painter.setBrush(QColor(255,255,255)); + break; + case 1: + painter.setBrush(QColor(251,188,93)); + break; + case 2: + painter.setBrush(QColor(223,112,79)); + break; + case 3: + painter.setBrush(QColor(168,87,91)); + break; + case 4: + painter.setBrush(QColor(120,55,67)); + break; + case 5: + painter.setBrush(QColor(109,85,118)); + break; + case 6: + painter.setBrush(QColor(117, 145, 224)); + break; + case 7: + painter.setBrush(QColor(196,196,167)); + break; + case 8: + painter.setBrush(QColor(194, 165, 240)); + break; + } + if (boardlogic->NextPiece.PieceArray[i][j]) painter.drawRect(520 + (80 - boardlogic->GetPieceWidth(boardlogic->NextPiece) / 2) + j * 19, 210 + (80 - boardlogic->GetPieceHeight(boardlogic->NextPiece) / 2) + i * 19, 19, 19); + } + } +} + +void MainWindow::on_startButton_clicked() +{ + if (!timer->isActive()) { + if (boardlogic->dropping) + timer->start(50); + else + timer->start(speed); + } +} +void MainWindow::on_pauseButton_clicked() +{ + timer->stop(); +} +void MainWindow::on_stopButton_clicked() +{ + timer->stop(); + boardlogic = new Logic(this); + ui->lcdNumber->display(0); + speed = 650; + this->repaint(); +} +void MainWindow::tmr_game() +{ + boardlogic->DropPiece(); + ui->lcdNumber->display(boardlogic->score); + this->repaint(); +} +void MainWindow::reset_speed() +{ + timer->setInterval(speed); +} +void MainWindow::increase_speed() +{ + speed *= 0.95; + timer->setInterval(speed); +} +void MainWindow::game_over() +{ + timer->stop(); + QMessageBox * msg = new QMessageBox(this); + msg->setText("Игра окончена!\nСчет: " + QString::number(ui->lcdNumber->value())); + msg->show(); + on_stopButton_clicked(); +} +void MainWindow::keyPressEvent(QKeyEvent *e) +{ + if (timer->isActive()) { + switch(e->key()) + { + case Qt::Key_Left: + if (!boardlogic->dropping) + if (boardlogic->PieceCanGoLeft()) boardlogic->CurrentPiece.X--; + break; + case Qt::Key_Right: + if (!boardlogic->dropping) + if (boardlogic->PieceCanGoRight()) boardlogic->CurrentPiece.X++; + break; + case Qt::Key_Up: + if (!boardlogic->dropping) + if (boardlogic->PieceCanRotate(boardlogic->rot < 4 ?boardlogic->rot + 1 : 1)) + { + if (boardlogic->rot < 4) + boardlogic->rot++; + else boardlogic->rot = 1; + boardlogic->ReloadPiece(); + } + break; + case Qt::Key_Down: + if (!boardlogic->dropping) + { + boardlogic->dropping = true; + timer->setInterval(20); + } + break; + } + this->repaint(); + } +} +void MainWindow::keyReleaseEvent(QKeyEvent *e) { + if ( timer -> isActive() ) { + switch( e -> key() ) { + case Qt::Key_Down: + if (boardlogic->dropping) + { + boardlogic->dropping = false; + timer->setInterval(speed); + } + break; + } + } +} +void MainWindow::on_action_triggered() +{ +} +void MainWindow::on_action_2_triggered() +{ + exit(0); +} diff --git a/mainwindow.h b/mainwindow.h new file mode 100644 index 0000000..443fabe --- /dev/null +++ b/mainwindow.h @@ -0,0 +1,41 @@ +#ifndef MAINWINDOW_H +#define MAINWINDOW_H + +#include + +QT_BEGIN_NAMESPACE +namespace Ui { class MainWindow; } +QT_END_NAMESPACE + +class MainWindow : public QMainWindow +{ + Q_OBJECT + +public: + MainWindow(QWidget *parent = nullptr); + ~MainWindow(); + + void reset_speed(); + void increase_speed(); + void game_over(); + + private slots: + void on_startButton_clicked(); + void on_pauseButton_clicked(); + void on_stopButton_clicked(); + void on_action_triggered(); + void on_action_2_triggered(); + +private: + Ui::MainWindow *ui; + void paintEvent(QPaintEvent*); + int speed; + public slots: + void tmr_game(); + protected: + void keyPressEvent(QKeyEvent *e); + void keyReleaseEvent(QKeyEvent *e); + + +}; +#endif // MAINWINDOW_H diff --git a/mainwindow.ui b/mainwindow.ui new file mode 100644 index 0000000..90bf0cb --- /dev/null +++ b/mainwindow.ui @@ -0,0 +1,81 @@ + + + MainWindow + + + + 0 + 0 + 701 + 600 + + + + MainWindow + + + + + + 50 + 80 + 75 + 23 + + + + Начать + + + + + + 50 + 110 + 75 + 23 + + + + Пауза + + + + + + 50 + 140 + 75 + 23 + + + + Закончить + + + + + + 20 + 180 + 121 + 31 + + + + + + + + 0 + 0 + 701 + 21 + + + + + + + + diff --git a/tetris.cpp b/tetris.cpp deleted file mode 100644 index 50cf380..0000000 --- a/tetris.cpp +++ /dev/null @@ -1,9 +0,0 @@ -#include "tetris.h" - -#include "ui_tetris.h" - -Tetris::Tetris(QWidget *parent) : QMainWindow(parent), ui(new Ui::Tetris) { - ui->setupUi(this); -} - -Tetris::~Tetris() { delete ui; } diff --git a/tetris.h b/tetris.h deleted file mode 100644 index 1245a26..0000000 --- a/tetris.h +++ /dev/null @@ -1,22 +0,0 @@ -#ifndef TETRIS_H -#define TETRIS_H - -#include - -QT_BEGIN_NAMESPACE -namespace Ui { -class Tetris; -} -QT_END_NAMESPACE - -class Tetris : public QMainWindow { - Q_OBJECT - - public: - Tetris(QWidget *parent = nullptr); - ~Tetris(); - - private: - Ui::Tetris *ui; -}; -#endif // TETRIS_H diff --git a/tetris.ui b/tetris.ui deleted file mode 100644 index ae63379..0000000 --- a/tetris.ui +++ /dev/null @@ -1,46 +0,0 @@ - - - Tetris - - - - 0 - 0 - 800 - 600 - - - - Tetris - - - - 20 - - - 10 - - - - - - 0 - 0 - 800 - 21 - - - - - - - - GameField - QWidget -
gamefield.h
- 1 -
-
- - -