Qt实现2048(4种模式)

本文介绍了四种创新的电子游戏模式:经典2048模式、无尽模式、学生成长模式以及中国朝代模式,通过QPixmap和自定义贴图实现,同时融入了历史元素和游戏难度递进。每个模式都展示了不同技术应用与游戏体验的结合。
摘要由CSDN通过智能技术生成

经典模式

我采用贴图的形式实现方格,便于后续娱乐模式的开发(就换个贴图罢了)。

先贴代码,后续有详细说明。

startgame.h 头文件代码

#ifndef STARTGAME_H
#define STARTGAME_H
#include <QMainWindow>
#include<QPushButton>
#include<QTime>
#include<QPainter>
#include<QKeyEvent>
#include<QMessageBox>
#include<QRandomGenerator>
#include <QtGlobal>
#include<QDebug>
#include <QWidget>
#include<QLabel>


namespace Ui {
class startgame;
}

class startgame : public QWidget
{
    Q_OBJECT

public:
    explicit startgame(QWidget *parent = nullptr);
    ~startgame();
public:

    void paintEvent(QPaintEvent *);
    void keyPressEvent(QKeyEvent *event);

    QPushButton *button;
    int s[4][4];
    int score=0;

    //bool state=0;//游戏状态 ture正常运行 false停止

    //wasd操作函数
    void PressUp();
     void PressDown();
      void PressLeft();
       void PressRight();
    //随机生成函数 判断结束函数
      void myRand();
      struct Ns{
          int i;
          int j;
      };


private slots:
    void on_pushButton_2_clicked();

    void on_pushButton_clicked();

private:
    Ui::startgame *ui;
     QLabel *diamond;


};

#endif // STARTGAME_H

startgame.cpp代码

#include "startgame.h"
#include "ui_startgame.h"
#include"widget.h"
#include"gameover.h"
#include"victory.h"
#include"record.h"

int classify;
int rank;
struct Person
{
    QString name;
    int feng;
};

int endscore=0;
startgame::startgame(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::startgame)
{
    ui->setupUi(this);

    setPalette(QPalette(QColor(251,248,239)));
    setAutoFillBackground(true);
    //初始化
    for(int i=0; i<4; i++)
    {
        for(int j=0; j<4; j++)
        {
            s[i][j]=0;
        }
    }







     int randi=qrand()%4;
     int randj=qrand()%4;
     s[randi][randj]=2;
     update();

     QTextStream cin(stdin,  QIODevice::ReadOnly);

     QTextStream cout(stdout,  QIODevice::WriteOnly);

     int best;

     QFile r("D:/Qt/2048beta/list.txt");
     if(!r.open(QIODevice::ReadOnly | QIODevice::Text))
     {
         cout << "Open failed." << Qt::endl;
     }


     QTextStream txtInput(&r);
     while(!txtInput.atEnd())
     {
           QTextStream in(&r);  //用文件构造流

           best=in.readLine().toInt();

     }

     r.close();

     ui->label_4->setText("最佳:\n"+QString::number(best));
    //随机种子
    qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));

}


startgame::~startgame()
{
    delete ui;

}


void startgame::paintEvent(QPaintEvent *)
{
    QPainter p(this);
    p.setBrush(Qt::blue);
    p.setFont(QFont("微软雅黑",20,700,false));
    ui->label_3->setText("分数:\n"+QString::number(score));


    //格子的实现
    for(int i=0; i<4; i++)
    {
        for(int j=0; j<4; j++)
        {
            p.setPen(Qt::transparent);
            if(s[i][j]==0)
            {

                diamond = new QLabel(this);
                QPixmap pix ( ":/images/0.png");
                diamond->setPixmap(pix);
                diamond->setScaledContents(true) ;
                diamond->setGeometry(i*110+25,j*110+265,100,100);
                diamond->show();
            }
            else if(s[i][j]==2)
            {
                diamond = new QLabel(this);
                QPixmap pix ( ":/images/2.png");
                diamond->setPixmap(pix);
                diamond->setScaledContents(true) ;
                diamond->setGeometry(i*110+25,j*110+265,100,100);
                diamond->show();
            }
            else if(s[i][j]==4)
            {
                diamond = new QLabel(this);
                QPixmap pix ( ":/images/4.png");
                diamond->setPixmap(pix);
                diamond->setScaledContents(true) ;
                diamond->setGeometry(i*110+25,j*110+265,100,100);
                diamond->show();
            }
            else if(s[i][j]==8)
            {
                diamond = new QLabel(this);
                QPixmap pix ( ":/images/8.png");
                diamond->setPixmap(pix);
                diamond->setScaledContents(true) ;
                diamond->setGeometry(i*110+25,j*110+265,100,100);
                diamond->show();
            }
            else if(s[i][j]==16)
            {
                diamond = new QLabel(this);
                QPixmap pix ( ":/images/16.png");
                diamond->setPixmap(pix);
                diamond->setScaledContents(true) ;
                diamond->setGeometry(i*110+25,j*110+265,100,100);
                diamond->show();
            }
            else if(s[i][j]==32)
            {
                diamond = new QLabel(this);
                QPixmap pix ( ":/images/32.png");
                diamond->setPixmap(pix);
                diamond->setScaledContents(true) ;
                diamond->setGeometry(i*110+25,j*110+265,100,100);
                diamond->show();
            }
            else if(s[i][j]==64)
            {
                diamond = new QLabel(this);
                QPixmap pix ( ":/images/64.png");
                diamond->setPixmap(pix);
                diamond->setScaledContents(true) ;
                diamond->setGeometry(i*110+25,j*110+265,100,100);
                diamond->show();
            }
            else if(s[i][j]==128)
            {
                diamond = new QLabel(this);
                QPixmap pix ( ":/images/128.png");
                diamond->setPixmap(pix);
                diamond->setScaledContents(true) ;
                diamond->setGeometry(i*110+25,j*110+265,100,100);
                diamond->show();
            }
            else if(s[i][j]==256)
            {
                diamond = new QLabel(this);
                QPixmap pix ( ":/images/256.png");
                diamond->setPixmap(pix);
                diamond->setScaledContents(true) ;
                diamond->setGeometry(i*110+25,j*110+265,100,100);
                diamond->show();
            }
            else if(s[i][j]==512)
            {
                diamond = new QLabel(this);
                QPixmap pix ( ":/images/512.png");
                diamond->setPixmap(pix);
                diamond->setScaledContents(true) ;
                diamond->setGeometry(i*110+25,j*110+265,100,100);
                diamond->show();
            }
            else if(s[i][j]==1024)
            {
                diamond = new QLabel(this);
                QPixmap pix ( ":/images/1024.png");
                diamond->setPixmap(pix);
                diamond->setScaledContents(true) ;
                diamond->setGeometry(i*110+25,j*110+265,100,100);
                diamond->show();
            }
            else if(s[i][j]==2048)
            {
                diamond = new QLabel(this);
                QPixmap pix ( ":/images/2048.png");
                diamond->setPixmap(pix);
                diamond->setScaledContents(true) ;
                diamond->setGeometry(i*110+25,j*110+265,100,100);
                diamond->show();
            }

        }
    }

}

void startgame::keyPressEvent(QKeyEvent *event)
{


    switch (event->key()) {
    case Qt::Key_W:
        PressUp();
        break;
    case Qt::Key_S:
        PressDown();
        break;
    case Qt::Key_A:
        PressLeft();
        break;
    case Qt::Key_D:
        PressRight();
        break;
    default:
        break;//忽略其他按钮操作
    }
    myRand();
    update();//强制界面刷新
}


void startgame::PressUp()
{

    //移动
    for(int i=0; i<4; i++)
    {
        for(int j=1; j<4; j++)
        {
           if(s[i][j]==0) continue;
           for(int p=0; p<j; p++)
           {
               //查看前面是否有空格子可移动
               if(s[i][p]==0)
               {
                   s[i][p]=s[i][j];
                   s[i][j]=0;

                   break;
               }
           }
        }
    }
    //相加
    for(int i=0; i<4; i++)
    {
        for(int j=0; j<3; j++)
        {
           if(s[i][j]==s[i][j+1])
           {
               s[i][j]=2*s[i][j];
               s[i][j+1]=0;
               score+=s[i][j];
               for(int p=j+2; p<4; p++)
               {
                   if(p<3)
                   {
                       s[i][p-1]=s[i][p];
                   }
                   else
                   {
                       s[i][p-1]=s[i][p];
                       s[i][p]=0;
                   }
               }
           }

        }
    }
}

void startgame::PressDown()
{
    //移动
    for(int i=3; i>-1; i--)
    {
        for(int j=2; j>-1; j--)
        {
           if(s[i][j]==0) continue;
           for(int p=3; p>j; p--)
           {
               //查看前面是否有空格子可移动
               if(s[i][p]==0)
               {
                   s[i][p]=s[i][j];
                   s[i][j]=0;
                   break;
               }
           }
        }
    }
    //相加
    for(int i=0; i<4; i++)
    {
        for(int j=3; j>0; j--)
        {
           if(s[i][j]==s[i][j-1])
           {
               s[i][j]=2*s[i][j];
               s[i][j-1]=0;
               score+=s[i][j];
               for(int p=j-2; p>-1; p--)
               {
                  if(p>0)
                  {
                      s[i][p+1]=s[i][p];
                  }
                  else
                  {
                      s[i][p+1]=s[i][p];
                      s[i][p]=0;
                  }
               }
           }

        }
    }
}

