QT写贪吃蛇

QT写贪吃蛇

QT写贪吃蛇的话,分几个部分,一个是界面一个是算法,界面有游戏界面和贴图界面。

1.界面需要注意的部分

这个是写的进入界面

void MainWindow::intbackground(){
    setAutoFillBackground(true);
       QPalette palette;
       palette.setBrush(QPalette::Background, QBrush(QPixmap(":/images/back.jpg").scaled(this->size())));
       setPalette(palette);
       ui->pushButton->setIcon(QIcon(":/images/quit.png"));//将图片贴到pushbuttom上 
       ui->pushButton->setIconSize(QSize(100,100));//调整贴图大小
       ui->pushButton->setFlat(true);//是否露出边框

       ui->pushButton_2->setIcon(QIcon(":/images/start.png"));
       ui->pushButton_2->setIconSize(QSize(100,100));
       ui->pushButton_2->setFlat(true);

      // //ui->pushButton_3->setIcon(QIcon(":/images/AUTO1.png"));
       //ui->pushButton_3->setIconSize(QSize(100,100));
       //ui->pushButton_3->setFlat(true);

}
void MainWindow::intwindow(){
   setWindowTitle("贪吃蛇");//这个就是设计左上角的那段文字
   setWindowIcon(QIcon(":/images/icon.png"));//可以给一个贴图在左上角
}
//结束
void MainWindow::on_pushButton_clicked()
{
exit(1);
}
//开始
void MainWindow::on_pushButton_2_clicked()//
{ 
she *game=new she(this);//我建了一个叫做蛇的子类
game->show();//在创一个窗口
}

可能你们贴图的时候无法显示出来,这个问题,我也遇见过,说什么资源文件过大,你需要用ps处理下,好像是打开图片另存为,在那个选项中去掉啥子,详细过程可以去百度下。
游戏界面

   //建立分数以及难度表格
    scorelable=new QLabel(this);//新建一个lable
    levelable=new QLabel(this);
    scorelable->setText("score:");//添加文字
    scorelable->setGeometry(900,100,120,90);//位置处理
    levelable->setText("level:");
    levelable->setGeometry(900,140,120,90);

    scorenumber=new QLabel(this);
    levelablenum=new QLabel(this);
    lp=new QLabel(this);
    scorenumber->setText(QString::number(score)+"分");
    scorenumber->setGeometry(960,100,120,90);
    levelablenum->setText(QString::number(diff)+"级");
    levelablenum->setGeometry(960,140,120,90);
    

//新建按钮
 starpush=new QPushButton(this);
    pause=new QPushButton(this);
    exitpush=new QPushButton(this);
    autp=new QPushButton(this);

    autp->setIcon(QIcon(":/images/AUTO1.png"));//贴图
    autp->setIconSize(QSize(60,60));//大小
    autp->setGeometry(850,600,60,60);//位置
    autp->setFlat(1);




Timer=new QTimer(this);//新建一个timer
    connect(exitpush,SIGNAL(clicked(bool)),this,SLOT(exit_push()));//将按钮和函数链接起来
    connect(starpush,SIGNAL(clicked(bool)),this,SLOT(star_push()));
    connect(pause,SIGNAL(clicked(bool)),this,SLOT(pause_push()));
    connect(Timer,SIGNAL(timeout()),this,SLOT(time_p()));//这个特殊将一个函数与timer链接起来
    connect(autp,SIGNAL(clicked(bool)),this,SLOT(ai()));

关于苹果的生成就几个部分
1.随机函数
2.2个数组来储存位置
3.冲突的判断
4.用一个私有成员来记录苹果的个数,来达到更新的作用

关于蛇的话就简单的多,只要处理好碰撞问题,和方向问题就行了

