QT做贪吃蛇怎么动不起来(还没做完)
这是头文件
#ifndef SNAKE_H
#define SNAKE_H
#include
#include<qpainter.h>
namespace Ui {
class Snake;
}
class Snake : public QMainWindow
{
Q_OBJECT
public:
explicit Snake(QWidget *parent = 0);
~Snake();
void paintEvent(QPaintEvent *event);
void InitSnake();
private slots:
void Snake_update();
private:
Ui::Snake *ui;
QRect vSnakeRect;//声明一条蛇
void keyPressEvent(QKeyEvent *key);//定义键盘事件
QTimer *timer;//定时器
bool blsRun;//是否开始
int nDriection;//移动方向
};
#endif // SNAKE_H
这是源代码
#include "snake.h"
#include "ui_snake.h"
#include
#include<qrect.h>
#include
#include
Snake::Snake(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::Snake)
{
ui->setupUi(this);
this->setGeometry(QRect(600,300,290,310));
}
Snake::~Snake()
{
delete ui;
}
void Snake::paintEvent(QPaintEvent event){
QPainter painter(this);
if(!blsRun)
InitSnake();
//画游戏的背景
//外墙
painter.setPen(Qt::black);//设置画笔颜色
painter.setBrush(Qt::gray);//设置填充颜色
painter.drawRect(15,15,260,260);
//内墙
painter.setPen(Qt::black);//设置画笔颜色
painter.setBrush(Qt::gray);//设置填充颜色
painter.drawRect(20,20,250,250);
//画格子
painter.setPen(Qt::blue);
for(int i=2;i<=27;i++)
{
painter.drawLine(20,i10,270,i10);//横线
painter.drawLine(i10,20,i*10,270);//竖线
}
//画蛇
painter.setPen(Qt::black);
painter.setBrush(Qt::green);
painter.drawRect(vSnakeRect);
}
void Snake::InitSnake(){
blsRun=true;
nDriection=2;//默认向下移动
QRect rect(100,70,10,10);//蛇的初始位置
vSnakeRect=rect;//将矩形赋值给蛇
timer=new QTimer(this);//设定计时器
timer->start(500);//设定时间500ms
connect(timer,SIGNAL(timeout()),SLOT(snake_update()));
//信号连接槽,发出信号的是timer,信号是timeout,执行的槽是Snake_update
}
void Snake::keyPressEvent(QKeyEvent *event){
QKeyEvent key=(QKeyEvent) event;
switch (key->key()){
case Qt::Key_Up:nDriection=1;
break;
case Qt::Key_Down:nDriection=2;
break;
case Qt::Key_Left:nDriection=3;
break;
case Qt::Key_Right:nDriection=4;
break;
default:;
}
}
void Snake::Snake_update(){
switch(nDriection)
{
case 1:
vSnakeRect.setTop(vSnakeRect.top()-10);
vSnakeRect.setBottom(vSnakeRect.bottom()-10);
break;
case 2:
vSnakeRect.setTop(vSnakeRect.top()+10);
vSnakeRect.setBottom(vSnakeRect.bottom()+10);
break;
case 3:
vSnakeRect.setLeft(vSnakeRect.left()-10);
vSnakeRect.setRight(vSnakeRect.right()-10);
break;
case 4:
vSnakeRect.setLeft(vSnakeRect.left()+10);
vSnakeRect.setRight(vSnakeRect.right()+10);
default:;
}
update();//更新
}