void startgame::PressLeft()
{
    //移动
    for(int j=0; j<4; j++)
    {
        for(int i=1; i<4; i++)
        {
           if(s[i][j]==0) continue;
           for(int p=0; p<i; p++)
           {
               //查看前面是否有空格子可移动
               if(s[p][j]==0)
               {
                   s[p][j]=s[i][j];
                   s[i][j]=0;
                   break;
               }
           }
        }
    }
    //相加
    for(int j=0; j<4; j++)
    {
        for(int i=0; i<3; i++)
        {
           if(s[i][j]==s[i+1][j])
           {
               s[i][j]=2*s[i][j];
               s[i+1][j]=0;
               score+=s[i][j];
               for(int p=i+2; p<4; p++)
               {
                  if(p<3)
                  {
                      s[p-1][j]=s[p][j];
                  }
                  else
                  {
                      s[p-1][j]=s[p][j];
                      s[p][j]=0;
                  }
               }
           }

        }
    }
}

void startgame::PressRight()
{
    //移动
    for(int j=3; j>-1; j--)
    {
        for(int i=2; i>-1; i--)
        {
           if(s[i][j]==0) continue;
           for(int p=3; p>i; p--)
           {
               //查看前面是否有空格子可移动
               if(s[p][j]==0)
               {
                   s[p][j]=s[i][j];
                   s[i][j]=0;
                   break;
               }
           }
        }
    }
    //相加
    for(int j=0; j<4; j++)
    {
        for(int i=3; i>0; i--)
        {
           if(s[i][j]==s[i-1][j])
           {
               s[i][j]=2*s[i][j];
               s[i-1][j]=0;
               score+=s[i][j];
               for(int p=i-2; p>-1; p--)
               {
                  if(p==1)
                  {
                      s[p+1][j]=s[p][j];
                  }
                  else
                  {
                      s[p+1][j]=s[p][j];
                      s[p][j]=0;
                  }
               }
           }

        }
    }
}

void startgame::myRand()
{
   //首先找出空白格子
   //找出空几个格子

    struct Ns n[16];
    int ni=0;
    for (int i=0; i<4; i++)
    {
        for(int j=0;j<4;j++)
        {
            if(s[i][j]==0)
            {
                n[ni].i=i;
                n[ni].j=j;
                ni++;
            }

        }
    }
    //判断游戏是否结束
    if(ni==0)
    {
        for (int i=0; i<4; i++)
        {
            for(int j=0;j<3;j++)
            {
                if(s[i][j]==s[i][j+1])
                {
                   return;
                }
            }
        }
        for (int j=0; j<4; j++)
        {
            for(int i=0;i<3;i++)
            {
                if(s[i][j]==s[i+1][j])
                {
                   return;
                }
            }
        }
        endscore=score;
        QTextStream cin(stdin,  QIODevice::ReadOnly);

        QTextStream cout(stdout,  QIODevice::WriteOnly);


        QFile r("D:/Qt/2048beta/list.txt");
        if(!r.open(QIODevice::ReadOnly | QIODevice::Text))
        {
            cout << "Open failed." << Qt::endl;

        }
        Person person[10];
        QString line1[10];
        QTextStream txtInput(&r);
        while(!txtInput.atEnd())
        {

              QTextStream in(&r);  //用文件构造流

              for(int j=0;j<2;j++)
              {
                  if(j==0)
                  {
                      for(int i=0;i<10;i++)
                      {
                          line1[i]=in.readLine();//循环读取下行

                         person[i].feng=line1[i].toInt();


                      }
                  }
                  if(j==1)
                  {
                      for(int i=0;i<10;i++)
                      {
                          line1[i]=in.readLine();//循环读取下行


                          person[i].name=line1[i];
                      }
                  }

              }


        }

        r.close();



        for(int i=0;i<10;i++)
        {
            if(endscore>person[i].feng)
            {

                rank=i;
                classify=1;
                record *rec = new record(); //新建父界面的对象,将Widget界面显示出来
                this->close(); //关闭当前界面
                rec->show(); //显示新 界面
                return;

            }

        }

            gameover *over = new gameover();
            this->close();
            over->show();
            return ;



    }
    for (int i=0; i<4; i++)
    {
        for(int j=0;j<4;j++)
        {
            if(s[i][j]==2048)
            {
               victory *vic = new victory();
               this->close();
               vic->show();
                break;

            }

        }
    }
    //随机生成2或4
    int  k = qrand()%3;            //获取0~3的随机数
    if(k == 0 || k == 1)
    {
        int rand=qrand()%ni;
        s[n[rand].i][n[rand].j]=2;
    }
    else if(k == 2 || k == 3)
    {
        int rand=qrand()%ni;
        s[n[rand].i][n[rand].j]=4;
    }


}

void startgame::on_pushButton_2_clicked()
{

       Widget *main = new Widget(); //新建父界面的对象,将Widget界面显示出来
        this->close(); //关闭当前界面
        main->show(); //显示父 界面
}


void startgame::on_pushButton_clicked()
{
    for(int i=0; i<4; i++)
    {
        for(int j=0; j<4; j++)
        {
            s[i][j]=0;
        }
    }
     int randi=qrand()%4;
     int randj=qrand()%4;
     s[randi][randj]=2;
     update();
}

 先用QPixmap方式实现格子,然后for双循环放格子

diamond->setGeometry(i*110+25,j*110+265,100,100);

前两个数据是x轴y轴,后两个数据是长宽。

void startgame::paintEvent(QPaintEvent *)
{
    QPainter p(this);
    p.setBrush(Qt::blue);
    p.setFont(QFont("微软雅黑",20,700,false));
    ui->label_3->setText("分数:\n"+QString::number(score));


    //格子的实现
    for(int i=0; i<4; i++)
    {
        for(int j=0; j<4; j++)
        {
            p.setPen(Qt::transparent);
            if(s[i][j]==0)
            {

                diamond = new QLabel(this);
                QPixmap pix ( ":/images/0.png");
                diamond->setPixmap(pix);
                diamond->setScaledContents(true) ;
                diamond->setGeometry(i*110+25,j*110+265,100,100);
                diamond->show();
            }
            else if(s[i][j]==2)
            {
                diamond = new QLabel(this);
                QPixmap pix ( ":/images/2.png");
                diamond->setPixmap(pix);
                diamond->setScaledContents(true) ;
                diamond->setGeometry(i*110+25,j*110+265,100,100);
                diamond->show();
            }
            else if(s[i][j]==4)
            {
                diamond = new QLabel(this);
                QPixmap pix ( ":/images/4.png");
                diamond->setPixmap(pix);
                diamond->setScaledContents(true) ;
                diamond->setGeometry(i*110+25,j*110+265,100,100);
                diamond->show();
            }
            else if(s[i][j]==8)
            {
                diamond = new QLabel(this);
                QPixmap pix ( ":/images/8.png");
                diamond->setPixmap(pix);
                diamond->setScaledContents(true) ;
                diamond->setGeometry(i*110+25,j*110+265,100,100);
                diamond->show();
            }
            else if(s[i][j]==16)
            {
                diamond = new QLabel(this);
                QPixmap pix ( ":/images/16.png");
                diamond->setPixmap(pix);
                diamond->setScaledContents(true) ;
                diamond->setGeometry(i*110+25,j*110+265,100,100);
                diamond->show();
            }
            else if(s[i][j]==32)
            {
                diamond = new QLabel(this);
                QPixmap pix ( ":/images/32.png");
                diamond->setPixmap(pix);
                diamond->setScaledContents(true) ;
                diamond->setGeometry(i*110+25,j*110+265,100,100);
                diamond->show();
            }
            else if(s[i][j]==64)
            {
                diamond = new QLabel(this);
                QPixmap pix ( ":/images/64.png");
                diamond->setPixmap(pix);
                diamond->setScaledContents(true) ;
                diamond->setGeometry(i*110+25,j*110+265,100,100);
                diamond->show();
            }
            else if(s[i][j]==128)
            {
                diamond = new QLabel(this);
                QPixmap pix ( ":/images/128.png");
                diamond->setPixmap(pix);
                diamond->setScaledContents(true) ;
                diamond->setGeometry(i*110+25,j*110+265,100,100);
                diamond->show();
            }
            else if(s[i][j]==256)
            {
                diamond = new QLabel(this);
                QPixmap pix ( ":/images/256.png");
                diamond->setPixmap(pix);
                diamond->setScaledContents(true) ;
                diamond->setGeometry(i*110+25,j*110+265,100,100);
                diamond->show();
            }
            else if(s[i][j]==512)
            {
                diamond = new QLabel(this);
                QPixmap pix ( ":/images/512.png");
                diamond->setPixmap(pix);
                diamond->setScaledContents(true) ;
                diamond->setGeometry(i*110+25,j*110+265,100,100);
                diamond->show();
            }
            else if(s[i][j]==1024)
            {
                diamond = new QLabel(this);
                QPixmap pix ( ":/images/1024.png");
                diamond->setPixmap(pix);
                diamond->setScaledContents(true) ;
                diamond->setGeometry(i*110+25,j*110+265,100,100);
                diamond->show();
            }
            else if(s[i][j]==2048)
            {
                diamond = new QLabel(this);
                QPixmap pix ( ":/images/2048.png");
                diamond->setPixmap(pix);
                diamond->setScaledContents(true) ;
                diamond->setGeometry(i*110+25,j*110+265,100,100);
                diamond->show();
            }

        }
    }

}

利用keyPressEvent捕捉键盘事件,实现上下左右的移动。

参考b站视频Qt_2048教学 8.4录屏_哔哩哔哩_bilibili

void startgame::keyPressEvent(QKeyEvent *event)
{


    switch (event->key()) {
    case Qt::Key_W:
        PressUp();
        break;
    case Qt::Key_S:
        PressDown();
        break;
    case Qt::Key_A:
        PressLeft();
        break;
    case Qt::Key_D:
        PressRight();
        break;
    default:
        break;//忽略其他按钮操作
    }
    myRand();
    update();//强制界面刷新
}