//方向用一个私有成员代替direct
void she::keyPressEvent(QKeyEvent *event){
    switch(event->key()){
    case Qt::Key_W:if(direct!=2)direct=1;break;
    case Qt::Key_S:if(direct!=1)direct=2;break;
    case Qt::Key_A:if(direct!=4)direct=3;break;
    case Qt::Key_D:if(direct!=3)direct=4;break;
    }
}
void she::pause_push(){
    Timer->stop();//停止
    connect(starpush,SIGNAL(clicked(bool)),this,SLOT(star_push()));
    starpush->setIcon(QIcon(":/images/Play.png"));
    disconnect(starpush,SIGNAL(clicked(bool)),this,SLOT(pause_push()));
}
void she::star_push(){
 Timer->start(500);没500ms调用一次与timer链接的函数
 disconnect(starpush,SIGNAL(clicked(bool)),this,SLOT(star_push()));
 starpush->setIcon(QIcon(":/images/start.png"));
 connect(starpush,SIGNAL(clicked(bool)),this,SLOT(pause_push()));
}
之前我们用timer和这个函数链接起来,我们在开始函数
void she::time_p()
{
//如果蛇头碰到了苹果
    if(snake[0][0]==foodx[lef]/40&&snake[0][1]==foody[lef]/40)
    {
        data[n2][lef]='1';
        n_len=0;
        body++;
        score=score+10;//加分
        lef++;//吃到苹果的个数
        int n4;
        n4=data[n2].size();
        if(n2==0)
        n4++;
        if(lef==n4-1){
            diff++;
            Timer->start(500-n2*20);
        }
        levelablenum->setText(QString::number(diff)+"级");
        scorenumber->setText(QString::number(score)+"分");
    }
    int n3=data[n2].size();
//如果吃到全部的苹果
    if(lef>=n3){
        delete []foodx;
        delete []foody;
        n2++;
        n1=data[n2].size();
        foodx=new int[n1];
        foody=new int[n1];
        lp->setText(data2[n2]);
    for(int i=0;i<n1;i++){
        foodx[i]=(rand()%19)*40;
        if(foodx[i]==0)
            foodx[i]=40;
       foody[i]=(rand()%19)*40;
       if(foody[i]==0)
           foody[i]=40;
       }
    }
   
    lef=0;
    }
    for(int i=body;i!=0;i--){
        snake[i][0]=snake[i-1][0];
        snake[i][1]=snake[i-1][1];
        cap[snake[i][0]][snake[i][1]]=1;
    }
 
    }

    QPainter painter(this);

switch (direct) {
case 1:--snake[0][1];break;//,painter.drawImage(QRect((40*snake[0][0]),(40*snake[0][1]),40,40),QImage(":/images/shu.png"));break;
case 2:++snake[0][1];break;//painter.drawImage(QRect((40*snake[0][0]),(40*snake[0][1]),40,40),QImage(":/images/shu.png"));break;
case 3:--snake[0][0];break;//,painter.drawImage(QRect((40*snake[0][0]),(40*snake[0][1]),40,40),QImage(":/images/heng.png"));break;
case 4:++snake[0][0];break;//,painter.drawImage(QRect((40*snake[0][0]),(40*snake[0][1]),40,40),QImage(":/images/heng.png"));break;
default:
    break;

}

this->update();//更新
connect(Timer,SIGNAL(timeout()),this,SLOT(game_over()));//链接结束
}
void she::game_over(){
    if(snake[0][0]<0||snake[0][0]>20||snake[0][1]<0||snake[0][1]>20)
    {
        Timer->stop();     
        QMessageBox::Yes==QMessageBox::information(this,"Tips:","Game Over!",QMessageBox::Yes);
        this->hide();
        delete this;

    }
    else
    for(int i=1;i<body;i++){
        if(snake[0][0]==snake[i][0]&&snake[0][1]==snake[i][1]){
            Timer->stop();
            this->hide();
        QMessageBox::Yes==QMessageBox::information(this,"Tips:","Game Over!",QMessageBox::Yes);
        delete this;
        }
    }
    this->update();
    ;
}
  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
