学习QT一周做的小游戏-钢琴块

关键代码

#include "dialog.h"
#include "ui_dialog.h"
#include <QElapsedTimer>
#include  "QTime"
#include <QIcon>
#include "QDebug"
#include"QRandomGenerator"
#include "homepage.h"
Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
    ui->setupUi(this);
    score=0;
    m=0;

}

Dialog::~Dialog()
{
    delete ui;

}

void Dialog::creat()//创建生成的方块
{
    for(int i=0;i<5;i++)
    {
        int n=QRandomGenerator::global()->bounded(3);
        for(int j=0;j<4;j++)
        {
            Kuai[i][j].bto.setParent(this);
            Kuai[i][j].bto.setGeometry(j*100,i*150-150,100,150);
            if(n==j)
            {
                 Kuai[i][j].bto.setIcon(QIcon(":/image/apic27859.webp"));
                 //bto[j].adjustSize();
                 Kuai[i][j].bto.setStyleSheet("border-image: url(:/image/apic27859.webp)");//设置按钮的图片的样式
                 Kuai[i][j].flag=1;
            }
            else {
               Kuai[i][j].bto.setIcon(QIcon(":/image/xxx.webp"));
                //bto[j].adjustSize();
               Kuai[i][j].bto.setStyleSheet("border-image: url(:/image/xxx.webp)");//设置按钮的图片的样式
                Kuai[i][j].flag=0;
            }
            Kuai[i][j].bto.setCheckable(true);
            Kuai[i][j].bto.setEnabled(true);
            Kuai[i][j].bto.show();
            QCoreApplication::processEvents();
            connect(&(Kuai[i][j].bto),SIGNAL(clicked()),&(Kuai[i][j]),SLOT(set()));
            connect(&(Kuai[i][j].bto),SIGNAL(clicked()),&(Kuai[i][j]),SIGNAL(over()));
            connect(&(Kuai[i][j]),SIGNAL(over()),this,SLOT(set()));
        }
    }
}
void Dialog::move()//方块移动
{
    creat();
    while(1)
    {
            QTime time;
            time.start();
            while(time.elapsed() <20-int(score/5))
            {//等待时间流逝1秒钟
             QCoreApplication::processEvents();   //不停地处理事件,让程序保持响应
            }
            for(int i=0;i<5;i++)
            {
               int n=QRandomGenerator::global()->bounded(3);
                for(int j=0;j<4;j++)
                {
                    if(Kuai[i][j].O==1)
                    {
                        ui->label_2->setText("Game Over");
                        return ;
                    }

                    int x=Kuai[i][j].bto.pos().x();
                    int y=Kuai[i][j].bto.pos().y()+1;
                    Kuai[i][j].bto.move(x,y);//移动
                    QCoreApplication::processEvents();
                    if(y==601)
                    {
                        Kuai[i][j].bto.move(x,-150);
                        if(Kuai[i][j].flag==1)
                        {
                          ui->label_2->setText("Game Over");
                            return ;
                        }
                        if(n==j)
                        {
                            Kuai[i][j].bto.setIcon(QIcon(":/image/apic27859.webp"));
                            //bto[j].adjustSize();
                            Kuai[i][j].bto.setStyleSheet("border-image: url(:/image/apic27859.webp)");//设置按钮的图片的样式
                            Kuai[i][j].flag=1;
                        }
                        else
                        {
                          Kuai[i][j].bto.setIcon(QIcon(":/image/xxx.webp"));
                           //bto[j].adjustSize();
                          Kuai[i][j].bto.setStyleSheet("border-image: url(:/image/xxx.webp)");//设置按钮的图片的样式
                          Kuai[i][j].flag=0;
                       }

                    }
                }
            }

    }
}

void Dialog::set()
{
    this->score++;
    char s[10];
    sprintf(s,"分数:%d",score/2);
    ui->label->setText(s);
}

void Dialog::on_pushButton_clicked()
{
    close();
    Dialog *d=new Dialog;
    d->show();
    d->move();
}

void Dialog::on_pushButton_2_clicked()
{
    close();
    homepage *home=new homepage;
    home->show();
}

游戏效果

在这里插入图片描述
在这里插入图片描述
总结:
我是设计了一个5X4大小的数组存储按钮用作模拟方块,当第一组方块到达底部之后在再调整坐标到顶部,本来准备使用不断生成方块的方法,但是线程资源调用的时候有问题(技术不到位),最后写出了这个只有基础功能的黑白块。 关于图片是网上随便找到(图片侵删)。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值