void startgame::PressUp()
{

    //移动
    for(int i=0; i<4; i++)
    {
        for(int j=1; j<4; j++)
        {
           if(s[i][j]==0) continue;
           for(int p=0; p<j; p++)
           {
               //查看前面是否有空格子可移动
               if(s[i][p]==0)
               {
                   s[i][p]=s[i][j];
                   s[i][j]=0;

                   break;
               }
           }
        }
    }
    //相加
    for(int i=0; i<4; i++)
    {
        for(int j=0; j<3; j++)
        {
           if(s[i][j]==s[i][j+1])
           {
               s[i][j]=2*s[i][j];
               s[i][j+1]=0;
               score+=s[i][j];
               for(int p=j+2; p<4; p++)
               {
                   if(p<3)
                   {
                       s[i][p-1]=s[i][p];
                   }
                   else
                   {
                       s[i][p-1]=s[i][p];
                       s[i][p]=0;
                   }
               }
           }

        }
    }
}

void startgame::PressDown()
{
    //移动
    for(int i=3; i>-1; i--)
    {
        for(int j=2; j>-1; j--)
        {
           if(s[i][j]==0) continue;
           for(int p=3; p>j; p--)
           {
               //查看前面是否有空格子可移动
               if(s[i][p]==0)
               {
                   s[i][p]=s[i][j];
                   s[i][j]=0;
                   break;
               }
           }
        }
    }
    //相加
    for(int i=0; i<4; i++)
    {
        for(int j=3; j>0; j--)
        {
           if(s[i][j]==s[i][j-1])
           {
               s[i][j]=2*s[i][j];
               s[i][j-1]=0;
               score+=s[i][j];
               for(int p=j-2; p>-1; p--)
               {
                  if(p>0)
                  {
                      s[i][p+1]=s[i][p];
                  }
                  else
                  {
                      s[i][p+1]=s[i][p];
                      s[i][p]=0;
                  }
               }
           }

        }
    }
}

void startgame::PressLeft()
{
    //移动
    for(int j=0; j<4; j++)
    {
        for(int i=1; i<4; i++)
        {
           if(s[i][j]==0) continue;
           for(int p=0; p<i; p++)
           {
               //查看前面是否有空格子可移动
               if(s[p][j]==0)
               {
                   s[p][j]=s[i][j];
                   s[i][j]=0;
                   break;
               }
           }
        }
    }
    //相加
    for(int j=0; j<4; j++)
    {
        for(int i=0; i<3; i++)
        {
           if(s[i][j]==s[i+1][j])
           {
               s[i][j]=2*s[i][j];
               s[i+1][j]=0;
               score+=s[i][j];
               for(int p=i+2; p<4; p++)
               {
                  if(p<3)
                  {
                      s[p-1][j]=s[p][j];
                  }
                  else
                  {
                      s[p-1][j]=s[p][j];
                      s[p][j]=0;
                  }
               }
           }

        }
    }
}

void startgame::PressRight()
{
    //移动
    for(int j=3; j>-1; j--)
    {
        for(int i=2; i>-1; i--)
        {
           if(s[i][j]==0) continue;
           for(int p=3; p>i; p--)
           {
               //查看前面是否有空格子可移动
               if(s[p][j]==0)
               {
                   s[p][j]=s[i][j];
                   s[i][j]=0;
                   break;
               }
           }
        }
    }
    //相加
    for(int j=0; j<4; j++)
    {
        for(int i=3; i>0; i--)
        {
           if(s[i][j]==s[i-1][j])
           {
               s[i][j]=2*s[i][j];
               s[i-1][j]=0;
               score+=s[i][j];
               for(int p=i-2; p>-1; p--)
               {
                  if(p==1)
                  {
                      s[p+1][j]=s[p][j];
                  }
                  else
                  {
                      s[p+1][j]=s[p][j];
                      s[p][j]=0;
                  }
               }
           }

        }
    }
}

判断游戏是否结束,或者胜利,或者打破新记录

其中QFile是我用来写排行榜的,不用的可忽视,之用判断游戏是否结束。

void startgame::myRand()
{
   //首先找出空白格子
   //找出空几个格子

    struct Ns n[16];
    int ni=0;
    for (int i=0; i<4; i++)
    {
        for(int j=0;j<4;j++)
        {
            if(s[i][j]==0)
            {
                n[ni].i=i;
                n[ni].j=j;
                ni++;
            }

        }
    }
    //判断游戏是否结束
    if(ni==0)
    {
        for (int i=0; i<4; i++)
        {
            for(int j=0;j<3;j++)
            {
                if(s[i][j]==s[i][j+1])
                {
                   return;
                }
            }
        }
        for (int j=0; j<4; j++)
        {
            for(int i=0;i<3;i++)
            {
                if(s[i][j]==s[i+1][j])
                {
                   return;
                }
            }
        }
        endscore=score;
        QTextStream cin(stdin,  QIODevice::ReadOnly);

        QTextStream cout(stdout,  QIODevice::WriteOnly);


        QFile r("D:/Qt/2048beta/list.txt");
        if(!r.open(QIODevice::ReadOnly | QIODevice::Text))
        {
            cout << "Open failed." << Qt::endl;

        }
        Person person[10];
        QString line1[10];
        QTextStream txtInput(&r);
        while(!txtInput.atEnd())
        {

              QTextStream in(&r);  //用文件构造流

              for(int j=0;j<2;j++)
              {
                  if(j==0)
                  {
                      for(int i=0;i<10;i++)
                      {
                          line1[i]=in.readLine();//循环读取下行

                         person[i].feng=line1[i].toInt();


                      }
                  }
                  if(j==1)
                  {
                      for(int i=0;i<10;i++)
                      {
                          line1[i]=in.readLine();//循环读取下行


                          person[i].name=line1[i];
                      }
                  }

              }


        }

        r.close();



        for(int i=0;i<10;i++)
        {
            if(endscore>person[i].feng)
            {

                rank=i;
                classify=1;
                record *rec = new record(); //新建父界面的对象,将Widget界面显示出来
                this->close(); //关闭当前界面
                rec->show(); //显示新 界面
                return;

            }

        }

            gameover *over = new gameover();
            this->close();
            over->show();
            return ;



    }
    for (int i=0; i<4; i++)
    {
        for(int j=0;j<4;j++)
        {
            if(s[i][j]==2048)
            {
               victory *vic = new victory();
               this->close();
               vic->show();
                break;

            }

        }
    }
    //随机生成2或4
    int  k = qrand()%3;            //获取0~3的随机数
    if(k == 0 || k == 1)
    {
        int rand=qrand()%ni;
        s[n[rand].i][n[rand].j]=2;
    }
    else if(k == 2 || k == 3)
    {
        int rand=qrand()%ni;
        s[n[rand].i][n[rand].j]=4;
    }


}

无尽模式

此模式换汤不换药,只需将贴图方式改为绘画即可,直接上代码

endless.h头文件代码

#ifndef ENDLESS_H
#define ENDLESS_H

#include <QWidget>
#include <QMainWindow>
#include<QPushButton>
#include<QTime>
#include<QPainter>
#include<QKeyEvent>
#include<QMessageBox>
#include<QRandomGenerator>
#include <QtGlobal>
#include<QDebug>

namespace Ui {
class endless;
}

class endless : public QWidget
{
    Q_OBJECT

public:
    explicit endless(QWidget *parent = nullptr);
    ~endless();

public:

    void paintEvent(QPaintEvent *);
    void keyPressEvent(QKeyEvent *event);

    QPushButton *button;
    int s[4][4];
    int score=0;
    //bool state=0;//游戏状态 ture正常运行 false停止

    //wasd操作函数
    void PressUp();
     void PressDown();
      void PressLeft();
       void PressRight();
    //随机生成函数 判断结束函数
      void myRand();
      struct Ns{
          int i;
          int j;
                };
public slots:
    void slotStart();

private slots:
    void on_pushButton_3_clicked();

    void on_pushButton_4_clicked();



private:
    Ui::endless *ui;
};

#endif // ENDLESS_H

endless.cpp代码

#include "endless.h"
#include "ui_endless.h"
#include"widget.h"
#include"gameover.h"
#include"record.h"

extern int rank;
extern int classify;
struct Person
{
    QString name;
    int feng;
};
extern int endscore;
endless::endless(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::endless)
{
    ui->setupUi(this);

    setPalette(QPalette(QColor(251,248,239)));
    setAutoFillBackground(true);
    //初始化

    for(int i=0; i<4; i++)
    {
        for(int j=0; j<4; j++)
        {
            s[i][j]=0;
        }
    }

    for(int i=0; i<4; i++)
    {
        for(int j=0; j<4; j++)
        {
            s[i][j]=0;
        }
    }
     int randi=qrand()%4;
     int randj=qrand()%4;
     s[randi][randj]=2;
     update();
     //最佳成绩从txt文件中获取
     QTextStream cin(stdin,  QIODevice::ReadOnly);

     QTextStream cout(stdout,  QIODevice::WriteOnly);

     int best;
     int line_best[20];

     QFile r("D:/Qt/2048beta/list.txt");
     if(!r.open(QIODevice::ReadOnly | QIODevice::Text))
     {
         cout << "Open failed." << Qt::endl;
     }



     QTextStream txtInput(&r);
     while(!txtInput.atEnd())
     {
           QTextStream in(&r);  //用文件构造流

           for(int i=0;i<11;i++)
           {
               line_best[i]=in.readLine().toInt();
           }

           best=line_best[10];

     }

     r.close();

     ui->label_4->setText("最佳:\n"+QString::number(best));
    //随机种子
    qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));


}


