经过漫长的假期,开学了。第二周实训QT。
首先是介绍,什么是QT。
QT:是一个跨平台C++图形用户界面应用程序开发框架。可以开发GUI程序,非GUI程序。
实训主要是写一个俄罗斯方块。未学过C++,前两天先介绍QT的基本使用,后两天老师带着敲俄罗斯方块代码,第四天直接根据给好的代码修改,实现给定的功能。
习题:
1) 给游戏添加得分功能,消掉一行就得 100分
2) 给游戏添加暂停,继续功能;
3) 给游戏添加显示下一个方块组的功能
4) 给游戏增加等级功能
5) 发现重大BUG并解决掉,也给加分
6) 自己增加其他特色功能,也给加分
完成功能1,2,4。
附上代码。
grpbox.h
#ifndef GRPBOX_H
#define GRPBOX_H
#include <QObject>
#include <QVector>
#include <QPoint>
#include <QPainter>
#define COL_NUM 15 //列数,X方向方块的个数
#define ROW_NUM 25 //行数,Y方向方块的个数
#define BOX_WIDTH 20 //方块的宽度
#define AREA_WIDTH (COL_NUM*BOX_WIDTH) //定义游戏区域的宽度
#define AREA_HEIGHT (ROW_NUM*BOX_WIDTH) //定义游戏区域的高度
//定义方块组的类型
enum ITEM_TYPE
{
ITEM_1 = 0, //长条
ITEM_2, //山字形
ITEM_3, //手枪形1
ITEM_4, //手枪形2
ITEM_5, //田
ITEM_6, //Z字形1
ITEM_MAX,
};
class GrpBox : public QObject
{
Q_OBJECT
public:
explicit GrpBox(QObject *parent = 0);
~GrpBox(); //声明析构函数
//在当前位置绘制方块组
void DrawBoxGrp(QPainter& painter);
void InitBoxGrp(ITEM_TYPE item, int style);
//申明移动方块组的函数
void MoveLeft(void);
void MoveRight(void);
void MoveDown(void);
void CancelMoveDown(void); //取消方块组下移
//改变方块组的形状
void ChangeShape(void);
//判断方块组是否左右越界
bool HitSide(void);
//判断方块组是否到达游戏底部
bool HitBottom(void);
//判断方块组是否碰到游戏区域的顶部
bool HitTop(void);
public:
QVector<QPoint> mPoints; //方块组包含的方块的坐标
QPoint mCurPos; //当前方块组位置,单位小方块个数
ITEM_TYPE mType; //保存方块组的类型
int mCurStyle; //保存方块组的样式,旋转角度 0 ~ 3
private:
//声明创建不同类型的方块组的函数,nStyle 表示方块组的旋转角度
void SetupItem1(int nStyle); //长条型
void SetupItem2(int nStyle); //山字形
void SetupItem3(int nStyle); //手枪形1
void SetupItem4(int nStyle); //手枪形2
void SetupItem5(int nStyle); //田
void SetupItem6(int nStyle); //Z字形1
signals:
public slots:
};
#endif // GRPBOX_H
russboxwigdet.h
#ifndef RUSSBOXWIGDET_H
#define RUSSBOXWIGDET_H
#include <QWidget>
#include "grpbox.h"
#include <QVector>
#include <QPoint>
#include <QTimer>
#define COL_NUM 15 //列数,X方向方块的个数
#define ROW_NUM 25 //行数,Y方向方块的个数
#define BOX_WIDTH 20 //方块的宽度
#define AREA_WIDTH (COL_NUM*BOX_WIDTH) //定义游戏区域的宽度
#define AREA_HEIGHT (ROW_NUM*BOX_WIDTH) //定义游戏区域的高度
namespace Ui {
class RussBoxWigdet;
}
class RussBoxWigdet : public QWidget
{
Q_OBJECT
public:
explicit RussBoxWigdet(QWidget *parent = 0);
~RussBoxWigdet();
//绘制游戏区域
void DrawGameArea(void);
void CreateGrpBox(void); //随机创建一个方块组
void DrawGameGrpBox(void); //绘制当前方块组
//将当前方块组添加到背景图案
void AddCurGrpBack(void);
void DrawGameBack(void); //绘制游戏背景图案
//判断当前方块组的方块是否与背景图案重叠,如果重叠返回真,否则返回假
bool CurBoxCoverBack(void);
//判断是否满行,如果满行,就返回真,否则返回假 nRow为行号
bool IsFullLine(int nRow);
//消除满行的功能
void DelFullLine(void);
//删除背景图案中指定的行
void DeleteLine(int nRow);
//方块组下移处理
void GrpMoveDownProcess(void);
//下一组
void DrawNextGrp(void);
//比较成绩显示等级
void ScoreCompare(void);
public slots:
void BtnStartSlot(void); //声明开始游戏槽函数
void RunTimeoutSlot(void); //定时器超时槽函数
void StopSlot(void);//声明暂停游戏槽函数
private:
Ui::RussBoxWigdet *ui;
QTimer *pRunTimer;
QVector<QPoint> mBackPoints; //保存游戏过程中的方块背景
GrpBox *pCurGrpBox; //指向当前方块组
QPixmap *pAreaPixmap; //保存游戏区域的图片
QPixmap *pAreaPixmap1;//下一个
protected:
//重新实现按键事件处理函数
void keyPressEvent(QKeyEvent *e);
long score;
bool Pause;
};
#endif // RUSSBOXWIGDET_H
grpbox.cpp
#include "grpbox.h"
GrpBox::GrpBox(QObject *parent) : QObject(parent)
{
//初始化方块组的起始位置为0
mCurPos.setX(0);
mCurPos.setY(0);
}
GrpBox::~GrpBox()
{
}
//判断当前方块组是超越 左右边界 如果是返回 true,否则返回false
bool GrpBox::HitSide(void)