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

用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 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记