void endless::paintEvent(QPaintEvent *)
{
    QPainter p(this);
    p.setBrush(Qt::blue);

    p.setFont(QFont("微软雅黑",20,700,false));
    ui->label_10->setText("分数:\n"+QString::number(score));



    //格子的实现
    for(int i=0; i<4; i++)
    {
        for(int j=0; j<4; j++)
        {
            p.setPen(Qt::transparent);
            if(s[i][j]==0)
            {
                p.setBrush(QColor(204,192,180));
                p.drawRect(i*110+25,j*110+287,100,100);
            }
            else if(s[i][j]==2)
            {
                p.setBrush(QColor(150,164,139));
                p.drawRect(i*110+25,j*110+287,100,100);
                p.setPen(Qt::black);
                p.setFont(QFont("方正粗黑宋简体",20,700,false));
                //在方块中绘制Text, 并且文本位于中部
                p.drawText(QRect(i*110+25,j*110+287,100,100), QString::number(2), QTextOption(Qt::AlignCenter));
            }
            else if(s[i][j]==4)
            {
                p.setBrush(QColor(105,100,123));
                p.drawRect(i*110+25,j*110+287,100,100);
                p.setPen(Qt::black);
                p.setFont(QFont("方正粗黑宋简体",20,700,false));
                //在方块中绘制Text, 并且文本位于中部
                p.drawText(QRect(i*110+25,j*110+287,100,100), QString::number(4), QTextOption(Qt::AlignCenter));
            }
            else if(s[i][j]==8)
            {
                p.setBrush(QColor(164,108,65));
                p.drawRect(i*110+25,j*110+287,100,100);
                p.setPen(Qt::black);
                p.setFont(QFont("方正粗黑宋简体",20,700,false));
                //在方块中绘制Text, 并且文本位于中部
                p.drawText(QRect(i*110+25,j*110+287,100,100), QString::number(8), QTextOption(Qt::AlignCenter));
            }
            else if(s[i][j]==16)
            {
                p.setBrush(QColor(122,103,71));
                p.drawRect(i*110+25,j*110+287,100,100);
                p.setPen(Qt::black);
                p.setFont(QFont("方正粗黑宋简体",20,700,false));
                //在方块中绘制Text, 并且文本位于中部
                p.drawText(QRect(i*110+25,j*110+287,100,100), QString::number(16), QTextOption(Qt::AlignCenter));
            }
            else if(s[i][j]==32)
            {
                p.setBrush(QColor(160,106,80));
                p.drawRect(i*110+25,j*110+287,100,100);
                p.setPen(Qt::black);
                p.setFont(QFont("方正粗黑宋简体",20,700,false));
                //在方块中绘制Text, 并且文本位于中部
                p.drawText(QRect(i*110+25,j*110+287,100,100), QString::number(32), QTextOption(Qt::AlignCenter));
            }
            else if(s[i][j]==64)
            {
                p.setBrush(QColor(173,174,178));
                p.drawRect(i*110+25,j*110+287,100,100);
                p.setPen(Qt::black);
                p.setFont(QFont("方正粗黑宋简体",20,700,false));
                //在方块中绘制Text, 并且文本位于中部
                p.drawText(QRect(i*110+25,j*110+287,100,100), QString::number(64), QTextOption(Qt::AlignCenter));
            }
            else if(s[i][j]==128)
            {
                p.setBrush(QColor(177,122,125));
                p.drawRect(i*110+25,j*110+287,100,100);
                p.setPen(Qt::black);
                p.setFont(QFont("方正粗黑宋简体",20,700,false));
                //在方块中绘制Text, 并且文本位于中部
                p.drawText(QRect(i*110+25,j*110+287,100,100), QString::number(128), QTextOption(Qt::AlignCenter));
            }
            else if(s[i][j]==256)
            {
                p.setBrush(QColor(146,172,209));
                p.drawRect(i*110+25,j*110+287,100,100);
                p.setPen(Qt::black);
                p.setFont(QFont("方正粗黑宋简体",20,700,false));
                //在方块中绘制Text, 并且文本位于中部
                p.drawText(QRect(i*110+25,j*110+287,100,100), QString::number(256), QTextOption(Qt::AlignCenter));
            }
            else if(s[i][j]==512)
            {
                p.setBrush(QColor(155,144,138));
                p.drawRect(i*110+25,j*110+287,100,100);
                p.setPen(Qt::black);
                p.setFont(QFont("方正粗黑宋简体",20,700,false));
                //在方块中绘制Text, 并且文本位于中部
                p.drawText(QRect(i*110+25,j*110+287,100,100), QString::number(512), QTextOption(Qt::AlignCenter));
            }
            else if(s[i][j]==1024)
            {
                p.setBrush(QColor(144,59,28));
                p.drawRect(i*110+25,j*110+287,100,100);
                p.setPen(Qt::black);
                p.setFont(QFont("方正粗黑宋简体",20,700,false));
                //在方块中绘制Text, 并且文本位于中部
                p.drawText(QRect(i*110+25,j*110+287,100,100), QString::number(1024), QTextOption(Qt::AlignCenter));
            }
            else if(s[i][j]==2048)
            {
                p.setBrush(QColor(149,88,57));
                p.drawRect(i*110+25,j*110+287,100,100);
                p.setPen(Qt::black);
                p.setFont(QFont("方正粗黑宋简体",20,700,false));
                //在方块中绘制Text, 并且文本位于中部
                p.drawText(QRect(i*110+25,j*110+287,100,100), QString::number(2048), QTextOption(Qt::AlignCenter));
            }
            else
            {
                p.setBrush(QColor(150,84,84));
                p.drawRect(i*110+25,j*110+287,100,100);
                p.setPen(Qt::black);
                p.setFont(QFont("方正粗黑宋简体",20,700,false));
                //在方块中绘制Text, 并且文本位于中部
                p.drawText(QRect(i*110+25,j*110+287,100,100), QString::number(s[i][j]), QTextOption(Qt::AlignCenter));
            }

        }
    }

}

void endless::keyPressEvent(QKeyEvent *event)
{


    switch (event->key()) {
    case Qt::Key_W:
        PressUp();
        break;
    case Qt::Key_S:
        PressDown();
        break;
    case Qt::Key_A:
        PressLeft();
        break;
    case Qt::Key_D:
        PressRight();
        break;
    default:
        break;//忽略其他按钮操作
    }
    myRand();
    update();//强制界面刷新
}
void endless::slotStart()
{
    score=1;
    for(int i=0; i<4; i++)
    {
        for(int j=0; j<4; j++)
        {
            s[i][j]=0;
        }
    }
    button->setText("重新游戏");
     int randi=qrand()%4;
     int randj=qrand()%4;
     s[randi][randj]=2;
     update();
}

void endless::PressUp()
{

    //移动
    for(int i=0; i<4; i++)
    {
        for(int j=1; j<4; j++)
        {
           if(s[i][j]==0) continue;
           for(int p=0; p<j; p++)
           {
               //查看前面是否有空格子可移动
               if(s[i][p]==0)
               {
                   s[i][p]=s[i][j];
                   s[i][j]=0;
                   break;
               }
           }
        }
    }
    //相加
    for(int i=0; i<4; i++)
    {
        for(int j=0; j<3; j++)
        {
           if(s[i][j]==s[i][j+1])
           {
               s[i][j]=2*s[i][j];
               s[i][j+1]=0;
               score+=s[i][j];
               for(int p=j+2; p<4; p++)
               {
                   if(p<3)
                   {
                       s[i][p-1]=s[i][p];
                   }
                   else
                   {
                       s[i][p-1]=s[i][p];
                       s[i][p]=0;
                   }
               }
           }

        }
    }
}

void endless::PressDown()
{
    //移动
    for(int i=3; i>-1; i--)
    {
        for(int j=2; j>-1; j--)
        {
           if(s[i][j]==0) continue;
           for(int p=3; p>j; p--)
           {
               //查看前面是否有空格子可移动
               if(s[i][p]==0)
               {
                   s[i][p]=s[i][j];
                   s[i][j]=0;
                   break;
               }
           }
        }
    }
    //相加
    for(int i=0; i<4; i++)
    {
        for(int j=3; j>0; j--)
        {
           if(s[i][j]==s[i][j-1])
           {
               s[i][j]=2*s[i][j];
               s[i][j-1]=0;
               score+=s[i][j];
               for(int p=j-2; p>-1; p--)
               {
                  if(p>0)
                  {
                      s[i][p+1]=s[i][p];
                  }
                  else
                  {
                      s[i][p+1]=s[i][p];
                      s[i][p]=0;
                  }
               }
           }

        }
    }
}

void endless::PressLeft()
{
    //移动
    for(int j=0; j<4; j++)
    {
        for(int i=1; i<4; i++)
        {
           if(s[i][j]==0) continue;
           for(int p=0; p<i; p++)
           {
               //查看前面是否有空格子可移动
               if(s[p][j]==0)
               {
                   s[p][j]=s[i][j];
                   s[i][j]=0;
                   break;
               }
           }
        }
    }
    //相加
    for(int j=0; j<4; j++)
    {
        for(int i=0; i<3; i++)
        {
           if(s[i][j]==s[i+1][j])
           {
               s[i][j]=2*s[i][j];
               s[i+1][j]=0;
               score+=s[i][j];
               for(int p=i+2; p<4; p++)
               {
                  if(p<3)
                  {
                      s[p-1][j]=s[p][j];
                  }
                  else
                  {
                      s[p-1][j]=s[p][j];
                      s[p][j]=0;
                  }
               }
           }

        }
    }
}

