wannatu 2022-03-15 20:13 采纳率: 100%
浏览 72
已结题

用qt做的贪吃蛇动不起来

问题遇到的现象和发生背景

代码基本和您回答那个问题差不多,但是按照您的方法调整了贪吃蛇还是动不起来

问题相关代码
#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();
}
运行结果及报错内容

只有一个小方块静止

  • 写回答

1条回答 默认 最新

  • ty94666 2022-03-16 00:41
    关注

    我发的代码是能动的,今天太晚了,明早我再看一下你新发的

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 3月30日
  • 已采纳回答 3月22日
  • 创建了问题 3月15日

悬赏问题

  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同
  • ¥50 如何openEuler 22.03上安装配置drbd
  • ¥20 ING91680C BLE5.3 芯片怎么实现串口收发数据
  • ¥15 无线连接树莓派,无法执行update,如何解决?(相关搜索:软件下载)
  • ¥15 Windows11, backspace, enter, space键失灵