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日

悬赏问题

  • ¥170 如图所示配置eNSP
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改
  • ¥20 wireshark抓不到vlan
  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥15 键盘指令混乱情况下的启动盘系统重装