void endless::PressRight()
{
    //移动
    for(int j=3; j>-1; j--)
    {
        for(int i=2; i>-1; i--)
        {
           if(s[i][j]==0) continue;
           for(int p=3; p>i; p--)
           {
               //查看前面是否有空格子可移动
               if(s[p][j]==0)
               {
                   s[p][j]=s[i][j];
                   s[i][j]=0;
                   break;
               }
           }
        }
    }
    //相加
    for(int j=0; j<4; j++)
    {
        for(int i=3; i>0; i--)
        {
           if(s[i][j]==s[i-1][j])
           {
               s[i][j]=2*s[i][j];
               s[i-1][j]=0;
               score+=s[i][j];
               for(int p=i-2; p>-1; p--)
               {
                  if(p==1)
                  {
                      s[p+1][j]=s[p][j];
                  }
                  else
                  {
                      s[p+1][j]=s[p][j];
                      s[p][j]=0;
                  }
               }
           }

        }
    }
}

void endless::myRand()
{
   //首先找出空白格子
   //找出空几个格子
    struct Ns n[16];
    int ni=0;
    for (int i=0; i<4; i++)
    {
        for(int j=0;j<4;j++)
        {
            if(s[i][j]==0)
            {
                n[ni].i=i;
                n[ni].j=j;
                ni++;
            }
        }
    }
    //判断游戏是否结束
    if(ni==0)
    {
        for (int i=0; i<4; i++)
        {
            for(int j=0;j<3;j++)
            {
                if(s[i][j]==s[i][j+1])
                {
                   return;
                }
            }
        }
        for (int j=0; j<4; j++)
        {
            for(int i=0;i<3;i++)
            {
                if(s[i][j]==s[i+1][j])
                {
                   return;
                }
            }
        }

        endscore=score;
        QTextStream cin(stdin,  QIODevice::ReadOnly);

        QTextStream cout(stdout,  QIODevice::WriteOnly);


        QFile r("D:/Qt/2048beta/list.txt");
        if(!r.open(QIODevice::ReadOnly | QIODevice::Text))
        {
            cout << "Open failed." << Qt::endl;

        }
        Person person2[45];
        QString line2[45];
        QTextStream txtInput(&r);
        while(!txtInput.atEnd())
        {

              QTextStream in(&r);  //用文件构造流

              for(int j=0;j<2;j++)
              {
                  if(j==0)
                  {
                      for(int i=0;i<40;i++)
                      {
                          line2[i]=in.readLine();//循环读取下行

                         person2[i].feng=line2[i].toInt();


                      }
                  }
                  if(j==1)
                  {
                      for(int i=0;i<40;i++)
                      {
                          line2[i]=in.readLine();//循环读取下行


                          person2[i].name=line2[i];
                      }
                  }

              }


        }

        r.close();



        for(int i=10;i<20;i++)
        {
            if(endscore>person2[i].feng)
            {

                rank=i;
                classify=2;
                record *rec1 = new record(); //新建父界面的对象,将Widget界面显示出来
                this->close(); //关闭当前界面
                rec1->show(); //显示新 界面
                return;

            }

        }


        gameover *over = new gameover();
        this->close();
        over->show();
        return ;

    }
    //随机生成2或4
    int  k = qrand()%3;            //获取0~3的随机数
    if(k == 0 || k == 1)
    {
        int rand=qrand()%ni;
        s[n[rand].i][n[rand].j]=2;
    }
    else if(k == 2 || k == 3)
    {
        int rand=qrand()%ni;
        s[n[rand].i][n[rand].j]=4;
    }


}

endless::~endless()
{
    delete ui;
}

void endless::on_pushButton_3_clicked()
{
    Widget *main = new Widget(); //新建父界面的对象,将Widget界面显示出来
     this->close(); //关闭当前界面
     main->show(); //显示父 界面
}


void endless::on_pushButton_4_clicked()
{
    for(int i=0; i<4; i++)
    {
        for(int j=0; j<4; j++)
        {
            s[i][j]=0;
        }
    }
     int randi=qrand()%4;
     int randj=qrand()%4;
     s[randi][randj]=2;
     update();
}

求学之路模式

就是在前面两种基本模式的基础上进行改进、创新。

玩家从宝宝开始合成,一直合成学神即可胜利,修改无尽模式,改变内容和判断即可。

school.cpp

#ifndef SCHOOL_H
#define SCHOOL_H

#include <QWidget>
#include <QMainWindow>
#include<QPushButton>
#include<QTime>
#include<QPainter>
#include<QKeyEvent>
#include<QMessageBox>
#include<QRandomGenerator>
#include <QtGlobal>
#include<QDebug>
#include <QWidget>

namespace Ui {
class school;
}

class school : public QWidget
{
    Q_OBJECT

public:
    explicit school(QWidget *parent = nullptr);
    ~school();

public:

    void paintEvent(QPaintEvent *);
    void keyPressEvent(QKeyEvent *event);

    QPushButton *button;
    int s[4][4];
    int score=0;
    //bool state=0;//游戏状态 ture正常运行 false停止

    //wasd操作函数
    void PressUp();
     void PressDown();
      void PressLeft();
       void PressRight();
    //随机生成函数 判断结束函数
      void myRand();
      struct Ns{
          int i;
          int j;
                };
public slots:
    void slotStart();

private slots:
    void on_pushButton_3_clicked();

    void on_pushButton_4_clicked();

private:
    Ui::school *ui;
};

#endif // SCHOOL_H

school.cpp

#include "school.h"
#include "ui_school.h"
#include"widget.h"
#include"gameover.h"
#include"record.h"
#include"victory.h"

QString study;
extern int rank;
extern int classify;
struct Person
{
    QString name;
    int feng;
};
extern int endscore;
school::school(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::school)


{

    ui->setupUi(this);

    setPalette(QPalette(QColor(251,248,239)));
    setAutoFillBackground(true);
    //初始化

    for(int i=0; i<4; i++)
    {
        for(int j=0; j<4; j++)
        {
            s[i][j]=0;
        }
    }

    for(int i=0; i<4; i++)
    {
        for(int j=0; j<4; j++)
        {
            s[i][j]=0;
        }
    }
     int randi=qrand()%4;
     int randj=qrand()%4;
     s[randi][randj]=2;
     update();
     //最佳成绩从txt文件中获取
     QTextStream cin(stdin,  QIODevice::ReadOnly);

     QTextStream cout(stdout,  QIODevice::WriteOnly);

     QString best;
     QString line_best[95];

     QFile r("D:/Qt/2048beta/list.txt");
     if(!r.open(QIODevice::ReadOnly | QIODevice::Text))
     {
         cout << "Open failed." << Qt::endl;
     }



     QTextStream txtInput(&r);
     while(!txtInput.atEnd())
     {
           QTextStream in(&r);  //用文件构造流

           for(int i=0;i<90;i++)
           {
               line_best[i]=in.readLine();
           }

           best=line_best[80];

     }

     r.close();

     ui->label_4->setText("最高学历:\n" +best);
    //随机种子
    qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));


}


