#ifndef SNAKE1_H
#define SNAKE1_H
#include <QWidget>
QT_BEGIN_NAMESPACE
namespace Ui { class Snake1; }
QT_END_NAMESPACE
class Snake1 : public QWidget
{
Q_OBJECT
public:
Snake1(QWidget *parent = nullptr);
~Snake1();
void paintEvent(QPaintEvent*event);//1
void InitSnake1();//3
void keyPressEvent(QKeyEvent*event);//4
private slots://4
void Snake1_update();//4
private:
Ui::Snake1 *ui;
//QRect vSnakeRect;//3
QTimer*timer;//定时器//4
int nDirection;//蛇的移动方向
bool blsRun;//是否开始//5
bool blsOver;//是否结束//8
QVector<QRect> vSnake1Rect;//6
QRect Snake1Head;//蛇头//7
QString Display;//9
};
#endif // SNAKE1_H
//上面是h头文件
//下面是cpp
#include "snake1.h"
#include "ui_snake1.h"
#include<QPainter>//2
#include<QTimer>//4
#include<QKeyEvent>//4
Snake1::Snake1(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Snake1)
,blsRun(false)//5
{
ui->setupUi(this);
this->setGeometry(QRect(600,300,290,310));//1
}
Snake1::~Snake1()
{
delete ui;
}
void Snake1::paintEvent(QPaintEvent*event){//2
QPainter painter(this);//2
if(!blsRun)//5
{
InitSnake1();//3
}
//画游戏背景//2
//外墙
painter.setPen(Qt::black);//设置画笔颜色
painter.setBrush(Qt::gray);//设置填充颜色
painter.drawRect(15,15,260,260);
//内墙
painter.setPen(Qt::black);//设置画笔颜色
painter.setBrush(Qt::black);//设置填充颜色
painter.drawRect(20,20,250,250);
//画格子
painter.setPen(Qt::gray);
for(int i=2;i<=27;i++){
painter.drawLine(20,i*10,270,i*10);//画横线
painter.drawLine(i*10,20,i*10,270);//画竖线
}
//显示游戏开始和结束//8
QFont font1("Courier",24);
//画蛇//3
painter.setPen(Qt::white);
painter.setBrush(Qt::white);
//painter.drawRect(vSnakeRect);
painter.drawRects(&vSnake1Rect[0],vSnake1Rect.size());
if(blsOver){
timer->stop();
}
}
void Snake1::InitSnake1(){//3
blsRun=true;//5
blsOver=false;//8
nDirection=2;//5
Display="游戏开始!";//9
//QRect rect(100,70,10,10);//3
//vSnakeRect=rect;
vSnake1Rect.resize(5);//蛇的长度//6
for(int i=0;i<vSnake1Rect.size();i++){
QRect rect(100,70+10*i,10,10);
vSnake1Rect[vSnake1Rect.size()-1-i]=rect;
}
timer=new QTimer(this);//设定计时器//4
timer->start(500);//设定时间500ms
connect(timer,SIGNAL(timeout()),SLOT(snake_update()));//槽函数
}
void Snake1::Snake1_update(){//4
Snake1Head=vSnake1Rect.first();//获取蛇头//7
for(int j=0;j<vSnake1Rect.size()-1;j++){//7
vSnake1Rect[vSnake1Rect.size()-1-j]=vSnake1Rect[vSnake1Rect.size()-2-j];
}
switch(nDirection){//4
case 1:
Snake1Head.setTop(Snake1Head.top()-10);
Snake1Head.setBottom(Snake1Head.bottom()-10);
break;
case 2:
Snake1Head.setTop(Snake1Head.top()+10);
Snake1Head.setBottom(Snake1Head.bottom()+10);
break;
case 3:
Snake1Head.setLeft(Snake1Head.left()-10);
Snake1Head.setRight(Snake1Head.right()-10);
break;
case 4:
Snake1Head.setLeft(Snake1Head.left()+10);
Snake1Head.setRight(Snake1Head.right()+10);
break;
default:;
}
vSnake1Rect[0]=Snake1Head;//7
if(Snake1Head.left()<20||Snake1Head.right()>270||Snake1Head.top()<20||Snake1Head.bottom()>270){//8
blsOver=true;
}
update();//更新
}
void Snake1::keyPressEvent(QKeyEvent*event){//4
QKeyEvent *key=(QKeyEvent*) event;
switch(key->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:;
}
Snake1_update();
}
我用Qt实现贪吃蛇小游戏,现在只做了蛇。但是我的蛇一开始不能自行运动,只有按下上下左右键才会移动一格,之后又静止了,请大lao们帮一下孩zi呗
这里写错了吧
//115 行
connect(timer,SIGNAL(timeout()),SLOT(snake_update()));//槽函数
//感觉应该是这样吧
connect(timer, SIGNAL(timeout()), SLOT(Snake1_update()));//槽函数
解决方案:
在实现贪吃蛇自动运动的过程中,可以通过使用定时器来实现。具体步骤如下:
QTimer *timer;
timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(on_timer_timeout()));
void MainWindow::on_timer_timeout()
{
// 修改贪吃蛇头的位置信息,进而更新整条贪吃蛇的位置信息
...
update();
}
timer->start(100); // 每隔 100ms 向主窗口发送一次超时信号
其中,100 表示超时时间为 100ms。
通过以上步骤,就可以让贪吃蛇自动运动了。需要注意的是,由于贪吃蛇的运动操作是在定时器的槽函数中实现的,因此在移动操作时应该尽量避免阻塞主线程,否则可能造成定时器失去响应。