好的,下面是一份简单的 Qt 贪吃蛇游戏代码,其中包括两条蛇: ```cpp #include <QtWidgets> const int WIDTH = 400; // 游戏界面宽度 const int HEIGHT = 400; // 游戏界面高度 class Snake : public QGraphicsItem { public: Snake(QPointF pos, qreal w, qreal h, QColor color, QGraphicsItem *parent = nullptr) : QGraphicsItem(parent), m_rect(pos.x(), pos.y(), w, h), m_color(color) {} QRectF boundingRect() const override { return m_rect; } void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override { Q_UNUSED(option); Q_UNUSED(widget); painter->setBrush(QBrush(m_color)); painter->drawRect(m_rect); } void move(int dx, int dy) { m_rect.translate(dx, dy); setPos(m_rect.topLeft()); } private: QRectF m_rect; QColor m_color; }; class Food : public QGraphicsItem { public: Food(QPointF pos, qreal w, qreal h, QColor color, QGraphicsItem *parent = nullptr) : QGraphicsItem(parent), m_rect(pos.x(), pos.y(), w, h), m_color(color) {} QRectF boundingRect() const override { return m_rect; } void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override { Q_UNUSED(option); Q_UNUSED(widget); painter->setBrush(QBrush(m_color)); painter->drawEllipse(m_rect); } private: QRectF m_rect; QColor m_color; }; class Game : public QGraphicsView { public: Game(QWidget *parent = nullptr) : QGraphicsView(parent), m_scene(new QGraphicsScene(this)), m_timer(new QTimer(this)) { setFixedSize(WIDTH, HEIGHT); setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); setScene(m_scene); m_timer->setInterval(100); connect(m_timer, &QTimer::timeout, this, &Game::moveSnakes); } void start() { m_snake1 = new Snake(QPointF(100, 100), 10, 10, Qt::blue, nullptr); m_snake2 = new Snake(QPointF(300, 300), 10, 10, Qt::green, nullptr); m_scene->addItem(m_snake1); m_scene->addItem(m_snake2); spawnFood(); m_timer->start(); } private: void keyPressEvent(QKeyEvent *event) override { switch (event->key()) { case Qt::Key_Left: m_snake1->move(-10, 0); break; case Qt::Key_Right: m_snake1->move(10, 0); break; case Qt::Key_Up: m_snake1->move(0, -10); break; case Qt::Key_Down: m_snake1->move(0, 10); break; case Qt::Key_A: m_snake2->move(-10, 0); break; case Qt::Key_D: m_snake2->move(10, 0); break; case Qt::Key_W: m_snake2->move(0, -10); break; case Qt::Key_S: m_snake2->move(0, 10); break; } } void spawnFood() { qreal x = QRandomGenerator::global()->bounded(0, WIDTH - 10); qreal y = QRandomGenerator::global()->bounded(0, HEIGHT - 10); m_food = new Food(QPointF(x, y), 10, 10, Qt::red, nullptr); m_scene->addItem(m_food); } void moveSnakes() { QList<QGraphicsItem*> items = m_scene->items(); for (QGraphicsItem *item : items) { if (item == m_food) { if (m_snake1->collidesWithItem(m_food)) { m_snake1->setRect(m_snake1->rect().adjusted(-10, -10, 10, 10)); spawnFood(); } else if (m_snake2->collidesWithItem(m_food)) { m_snake2->setRect(m_snake2->rect().adjusted(-10, -10, 10, 10)); spawnFood(); } } else if (item == m_snake1 || item == m_snake2) { QGraphicsItem::ShapeMode mode = QGraphicsItem::Type; QList<QGraphicsItem*> collidingItems = item->collidingItems(mode); for (QGraphicsItem *collidingItem : collidingItems) { if (collidingItem == m_snake1 || collidingItem == m_snake2) { m_timer->stop(); QMessageBox::information(this, "Game Over", "Game Over!"); return; } } } } m_snake1->move(0, 10); m_snake2->move(0, -10); } QGraphicsScene *m_scene; QTimer *m_timer; Snake *m_snake1; Snake *m_snake2; Food *m_food; }; int main(int argc, char *argv[]) { QApplication app(argc, argv); Game game; game.show(); game.start(); return app.exec(); } ``` 这份代码使用了 Qt 的 QGraphicsScene 和 QGraphicsItem 类来实现游戏界面,其中包括两条蛇和一个食物。玩家可以使用键盘控制其中一条蛇的移动,另一条蛇则以固定速度自动移动。当一条蛇吃到食物后,它的身体会变长,并且会重新生成一个食物。如果两条蛇相撞,则游戏结束。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值