void school::paintEvent(QPaintEvent *)
{
    QPainter p(this);
    p.setBrush(Qt::blue);

    p.setFont(QFont("微软雅黑",20,700,false));
    ui->label_10->setText("分数:\n"+QString::number(score));



    //格子的实现
    for(int i=0; i<4; i++)
    {
        for(int j=0; j<4; j++)
        {
            p.setPen(Qt::transparent);
            if(s[i][j]==0)
            {
                p.setBrush(QColor(204,192,180));
                p.drawRect(i*110+25,j*110+287,100,100);
            }
            else if(s[i][j]==2)
            {
                p.setBrush(QColor(150,164,139));
                p.drawRect(i*110+25,j*110+287,100,100);
                p.setPen(Qt::black);
                p.setFont(QFont("方正粗黑宋简体",20,700,false));
                //在方块中绘制Text, 并且文本位于中部
                p.drawText(QRect(i*110+25,j*110+287,100,100), "宝宝", QTextOption(Qt::AlignCenter));
            }
            else if(s[i][j]==4)
            {
                p.setBrush(QColor(105,100,123));
                p.drawRect(i*110+25,j*110+287,100,100);
                p.setPen(Qt::black);
                p.setFont(QFont("方正粗黑宋简体",20,700,false));
                //在方块中绘制Text, 并且文本位于中部
                p.drawText(QRect(i*110+25,j*110+287,100,100), "小班", QTextOption(Qt::AlignCenter));
            }
            else if(s[i][j]==8)
            {
                p.setBrush(QColor(164,108,65));
                p.drawRect(i*110+25,j*110+287,100,100);
                p.setPen(Qt::black);
                p.setFont(QFont("方正粗黑宋简体",20,700,false));
                //在方块中绘制Text, 并且文本位于中部
                p.drawText(QRect(i*110+25,j*110+287,100,100), "大班", QTextOption(Qt::AlignCenter));
            }
            else if(s[i][j]==16)
            {
                p.setBrush(QColor(122,103,71));
                p.drawRect(i*110+25,j*110+287,100,100);
                p.setPen(Qt::black);
                p.setFont(QFont("方正粗黑宋简体",20,700,false));
                //在方块中绘制Text, 并且文本位于中部
                p.drawText(QRect(i*110+25,j*110+287,100,100),"学前", QTextOption(Qt::AlignCenter));
            }
            else if(s[i][j]==32)
            {
                p.setBrush(QColor(160,106,80));
                p.drawRect(i*110+25,j*110+287,100,100);
                p.setPen(Qt::black);
                p.setFont(QFont("方正粗黑宋简体",20,700,false));
                //在方块中绘制Text, 并且文本位于中部
                p.drawText(QRect(i*110+25,j*110+287,100,100), "小学", QTextOption(Qt::AlignCenter));
            }
            else if(s[i][j]==64)
            {
                p.setBrush(QColor(173,174,178));
                p.drawRect(i*110+25,j*110+287,100,100);
                p.setPen(Qt::black);
                p.setFont(QFont("方正粗黑宋简体",20,700,false));
                //在方块中绘制Text, 并且文本位于中部
                p.drawText(QRect(i*110+25,j*110+287,100,100), "初中", QTextOption(Qt::AlignCenter));
            }
            else if(s[i][j]==128)
            {
                p.setBrush(QColor(177,122,125));
                p.drawRect(i*110+25,j*110+287,100,100);
                p.setPen(Qt::black);
                p.setFont(QFont("方正粗黑宋简体",20,700,false));
                //在方块中绘制Text, 并且文本位于中部
                p.drawText(QRect(i*110+25,j*110+287,100,100), "高中", QTextOption(Qt::AlignCenter));
            }
            else if(s[i][j]==256)
            {
                p.setBrush(QColor(146,172,209));
                p.drawRect(i*110+25,j*110+287,100,100);
                p.setPen(Qt::black);
                p.setFont(QFont("方正粗黑宋简体",20,700,false));
                //在方块中绘制Text, 并且文本位于中部
                p.drawText(QRect(i*110+25,j*110+287,100,100), "大学", QTextOption(Qt::AlignCenter));
            }
            else if(s[i][j]==512)
            {
                p.setBrush(QColor(155,144,138));
                p.drawRect(i*110+25,j*110+287,100,100);
                p.setPen(Qt::black);
                p.setFont(QFont("方正粗黑宋简体",20,700,false));
                //在方块中绘制Text, 并且文本位于中部
                p.drawText(QRect(i*110+25,j*110+287,100,100), "研究生", QTextOption(Qt::AlignCenter));
            }
            else if(s[i][j]==1024)
            {
                p.setBrush(QColor(144,59,28));
                p.drawRect(i*110+25,j*110+287,100,100);
                p.setPen(Qt::black);
                p.setFont(QFont("方正粗黑宋简体",20,700,false));
                //在方块中绘制Text, 并且文本位于中部
                p.drawText(QRect(i*110+25,j*110+287,100,100), "博士", QTextOption(Qt::AlignCenter));
            }
            else if(s[i][j]==2048)
            {
                p.setBrush(QColor(149,88,57));
                p.drawRect(i*110+25,j*110+287,100,100);
                p.setPen(Qt::black);
                p.setFont(QFont("方正粗黑宋简体",20,700,false));
                //在方块中绘制Text, 并且文本位于中部
                p.drawText(QRect(i*110+25,j*110+287,100,100),"博士后", QTextOption(Qt::AlignCenter));
            }
            else if(s[i][j]==4096)
            {
                p.setBrush(QColor(150,84,84));
                p.drawRect(i*110+25,j*110+287,100,100);
                p.setPen(Qt::black);
                p.setFont(QFont("方正粗黑宋简体",20,700,false));
                //在方块中绘制Text, 并且文本位于中部
                p.drawText(QRect(i*110+25,j*110+287,100,100), "学神", QTextOption(Qt::AlignCenter));
            }

        }
    }

}

void school::keyPressEvent(QKeyEvent *event)
{


    switch (event->key()) {
    case Qt::Key_W:
        PressUp();
        break;
    case Qt::Key_S:
        PressDown();
        break;
    case Qt::Key_A:
        PressLeft();
        break;
    case Qt::Key_D:
        PressRight();
        break;
    default:
        break;//忽略其他按钮操作
    }
    myRand();
    update();//强制界面刷新
}
void school::slotStart()
{
    score=1;
    for(int i=0; i<4; i++)
    {
        for(int j=0; j<4; j++)
        {
            s[i][j]=0;
        }
    }
    button->setText("重新游戏");
     int randi=qrand()%4;
     int randj=qrand()%4;
     s[randi][randj]=2;
     update();
}

void school::PressUp()
{

    //移动
    for(int i=0; i<4; i++)
    {
        for(int j=1; j<4; j++)
        {
           if(s[i][j]==0) continue;
           for(int p=0; p<j; p++)
           {
               //查看前面是否有空格子可移动
               if(s[i][p]==0)
               {
                   s[i][p]=s[i][j];
                   s[i][j]=0;
                   break;
               }
           }
        }
    }
    //相加
    for(int i=0; i<4; i++)
    {
        for(int j=0; j<3; j++)
        {
           if(s[i][j]==s[i][j+1])
           {
               s[i][j]=2*s[i][j];
               s[i][j+1]=0;
               score+=s[i][j];
               for(int p=j+2; p<4; p++)
               {
                   if(p<3)
                   {
                       s[i][p-1]=s[i][p];
                   }
                   else
                   {
                       s[i][p-1]=s[i][p];
                       s[i][p]=0;
                   }
               }
           }

        }
    }
}

void school::PressDown()
{
    //移动
    for(int i=3; i>-1; i--)
    {
        for(int j=2; j>-1; j--)
        {
           if(s[i][j]==0) continue;
           for(int p=3; p>j; p--)
           {
               //查看前面是否有空格子可移动
               if(s[i][p]==0)
               {
                   s[i][p]=s[i][j];
                   s[i][j]=0;
                   break;
               }
           }
        }
    }
    //相加
    for(int i=0; i<4; i++)
    {
        for(int j=3; j>0; j--)
        {
           if(s[i][j]==s[i][j-1])
           {
               s[i][j]=2*s[i][j];
               s[i][j-1]=0;
               score+=s[i][j];
               for(int p=j-2; p>-1; p--)
               {
                  if(p>0)
                  {
                      s[i][p+1]=s[i][p];
                  }
                  else
                  {
                      s[i][p+1]=s[i][p];
                      s[i][p]=0;
                  }
               }
           }

        }
    }
}

void school::PressLeft()
{
    //移动
    for(int j=0; j<4; j++)
    {
        for(int i=1; i<4; i++)
        {
           if(s[i][j]==0) continue;
           for(int p=0; p<i; p++)
           {
               //查看前面是否有空格子可移动
               if(s[p][j]==0)
               {
                   s[p][j]=s[i][j];
                   s[i][j]=0;
                   break;
               }
           }
        }
    }
    //相加
    for(int j=0; j<4; j++)
    {
        for(int i=0; i<3; i++)
        {
           if(s[i][j]==s[i+1][j])
           {
               s[i][j]=2*s[i][j];
               s[i+1][j]=0;
               score+=s[i][j];
               for(int p=i+2; p<4; p++)
               {
                  if(p<3)
                  {
                      s[p-1][j]=s[p][j];
                  }
                  else
                  {
                      s[p-1][j]=s[p][j];
                      s[p][j]=0;
                  }
               }
           }

        }
    }
}

void school::PressRight()
{
    //移动
    for(int j=3; j>-1; j--)
    {
        for(int i=2; i>-1; i--)
        {
           if(s[i][j]==0) continue;
           for(int p=3; p>i; p--)
           {
               //查看前面是否有空格子可移动
               if(s[p][j]==0)
               {
                   s[p][j]=s[i][j];
                   s[i][j]=0;
                   break;
               }
           }
        }
    }
    //相加
    for(int j=0; j<4; j++)
    {
        for(int i=3; i>0; i--)
        {
           if(s[i][j]==s[i-1][j])
           {
               s[i][j]=2*s[i][j];
               s[i-1][j]=0;
               score+=s[i][j];
               for(int p=i-2; p>-1; p--)
               {
                  if(p==1)
                  {
                      s[p+1][j]=s[p][j];
                  }
                  else
                  {
                      s[p+1][j]=s[p][j];
                      s[p][j]=0;
                  }
               }
           }

        }
    }
}

void school::myRand()
{
   //首先找出空白格子
   //找出空几个格子

    struct Ns n[16];
    int ni=0;
    for (int i=0; i<4; i++)
    {
        for(int j=0;j<4;j++)
        {
            if(s[i][j]==0)
            {
                n[ni].i=i;
                n[ni].j=j;
                ni++;
            }
        }
    }
    //判断游戏是否结束
    if(ni==0)
    {
        for (int i=0; i<4; i++)
        {
            for(int j=0;j<3;j++)
            {
                if(s[i][j]==s[i][j+1])
                {
                   return;
                }
            }
        }
        for (int j=0; j<4; j++)
        {
            for(int i=0;i<3;i++)
            {
                if(s[i][j]==s[i+1][j])
                {
                   return;
                }
            }
        }

        //找出最高学历
        int temp=0;
        for (int i=0; i<4; i++)
        {
            for(int j=0;j<4;j++)
            {
                if(s[i][j]>temp)
                {
                  temp=s[i][j];
                }

            }
        }
        switch (temp) {
        case 2:
            study="宝宝";
            break;
        case 4:
            study="小班";
            break;
        case 8:
            study="大班";
            break;
        case 16:
            study="学前";
            break;
        case 32:
            study="小学";
            break;
        case 64:
            study="初中";
            break;
        case 128:
            study="高中";
            break;
        case 256:
            study="大学";
            break;
        case 512:
            study="研究生";
            break;
        case 1024:
            study="博士";
            break;
        case 2048:
            study="博士后";
            break;
        case 4096:
            study="学神";
            break;
        default:
            break;
        }

        endscore=score;
        QTextStream cin(stdin,  QIODevice::ReadOnly);

        QTextStream cout(stdout,  QIODevice::WriteOnly);


        QFile r("D:/Qt/2048beta/list.txt");
        if(!r.open(QIODevice::ReadOnly | QIODevice::Text))
        {
            cout << "Open failed." << Qt::endl;

        }
        Person person2[45];
        QString line2[45];
        QTextStream txtInput(&r);
        while(!txtInput.atEnd())
        {

              QTextStream in(&r);  //用文件构造流

              for(int j=0;j<2;j++)
              {
                  if(j==0)
                  {
                      for(int i=0;i<40;i++)
                      {
                          line2[i]=in.readLine();//循环读取下行

                         person2[i].feng=line2[i].toInt();


                      }
                  }
                  if(j==1)
                  {
                      for(int i=0;i<40;i++)
                      {
                          line2[i]=in.readLine();//循环读取下行


                          person2[i].name=line2[i];
                      }
                  }

              }
        }

        r.close();



        for(int i=20;i<30;i++)
        {
            if(endscore>person2[i].feng)
            {

                rank=i;
                classify=3;
                record *rec1 = new record(); //新建父界面的对象,将Widget界面显示出来
                this->close(); //关闭当前界面
                rec1->show(); //显示新 界面
                return;

            }

        }


        gameover *over = new gameover();
        this->close();
        over->show();
        return ;

    }
    for (int i=0; i<4; i++)
    {
        for(int j=0;j<4;j++)
        {
            if(s[i][j]==4096)
            {
                classify=3;
               victory *vic = new victory();
               this->close();
               vic->show();
                break;

            }

        }
    }
    //随机生成2或4
    int  k = qrand()%3;            //获取0~3的随机数
    if(k == 0 || k == 1)
    {
        int rand=qrand()%ni;
        s[n[rand].i][n[rand].j]=2;
    }
    else if(k == 2 || k == 3)
    {
        int rand=qrand()%ni;
        s[n[rand].i][n[rand].j]=4;
    }


}

