问题遇到的现象和发生背景
代码基本和您回答那个问题差不多,但是按照您的方法调整了贪吃蛇还是动不起来
问题相关代码
#ifndef SNAKE_H
#define SNAKE_H
#include <QMainWindow>
#include <QPainter>
#include <QTimer>
#include <QKeyEvent>
#include <QMainWindow>
#include<qpainter.h>
QT_BEGIN_NAMESPACE
namespace Ui { class Snake; }
QT_END_NAMESPACE
class Snake : public QMainWindow
{
Q_OBJECT
public:
Snake(QWidget *parent = nullptr);
~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 nDirection;//蛇移动的方向
};
#endif // SNAKE_H
>
```c++
#include "snake.h"
#include "ui_snake.h"
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);
InitSnake();//初始化蛇
//画游戏背景
//外墙
painter.setPen(Qt::black);
painter.setBrush(Qt::gray);
painter.drawRect(15,15,260,260);//画矩形,相对于窗体的起点坐标(15,15),大小260*260
//内墙
painter.setPen(Qt::black);
painter.setBrush(Qt::black);
painter.drawRect(20,20,250,250);
//画小格子,大小10*10
painter.setPen(Qt::blue);
for(int i=2;i<=27;i++){
painter.drawLine(20,i*10,270,i*10);
painter.drawLine(i*10,20,i*10,270);
}
//画蛇
painter.setPen(Qt::black);
painter.setBrush(Qt::white);
painter.drawRect(vSnakeRect);
}
void Snake::InitSnake(){
blsRun=true;
nDirection=2;//默认向下移动
QRect rect(100,70,10,10);//蛇的初始位置
vSnakeRect=rect;//将矩形赋值给蛇
timer=new QTimer(this);//设定定时器
timer->start(500);//计时器时间是1s
connect(timer,SIGNAL(timeout()),SLOT(Snake_update()));
}
void Snake::Snake_update(){
switch(nDirection)
{
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:;
}
this->update();//paintEvent更新
}
void Snake::keyPressEvent(QKeyEvent *event){
switch (event->key()){
case Qt::Key_Up:nDirection=1;
break;
case Qt::Key_Down:nDirection=2;
break;
case Qt::Key_Left:nDirection=3;
break;
case Qt::Key_Right:nDirection=4;
break;
default:;
}
Snake_update();
}
运行结果及报错内容
只有一个小方块静止