经典模式
我采用贴图的形式实现方格,便于后续娱乐模式的开发(就换个贴图罢了)。
先贴代码,后续有详细说明。
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;
}