void school::on_pushButton_3_clicked()
{
    Widget *main = new Widget(); //新建父界面的对象,将Widget界面显示出来
     this->close(); //关闭当前界面
     main->show(); //显示父 界面
}


void school::on_pushButton_4_clicked()
{
    for(int i=0; i<4; i++)
    {
        for(int j=0; j<4; j++)
        {
            s[i][j]=0;
        }
    }
     int randi=qrand()%4;
     int randj=qrand()%4;
     s[randi][randj]=2;
     update();
}


school::~school()
{
    delete ui;
}


中国的诞生

大同小异,修改于经典模式,改变贴图和判断条件即可

china.h

#ifndef CHINA_H
#define CHINA_H

#include <QMainWindow>
#include<QPushButton>
#include<QTime>
#include<QPainter>
#include<QKeyEvent>
#include<QMessageBox>
#include<QRandomGenerator>
#include <QtGlobal>
#include<QDebug>
#include <QWidget>
#include<QLabel>
#include<QPixmap>
#include <QWidget>

namespace Ui {
class china;
}

class china : public QWidget
{
    Q_OBJECT

public:
    explicit china(QWidget *parent = nullptr);
    ~china();
public:

    void paintEvent(QPaintEvent *);
    void keyPressEvent(QKeyEvent *event);

    QPushButton *button;
    int s[4][4];
    int score=0;

    //bool state=0;//游戏状态 ture正常运行 false停止

    //wasd操作函数
    void PressUp();
     void PressDown();
      void PressLeft();
       void PressRight();
    //随机生成函数 判断结束函数
      void myRand();
      struct Ns{
          int i;
          int j;
      };

private slots:


      void on_pushButton_2_clicked();

      void on_pushButton_clicked();

private:
    Ui::china *ui;
    QLabel *diamond;
};

#endif // CHINA_H

china.cpp

#include "china.h"
#include "ui_china.h"

#include"widget.h"
#include"gameover.h"
#include"victory.h"
#include"record.h"

QString dynasty;
extern int rank;
extern int classify;
extern int endscore;
struct Person
{
    QString name;
    int feng;
};

china::china(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::china)
{
    ui->setupUi(this);

    setPalette(QPalette(QColor(251,248,239)));
    setAutoFillBackground(true);
    //初始化
    for(int i=0; i<4; i++)
    {
        for(int j=0; j<4; j++)
        {
            s[i][j]=0;
        }
    }
     int randi=qrand()%4;
     int randj=qrand()%4;
     s[randi][randj]=2;
     update();

     QTextStream cin(stdin,  QIODevice::ReadOnly);

     QTextStream cout(stdout,  QIODevice::WriteOnly);

     QString best;

     QString line_best[100];

     QFile r("D:/Qt/2048beta/list.txt");
     if(!r.open(QIODevice::ReadOnly | QIODevice::Text))
     {
         cout << "Open failed." << Qt::endl;
     }


     QTextStream txtInput(&r);
     while(!txtInput.atEnd())
     {
           QTextStream in(&r);  //用文件构造流


           for(int i=0;i<100;i++)
           {
               line_best[i]=in.readLine();
           }

           best=line_best[90];

     }

     r.close();

     ui->label_4->setText("最高朝代:\n"+best);
    //随机种子
    qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));

}



void china::paintEvent(QPaintEvent *)
{
    QPainter p(this);
    p.setBrush(Qt::blue);
    p.setFont(QFont("微软雅黑",20,700,false));
    ui->label_3->setText("分数:\n"+QString::number(score));


    //格子的实现
    for(int i=0; i<4; i++)
    {
        for(int j=0; j<4; j++)
        {
            p.setPen(Qt::transparent);
            if(s[i][j]==0)
            {

                diamond = new QLabel(this);
                QPixmap pix ( ":/images/0.png");
                diamond->setPixmap(pix);
                diamond->setScaledContents(true) ;
                diamond->setGeometry(i*110+25,j*110+300,100,100);
                diamond->show();
            }
            else if(s[i][j]==2)
            {
                diamond = new QLabel(this);
                QPixmap pix ( ":/images/xia.png");
                diamond->setPixmap(pix);
                diamond->setScaledContents(true) ;
                diamond->setGeometry(i*110+25,j*110+300,100,100);
                diamond->show();
            }
            else if(s[i][j]==4)
            {
                diamond = new QLabel(this);
                QPixmap pix ( ":/images/shang.png");
                diamond->setPixmap(pix);
                diamond->setScaledContents(true) ;
                diamond->setGeometry(i*110+25,j*110+300,100,100);
                diamond->show();
            }
            else if(s[i][j]==8)
            {
                diamond = new QLabel(this);
                QPixmap pix ( ":/images/zhou.png");
                diamond->setPixmap(pix);
                diamond->setScaledContents(true) ;
                diamond->setGeometry(i*110+25,j*110+300,100,100);
                diamond->show();
            }
            else if(s[i][j]==16)
            {
                diamond = new QLabel(this);
                QPixmap pix ( ":/images/qin.png");
                diamond->setPixmap(pix);
                diamond->setScaledContents(true) ;
                diamond->setGeometry(i*110+25,j*110+300,100,100);
                diamond->show();
            }
            else if(s[i][j]==32)
            {
                diamond = new QLabel(this);
                QPixmap pix ( ":/images/hang.png");
                diamond->setPixmap(pix);
                diamond->setScaledContents(true) ;
                diamond->setGeometry(i*110+25,j*110+300,100,100);
                diamond->show();
            }
            else if(s[i][j]==64)
            {
                diamond = new QLabel(this);
                QPixmap pix ( ":/images/sanguo.png");
                diamond->setPixmap(pix);
                diamond->setScaledContents(true) ;
                diamond->setGeometry(i*110+25,j*110+300,100,100);
                diamond->show();
            }
            else if(s[i][j]==128)
            {
                diamond = new QLabel(this);
                QPixmap pix ( ":/images/jing.png");
                diamond->setPixmap(pix);
                diamond->setScaledContents(true) ;
                diamond->setGeometry(i*110+25,j*110+300,100,100);
                diamond->show();
            }
            else if(s[i][j]==256)
            {
                diamond = new QLabel(this);
                QPixmap pix ( ":/images/nanbei.png");
                diamond->setPixmap(pix);
                diamond->setScaledContents(true) ;
                diamond->setGeometry(i*110+25,j*110+300,100,100);
                diamond->show();
            }
            else if(s[i][j]==512)
            {
                diamond = new QLabel(this);
                QPixmap pix ( ":/images/sui.png");
                diamond->setPixmap(pix);
                diamond->setScaledContents(true) ;
                diamond->setGeometry(i*110+25,j*110+300,100,100);
                diamond->show();
            }
            else if(s[i][j]==1024)
            {
                diamond = new QLabel(this);
                QPixmap pix ( ":/images/tang.png");
                diamond->setPixmap(pix);
                diamond->setScaledContents(true) ;
                diamond->setGeometry(i*110+25,j*110+300,100,100);
                diamond->show();
            }
            else if(s[i][j]==2048)
            {
                diamond = new QLabel(this);
                QPixmap pix ( ":/images/song.png");
                diamond->setPixmap(pix);
                diamond->setScaledContents(true) ;
                diamond->setGeometry(i*110+25,j*110+300,100,100);
                diamond->show();
            }
            else if(s[i][j]==4096)
            {
                diamond = new QLabel(this);
                QPixmap pix ( ":/images/yuan.png");
                diamond->setPixmap(pix);
                diamond->setScaledContents(true) ;
                diamond->setGeometry(i*110+25,j*110+300,100,100);
                diamond->show();
            }
            else if(s[i][j]==8192)
            {
                diamond = new QLabel(this);
                QPixmap pix ( ":/images/ming.png");
                diamond->setPixmap(pix);
                diamond->setScaledContents(true) ;
                diamond->setGeometry(i*110+25,j*110+300,100,100);
                diamond->show();
            }
            else if(s[i][j]==16384)
            {
                diamond = new QLabel(this);
                QPixmap pix ( ":/images/qing.png");
                diamond->setPixmap(pix);
                diamond->setScaledContents(true) ;
                diamond->setGeometry(i*110+25,j*110+300,100,100);
                diamond->show();
            }
            else if(s[i][j]==32768)
            {
                diamond = new QLabel(this);
                QPixmap pix ( ":/images/minguo.png");
                diamond->setPixmap(pix);
                diamond->setScaledContents(true) ;
                diamond->setGeometry(i*110+25,j*110+300,100,100);
                diamond->show();
            }
            else if(s[i][j]==65536)
            {
                diamond = new QLabel(this);
                QPixmap pix ( ":/images/china.png");
                diamond->setPixmap(pix);
                diamond->setScaledContents(true) ;
                diamond->setGeometry(i*110+25,j*110+300,100,100);
                diamond->show();
            }


        }
    }

}

