Qt贪吃蛇 蛇动不了怎么办

#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呗

img

这里写错了吧

//115 行
connect(timer,SIGNAL(timeout()),SLOT(snake_update()));//槽函数
//感觉应该是这样吧
connect(timer, SIGNAL(timeout()), SLOT(Snake1_update()));//槽函数
  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/194339
  • 这篇博客你也可以参考下:Qt5.6.1下写的一个简单的打飞机小游戏,哈哈 。或者说是简单版的鼠标准度练习器,无聊的时候可以小小的娱乐一下,初学者也可以体验一下,希望可以勾起你们学习Qt的兴趣。不洗勿喷,相互学习嘛。
  • 除此之外, 这篇博客: Qt实现音视频播放器中的 至此一个简易的音视频播放器便已经开发完成,至于快进,后退,倍速播放等功能就看着需求自己完善吧~ 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:


  • 您还可以看一下 焦岳老师的QT教程--入门实战视频精讲课程中的 堆栈窗体小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    解决方案:

    在实现贪吃蛇自动运动的过程中,可以通过使用定时器来实现。具体步骤如下:

    1. 在贪吃蛇的主窗口类中定义一个 QTimer 类型的成员变量,如下所示:
    QTimer *timer;
    
    1. 在构造函数中初始化定时器,并将其超时信号与自定义的槽函数关联,如下所示:
    timer = new QTimer(this);
    connect(timer, SIGNAL(timeout()), this, SLOT(on_timer_timeout()));
    
    1. 编写自定义的槽函数 on_timer_timeout(),在该函数中实现贪吃蛇的自动运动,比如每隔一定时间修改贪吃蛇头的位置,进而更新整条贪吃蛇的位置信息。这里只是伪代码:
    void MainWindow::on_timer_timeout()
    {
        // 修改贪吃蛇头的位置信息,进而更新整条贪吃蛇的位置信息
        ...
        update();
    }
    
    1. 在启动游戏时启动定时器,如下所示:
    timer->start(100);  // 每隔 100ms 向主窗口发送一次超时信号
    

    其中,100 表示超时时间为 100ms。

    通过以上步骤,就可以让贪吃蛇自动运动了。需要注意的是,由于贪吃蛇的运动操作是在定时器的槽函数中实现的,因此在移动操作时应该尽量避免阻塞主线程,否则可能造成定时器失去响应。