原创,转载请注明出处。
这里用Qt实现了小游戏2048,基本实现了2048的功能,是C++,Qt的必备练手项目,界面设置如下图:
通过在界面上的按钮上下左右控制数字,实现运算,并且记录分数,游戏的玩法跟2048相同,接下来具体介绍。
在创建时使用QWidget ,并创建界面文件。
用于显示数字的区域使用QTextEdit。截图如下:
在boardwidget.h文件里的代码如下:
#ifndef BOARDWIDGET_H
#define BOARDWIDGET_H
#include <QMainWindow>
#include<QTextEdit>
#include<QPoint>
#include<QStack>
namespace Ui {
class BoardWidget;
}
class BoardWidget : public QMainWindow
{
Q_OBJECT
public:
explicit BoardWidget(QWidget *parent = 0);
~BoardWidget();
signals:
private:
void initBoard();
void upDo();
void downDo();
void leftDo();
void rightDo();
int getRandomNumber_1(int min,int max);
int getRandomNumber_2(int min,int max);
void defNum();
QTextEdit *textEdit[4][4];
QStack<QPoint> emptyPosition;
int t;
int score=0;
void checkResult(int w);
public slots:
private slots:
void on_newGameBtn_clicked();
private:
Ui::BoardWidget *ui;
};
#endif // BOARDWIDGET_H
在对应的boardwidget.cpp文件中的代码如下:
#include "boardwidget.h"
#include "ui_boardwidget.h"
#include<QPushButton>
#include<QTime>
#include<QtGlobal>
#include<QMessageBox>
BoardWidget::BoardWidget(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::BoardWidget)
{
ui->setupUi(this);
initBoard();
}
BoardWidget::~BoardWidget()
{
delete ui;
}
void BoardWidget::initBoard()
{
ui->scoreDisplay->setText("0");
defNum();
t=1;
int x=getRandomNumber_1(0,15);
int y=getRandomNumber_2(0,15);
if(x!=y)
{
textEdit[x/4][x%4]->setText(QString::number(2)); //随机位置出现两个2
textEdit[y/4][y%4]->setText(QString::number(2));
}
else
{
int x=getRandomNumber_1(0,15);
int y=getRandomNumber_2(0,15);
textEdit[x/4][x%4]->setText(QString::number(2)); //随机位置出现两个2
textEdit[y/4][y%4]->setText(QString::number(2));
}
connect(ui->upBtn,&QPushButton::clicked,this,&BoardWidget::upDo);
connect(ui->downBtn,&QPushButton::clicked,this,&BoardWidget::downDo);
connect(ui->leftBtn,&QPushButton::clicked,this,&BoardWidget::leftDo);
connect(ui->rightBtn,&QPushButton::clicked,this,&BoardWidget::rightDo);
}
void BoardWidget::defNum()
{
textEdit[0][0]=ui->a00;
textEdit[0][1]=ui->a01;
textEdit[0][2]=ui->a02;
textEdit[0][3]=ui->a03;
textEdit[1][0]=ui->a10;
textEdit[1][1]=ui->a11;
textEdit[1][2]=ui->a12;
textEdit[1][3]=ui->a13;
textEdit[2][0]=ui->a20;
textEdit[2][1]=ui->a21;
textEdit[2][2]=ui->a22;
textEdit[2][3]=ui->a23;
textEdit[3][0]=ui->a30;
textEdit[3][1]=ui->a31;
textEdit[3][2]=ui->a32;
textEdit[3][3]=ui->a33;
}
int BoardWidget::getRandomNumber_1(int min,int max)
{
qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));
int test=qrand()%(max-min);
return test;
}
int BoardWidget::getRandomNumber_2(int min, int max)
{
qsrand(QTime(0,0,0).secsTo(QTime::currentTime())*100);
int test=qrand()%(max-min);
return test;
}
void BoardWidget::upDo()
{
int w=0;//判断是否需要随机产生数
QStack<int> calculatedNumbers;
//上移
for(int j=0;j<4;j++)
{
for(int k=0;k<3;k++)
{
for(int i=0;i<3;i<