void china::keyPressEvent(QKeyEvent *event)
{


    switch (event->key()) {
    case Qt::Key_W:
        PressUp();
        break;
    case Qt::Key_S:
        PressDown();
        break;
    case Qt::Key_A:
        PressLeft();
        break;
    case Qt::Key_D:
        PressRight();
        break;
    default:
        break;//忽略其他按钮操作
    }
    myRand();
    update();//强制界面刷新
}


void china::PressUp()
{

    //移动
    for(int i=0; i<4; i++)
    {
        for(int j=1; j<4; j++)
        {
           if(s[i][j]==0) continue;
           for(int p=0; p<j; p++)
           {
               //查看前面是否有空格子可移动
               if(s[i][p]==0)
               {
                   s[i][p]=s[i][j];
                   s[i][j]=0;

                   break;
               }
           }
        }
    }
    //相加
    for(int i=0; i<4; i++)
    {
        for(int j=0; j<3; j++)
        {
           if(s[i][j]==s[i][j+1])
           {
               s[i][j]=2*s[i][j];
               s[i][j+1]=0;
               score+=s[i][j];
               for(int p=j+2; p<4; p++)
               {
                   if(p<3)
                   {
                       s[i][p-1]=s[i][p];
                   }
                   else
                   {
                       s[i][p-1]=s[i][p];
                       s[i][p]=0;
                   }
               }
           }

        }
    }
}

void china::PressDown()
{
    //移动
    for(int i=3; i>-1; i--)
    {
        for(int j=2; j>-1; j--)
        {
           if(s[i][j]==0) continue;
           for(int p=3; p>j; p--)
           {
               //查看前面是否有空格子可移动
               if(s[i][p]==0)
               {
                   s[i][p]=s[i][j];
                   s[i][j]=0;
                   break;
               }
           }
        }
    }
    //相加
    for(int i=0; i<4; i++)
    {
        for(int j=3; j>0; j--)
        {
           if(s[i][j]==s[i][j-1])
           {
               s[i][j]=2*s[i][j];
               s[i][j-1]=0;
               score+=s[i][j];
               for(int p=j-2; p>-1; p--)
               {
                  if(p>0)
                  {
                      s[i][p+1]=s[i][p];
                  }
                  else
                  {
                      s[i][p+1]=s[i][p];
                      s[i][p]=0;
                  }
               }
           }

        }
    }
}

void china::PressLeft()
{
    //移动
    for(int j=0; j<4; j++)
    {
        for(int i=1; i<4; i++)
        {
           if(s[i][j]==0) continue;
           for(int p=0; p<i; p++)
           {
               //查看前面是否有空格子可移动
               if(s[p][j]==0)
               {
                   s[p][j]=s[i][j];
                   s[i][j]=0;
                   break;
               }
           }
        }
    }
    //相加
    for(int j=0; j<4; j++)
    {
        for(int i=0; i<3; i++)
        {
           if(s[i][j]==s[i+1][j])
           {
               s[i][j]=2*s[i][j];
               s[i+1][j]=0;
               score+=s[i][j];
               for(int p=i+2; p<4; p++)
               {
                  if(p<3)
                  {
                      s[p-1][j]=s[p][j];
                  }
                  else
                  {
                      s[p-1][j]=s[p][j];
                      s[p][j]=0;
                  }
               }
           }

        }
    }
}

void china::PressRight()
{
    //移动
    for(int j=3; j>-1; j--)
    {
        for(int i=2; i>-1; i--)
        {
           if(s[i][j]==0) continue;
           for(int p=3; p>i; p--)
           {
               //查看前面是否有空格子可移动
               if(s[p][j]==0)
               {
                   s[p][j]=s[i][j];
                   s[i][j]=0;
                   break;
               }
           }
        }
    }
    //相加
    for(int j=0; j<4; j++)
    {
        for(int i=3; i>0; i--)
        {
           if(s[i][j]==s[i-1][j])
           {
               s[i][j]=2*s[i][j];
               s[i-1][j]=0;
               score+=s[i][j];
               for(int p=i-2; p>-1; p--)
               {
                  if(p==1)
                  {
                      s[p+1][j]=s[p][j];
                  }
                  else
                  {
                      s[p+1][j]=s[p][j];
                      s[p][j]=0;
                  }
               }
           }

        }
    }
}

void china::myRand()
{
   //首先找出空白格子
   //找出空几个格子

    struct Ns n[16];
    int ni=0;
    for (int i=0; i<4; i++)
    {
        for(int j=0;j<4;j++)
        {
            if(s[i][j]==0)
            {
                n[ni].i=i;
                n[ni].j=j;
                ni++;
            }

        }
    }
    //判断游戏是否结束
    if(ni==0)
    {
        for (int i=0; i<4; i++)
        {
            for(int j=0;j<3;j++)
            {
                if(s[i][j]==s[i][j+1])
                {
                   return;
                }
            }
        }
        for (int j=0; j<4; j++)
        {
            for(int i=0;i<3;i++)
            {
                if(s[i][j]==s[i+1][j])
                {
                   return;
                }
            }
        }
        //找出最高朝代
        int temp=0;
        for (int i=0; i<4; i++)
        {
            for(int j=0;j<4;j++)
            {
                if(s[i][j]>temp)
                {
                  temp=s[i][j];
                }

            }
        }
        switch (temp) {
        case 2:
            dynasty="夏朝";
            break;
        case 4:
             dynasty="商朝";
            break;
        case 8:
             dynasty="周朝";
            break;
        case 16:
            dynasty="秦朝";
            break;
        case 32:
            dynasty="汉朝";
            break;
        case 64:
             dynasty="三国";
            break;
        case 128:
             dynasty="晋朝";
            break;
        case 256:
             dynasty="南北朝";
            break;
        case 512:
          dynasty="隋朝";
            break;
        case 1024:
             dynasty="唐朝";
            break;
        case 2048:
             dynasty="宋朝";
            break;
        case 4096:
            dynasty="元朝";
            break;
        case 8192:
            dynasty="明朝";
            break;
        case 16384:
            dynasty="清朝";
            break;
        case 32768:
            dynasty="民国";
            break;
        case 65536:
            dynasty="中国";
            break;
        default:
            break;
        }

        endscore=score;
        QTextStream cin(stdin,  QIODevice::ReadOnly);

        QTextStream cout(stdout,  QIODevice::WriteOnly);


        QFile r("D:/Qt/2048beta/list.txt");
        if(!r.open(QIODevice::ReadOnly | QIODevice::Text))
        {
            cout << "Open failed." << Qt::endl;

        }
        Person person2[45];
        QString line2[45];
        QTextStream txtInput(&r);
        while(!txtInput.atEnd())
        {

              QTextStream in(&r);  //用文件构造流

              for(int j=0;j<2;j++)
              {
                  if(j==0)
                  {
                      for(int i=0;i<40;i++)
                      {
                          line2[i]=in.readLine();//循环读取下行

                         person2[i].feng=line2[i].toInt();


                      }
                  }
                  if(j==1)
                  {
                      for(int i=0;i<40;i++)
                      {
                          line2[i]=in.readLine();//循环读取下行


                          person2[i].name=line2[i];
                      }
                  }

              }
        }

        r.close();



        for(int i=30;i<40;i++)
        {
            if(endscore>person2[i].feng)
            {

                rank=i;
                classify=4;
                record *rec1 = new record(); //新建父界面的对象,将Widget界面显示出来
                this->close(); //关闭当前界面
                rec1->show(); //显示新 界面
                return;

            }

        }


        gameover *over = new gameover();
        this->close();
        over->show();
        return ;

    }
    for (int i=0; i<4; i++)
    {
        for(int j=0;j<4;j++)
        {
            if(s[i][j]==32768)
            {
               classify=4;
               victory *vic = new victory();
               this->close();
               vic->show();
               break;

            }

        }

    }

    //随机生成2或4
    int  k = qrand()%3;            //获取0~3的随机数
    if(k == 0 || k == 1)
    {
        int rand=qrand()%ni;
        s[n[rand].i][n[rand].j]=2;
    }
    else if(k == 2 || k == 3)
    {
        int rand=qrand()%ni;
        s[n[rand].i][n[rand].j]=4;
    }


}

void china::on_pushButton_2_clicked()
{

       Widget *main = new Widget(); //新建父界面的对象,将Widget界面显示出来
        this->close(); //关闭当前界面
        main->show(); //显示父 界面
}


void china::on_pushButton_clicked()
{
    for(int i=0; i<4; i++)
    {
        for(int j=0; j<4; j++)
        {
            s[i][j]=0;
        }
    }
     int randi=qrand()%4;
     int randj=qrand()%4;
     s[randi][randj]=2;
     update();
}


china::~china()
{
    delete ui;
}


  • 5
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值