经典模式

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

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

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_OBJECTpublic: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或4int  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或4int  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_OBJECTpublic: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或4int  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_OBJECTpublic: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或4int  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_OBJECTpublic: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或4int  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;
}

Qt实现2048(4种模式)相关推荐

  1. [ROS2] map_server加载地图文件的三种模式

    map的数据类型 map话题的类型是nav_msgs::msg::OccupancyGrid.使用下面的命令可以查询该类型的数据结构. ros2 interface show nav_msgs/msg ...

  2. 2021年大数据Spark(九):Spark On Yarn两种模式总结

    目录 Spark On Yarn两种模式 引入 一.当一个MR应用提交运行到Hadoop YARN上时 二.当一个Spark应用提交运行在集群上时 注意 client 模式 cluster 模式 总结 ...

  3. spi协议时序图和四种模式实际应用详解

    大家好,我是无际. 上个章节我们讲解了spi接口定义,今天我们更加深入讲解下spi协议时序图和spi四种模式的用法. 刚开始接触单片机开发时,最怕就是看时序图,对于我来说就是奇怪的知识. 特别是SPI ...

  4. Oracle 11g dataguard三种模式以及实时查询(Real-time query)功能设置

    之前我们讨论过<Linux Oracle 11g dataguard物理standby 配置过程>, 但是在实际过程中会遇到不同的问题,首先我们讨论下ORACLE DATAGUARD的三种 ...

  5. 一文把Redis主从复制、哨兵、Cluster三种模式摸透

    概述 Redis作为缓存的高效中间件,在我们日常的开发中被频繁的使用,今天就来说一说Redis的四种模式,分别是「单机版.主从复制.哨兵.以及集群模式」. 可能,在一般公司的程序员使用单机版基本都能解 ...

  6. 简述python中怎样导入模块_Python中导入模块的两种模式,import

    import import pandas import pandas as pd 使用函数方式:.(),或者.() 比如 pandas.read_csv("data/stock.csv&qu ...

  7. SAP EWM 与 AGV 机器人对接的三种模式

    SAP EWM 与 AGV 机器人对接的三种模式 https://mp.weixin.qq.com/s/xGfUMSBTEMYKce5oXcWDqA 导读    本文转载自:弘毅供应链,跟随供应链专家 ...

  8. FTP的两种模式和在实际工作中应用

    FTP是一种文件传输协议,它支持两种模式,一种方式叫做Standard (也就是 Active,主动方式),一种是 Passive (也就是PASV,被动方式). Standard模式 FTP的客户端 ...

  9. Linux下SVN服务器同时支持Apache的http和https及svnserve独立服务器三种模式且使用相同的访问权限账号...

    1.在服务器上安装配置SVN服务: 2.配置SVN服务同时支持Apache的http和svnserve独立服务器两种模式访问: 3.Apache的http和svnserve独立服务器两种模式使用相同的 ...

  10. Tomcat三种模式及配置APR模式

    为什么80%的码农都做不了架构师?>>>    Tomcat三种模式 Tomcat Connector的三种不同的运行模式性能相差很大,有人测试过的结果如下: 这三种模式的不同之处如 ...

最新文章

  1. AI新基建哪家强?百度“秀肌肉”,意在C位
  2. 了解下SOAP Header 元素
  3. 第二十四课.循环神经网络RNN
  4. H.264 RTP payload 格式
  5. 老男孩python21期作业_(禁闲聊)绘画讨论10个群第176期作业展示
  6. _declspec(naked) 使用
  7. SQL Servr 2008空间数据应用系列一:空间信息基础
  8. 模块调用时对参数值的更改
  9. 如何使用“查找”App 定位丢失的设备或物品?
  10. String类两种实例化方式的区别
  11. css 伪类大全,CSS 伪类
  12. 开源微信小程序源码+小程序游戏代码附搭建框架教程
  13. 惠普电脑u盘重装系统步骤_惠普电脑u盘重装系统xp教程
  14. matlab锥圆球体_MATLAB锥齿轮设计
  15. 电脑文档出现乱码怎么恢复?文档出现了乱码怎么恢复
  16. 【保姆级教程】三角网生成库---triangle快速入门及使用说明(再不会就说不过去了啊兄弟)
  17. R语言-频数统计函数
  18. 我学习python的体会
  19. STM32怎么样判断单片机复位是什么原因造成的
  20. 微信小程序 - text 标签头部有空白间距

热门文章

  1. Module was compiled with an incompatible version of Kotlin 问题解决
  2. JS逆向解析---某知名小说网站内容加密
  3. 【PB】安装PB9.0问题
  4. HCIE-12.9 杭州战报
  5. linux posix 消息队列,实现posix消息队列示例分享
  6. 大数据改变小生活,政务大数据能为我们带来什么?
  7. uniapp开发微信小程序的坑
  8. 金字塔理论在SAP学习中的切身体会
  9. 2022-FANUC0imc/D_三菱M70数控系统(常用参数对照表)
  10. 【word】里面怎样插入带有对勾的正方形