C++实战–QT实现俄罗斯方块
- 效果
- 源码
teris - mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QKeyEvent>
#include "tetris.h"
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
Tetris* tetris;
void keyPressEvent(QKeyEvent* event)override;
private slots:
void on_pushButton_clicked();
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
- tetris.h
#ifndef TETRIS_H
#define TETRIS_H
#include <QObject>
#include <QWidget>
#include <QVector>
#include <QQueue>
#include <QTimer>
#include "item.h"
#include "iteml.h"
class Tetris : public QWidget
{
Q_OBJECT
public:
friend class Item;
explicit Tetris(QWidget *parent = nullptr);
int row;
int col;
int d;
int time;
int score;
int maxScore;
QVector<QVector<int>> board;
QVector<QVector<int>> _board;
QVector<QVector<int>> tmp_board;
QQueue<Item> items;
QPainter* painter;
QTimer* timer;
Item item;
void drawWall();
void paintEvent(QPaintEvent *) override;
void keyPressEvent(QKeyEvent *event) override;
void drawBoard();
void draw_Board();
void updateBoard();
void update_Board();
void undo_Board();
void clear();
void clearOne(int _row);
bool canMoveDown();
bool canMoveLeft();
bool canMoveRight();
bool canTurn();
bool canClear(int _row);
bool gameOver();
void addRandItem();
void newGame();
public slots:
void autoMove();
signals:
};
#endif // TETRIS_H
- item.h
#ifndef ITEM_H
#define ITEM_H
#include <QVector>
class Item
{
public:
Item(int row,int col);
Item();
QVector<QVector<int>>itemBoard;
virtual void innitialize();
void turn();
void unturn();
int itemRow;
int itemCol;
int row;
int col;
};
#endif // ITEM_H
- iteml.h
#ifndef ITEML_H
#define ITEML_H
#include "item.h"
class Iteml : public Item
{
public:
Iteml(int row,int w);
Iteml();
void innitialize()override;
};
#endif // ITEML_H
主要有Tetris类,Item类,Iteml类(继承自Item),还有其它派生的多种形状的方块类。
在painter绘图中,已经落地的和在移动中的方块分别存储。
主要的麻烦的地方是判断,判断是否可以移动,是否可以旋转。
整个图抽象为二维数组,处理上还是比较清晰。