一 ,新建项目
基类选择QWidget。
二,基本逻辑
1.用KeyPressEvent来感知按键,控制贪吃蛇的身体移动
2.蛇食物的生成使用随机函数qrand().
3.设定界面刷新时间
4.QList类保存蛇的动态变化。
三,需要用到的一些头文件
#include <QKeyEvent>
#include <QRectF>
#include <QPainter>
#include <QPen>
#include <QBrush>
#include <QDebug>
#include <QTimer>
#include <QTime>
四,类的声明
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
protected:
void paintEvent(QPaintEvent *);
void keyPressEvent(QKeyEvent *);
private:
void addTopRectF();
void addDownRectF();
void addLeftRectF();
void addRightRectF();
void deleteLastRectF();
bool snakeStrike();
enum Move{
Left,Right,Up,Down};
protected slots:
void timeOut();
void rewardTimeOut();
private:
Ui::Widget *ui;
QList<QRectF> snake;//贪吃蛇本体
int snakeNodeWidth = 10;
int snakeNodeHeight = 10;
QTimer *timer;
QTimer *rewardTimer;
int time = 100;
int moveFlage = Up;
bool gameOver = false;
bool gameStart = false;
QList<QRectF> rewardNode;
};
五,功能实现
1.初始界面设置
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
resize(480,500);
//设置窗体背景色为黑色
setStyleSheet("QWidget{background:black}");
setWindowOpacity(0.8);//设置窗口的透明度
snake.append(QRectF(200,500,snakeNodeWidth,snakeNodeHeight));
addTopRectF();
addTopRectF();
//首先生成一个奖励节点
rewardNode.append(QRectF(100,100,snakeNodeWidth,snakeNodeWidth));
timer = new QTimer;
connect(timer, SIGNAL(timeout()),this,SLOT(timeOut()));
//timer->start(time);
rewardTimer = new QTimer;
connect(rewardTimer,SIGNAL(timeout()),this,SLOT(rewardTimeOut()));
//rewardTimer->start(time*30);
}
Widget::~Widget()
{
delete ui;
}
2.界面刷新
void Widget::timeOut()
{
int flage = 1;