qt写2048这个小游戏在于,键盘的上下左右移动,要加多个判断。
widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include "numberlabel.h"
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
protected:
void keyPressEvent(QKeyEvent *event);
private:
NumberLabel *m_pNumber[16];
};
#endif // WIDGET_H
widget.cpp
#include "widget.h"
#include <QVBoxLayout>
#include <QGridLayout>
#include <qdebug.h>
#include <QKeyEvent>
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
this->resize(800,600);
QGridLayout *mainLayout=new QGridLayout(this);
for(int i=0;i<4;i++)
{
for(int j=0;j<4;j++)
{
m_pNumber[i*4+j]=new NumberLabel(this);
m_pNumber[i*4+j]->setObjectName(QString::number(i*4+j));
m_pNumber[i * 4 + j]->setText("");
mainLayout->addWidget(m_pNumber[i*4+j],i,j);
}
}
for(int i=0;i<2;i++)
{
int random = qrand()%(16-0);
m_pNumber[random]->setText("2");
}
this->setLayout(mainLayout);
}
Widget::~Widget()
{
}
void Widget::keyPressEvent(QKeyEvent *event)
{
QList<NumberLabel *> labelList = this->findChildren<NumberLabel *>();
if(event->key()==Qt::Key_Left)
{
foreach(NumberLabel *label, labelList) {
QString strText = label->text();
if (strText != "")
{
int i = label->objectName().toInt();
int iline = i / 4; //判断第几行
int column = i - (iline * 4); //判断列数
switch (column)
{
case 0:
break;
case 1:
if (m_pNumber[iline*4]->text() == "")
{
m_pNumber[iline * 4]->setText(strText);
label->setText("");
}
else
{
if (m_pNumber[iline * 4]->text() == label->text())
{
int count = m_pNumber[iline * 4]->text().toInt() * 2;
m_pNumber[iline * 4]->setText(QString::number(count));
label->setText("");
}
}
break;
case 2:
if (m_pNumber[iline * 4 + 1]->text() == "")
{
m_pNumber[iline * 4 +1]->setText(strText);
label->setText("");
if (m_pNumber[iline * 4]->text() == "")
{
m_pNumber[iline * 4]->setText(strText);
m_pNumber[iline * 4 +1]->setText("");
}
else
{
if (m_pNumber[iline * 4]->text() == m_pNumber[iline * 4 + 1]->text())
{
int count = m_pNumber[iline * 4]->text().toInt() * 2;
m_pNumber[iline * 4]->setText(QString::number(count));
m_pNumber[iline * 4 + 1]->setText("");
}
}
}
else
{
if (m_pNumber[iline * 4 + 1]->text() == m_pNumber[iline * 4 + 2]->text())
{
int count = m_pNumber[iline * 4 + 1]->text().toInt() * 2;
m_pNumber[iline * 4 + 1]->setText(QString::number(count));
m_pNumber[iline * 4 + 2]->setText("");
if (m_pNumber[iline * 4]->text() == m_pNumber[iline * 4 + 1]->text())
{
int counttwo = m_pNumber[iline * 4]->text().toInt() * 2;
m_pNumber[iline * 4]->setText(QString::number(counttwo));
m_pNumber[iline * 4 + 1]->setText("");
}
}
}
break;
case 3:
if (m_pNumber[iline * 4 + 2]->text() == "")
{
m_pNumber[iline * 4 + 2]->setText(strText);
label->setText("");
if (m_pNumber[iline * 4 + 1]->text() == "")
{
m_pNumber[iline * 4 + 1]->setText(strText);
m_pNumber[iline * 4 + 2]->setText("");
if (m_pNumber[iline * 4]->text() == "")
{
m_pNumber[iline * 4]->setText(strText);
m_pNumber[iline * 4 + 1]->setText("");
}
else
{
if (m_pNumber[iline * 4]->text() == m_pNumber[iline * 4 + 1]->text())
{
int count = m_pNumber[iline * 4]->text().toInt() * 2;
m_pNumber[iline * 4]->setText(QString::number(count));
m_pNumber[iline * 4 + 1]->setText("");
}
}
}
else
{
if (m_pNumber[iline * 4 + 1]->text() == m_pNumber[iline * 4 + 2]->text())
{
int counttwo = m_pNumber[iline * 4 + 1]->text().toInt() * 2;
m_pNumber[iline * 4 + 1]->setText(QString::number(counttwo));
m_pNumber[iline * 4 + 2]->setText("");
}
}
}
else
{
if (m_pNumber[iline * 4 + 2]->text() == label->text())
{
int count = m_pNumber[iline * 4 + 2]->text().toInt() * 2;
m_pNumber[iline * 4 + 2]->setText(QString::number(count));
label->setText("");
if (m_pNumber[iline * 4 + 1]->text() == m_pNumber[iline * 4 + 2]->text())
{
int counttwo = m_pNumber[iline * 4 + 1]->text().toInt() * 2;
m_pNumber[iline * 4 + 1]->setText(QString::number(counttwo));
m_pNumber[iline * 4 + 2]->setText("");
if (m_pNumber[iline * 4]->text() == m_pNumber[iline * 4 + 1]->text())
{
int countthree = m_pNumber[iline * 4]->text().toInt() * 2;
m_pNumber[iline * 4]->setText(QString::number(countthree));
m_pNumber[iline * 4 + 1]->setText("");
}
}
}
}
break;
default:
break;
}
}
}
}
else if(event->key()==Qt::Key_Right)
{
foreach(NumberLabel *label, labelList) {
QString strText = label->text();
if (strText != "")
{
int i = label->objectName().toInt();
int iline = i / 4; //判断第几行
QString strFirstText = m_pNumber[(iline) * 4]->text();
QString strSecondText = m_pNumber[(iline) * 4 + 1]->text();
QString strThirdText = m_pNumber[(iline) * 4 + 2]->text();
QString strFouthText = m_pNumber[(iline) * 4 + 3]->text();
int column = i - (iline * 4); //判断列数
switch (column)
{
case 0:
if (strSecondText == "")
{
m_pNumber[(iline) * 4 + 1]->setText(strText);
label->setText("");
if (strThirdText == "")
{
m_pNumber[(iline) * 4 + 2]->setText(strText);
m_pNumber[(iline) * 4 + 1]->setText("");
if (strFouthText == "")
{
m_pNumber[(iline) * 4 + 3]->setText(strText);
m_pNumber[(iline) * 4 + 2]->setText("");
}
else
{
if (strFouthText == strThirdText)
{
int count = strFouthText.toInt() * 2;
m_pNumber[(iline) * 4 + 3]->setText(QString::number(count));
m_pNumber[(iline) * 4 + 2]->setText("");
}
}
}
else
{
if (strThirdText == strSecondText)
{
int count = strThirdText.toInt() * 2;
m_pNumber[(iline) * 4 + 2]->setText(QString::number(count));
m_pNumber[(iline) * 4 + 1]->setText("");
}
}
}
else
{
if (strSecondText == label->text())
{
int Count = strSecondText.toInt() * 2;
m_pNumber[(iline) * 4 + 1]->setText(QString::number(Count));
label->setText("");
if (strSecondText == strThirdText)
{
int counttwo = strSecondText.toInt() * 2;
m_pNumber[(iline) * 4 + 2]->setText(QString::number(counttwo));
m_pNumber[(iline) * 4 + 1]->setText("");
if (strFouthText == strThirdText)
{
int countthree = strFouthText.toInt() * 2;
m_pNumber[(iline) * 4 + 3]->setText(QString::number(counttwo));
m_pNumber[(iline) * 4 + 2]->setText("");
}
}
}
}
break;
case 1:
if (strThirdText == "")
{
m_pNumber[(iline) * 4 + 2]->setText(strText);
label->setText("");
if (strFouthText == "")
{
m_pNumber[(iline) * 4 + 3]->setText(strText);
m_pNumber[(iline) * 4 + 2]->setText("");
}
}
else
{
if (strThirdText == label->text())
{
int Count = strThirdText.toInt() * 2;
m_pNumber[(iline) * 4 + 2]->setText(QString::number(Count));
label->setText("");
if (strThirdText == strFouthText)
{
int Counttwo = strFouthText.toInt() * 2;
m_pNumber[(iline) * 4 + 3]->setText(QString::number(Counttwo));
m_pNumber[(iline) * 4 + 2]->setText("");
}
}
}
break;
case 2:
if (strFouthText == "")
{
m_pNumber[(iline) * 4 + 3]->setText(strText);
label->setText("");
}
else
{
if (strFouthText == label->text())
{
int Count = strFouthText.toInt() * 2;
m_pNumber[(iline) * 4 + 3]->setText(QString::number(Count));
label->setText("");
}
}
break;
case 3:
break;
default:
break;
}
}
}
}
else if(event->key()==Qt::Key_Up)
{
foreach(NumberLabel *label, labelList) {
QString strText = label->text();
if (strText != "")
{
int i = label->objectName().toInt();
int iline = i / 4; //判断第几行
int column = i - (iline * 4); //判断列数
switch (iline)
{
case 0:
break;
case 1:
if (m_pNumber[(iline - 1) * 4 + column]->text() == "")
{
m_pNumber[(iline - 1) * 4 + column]->setText(strText);
label->setText("");
}
else
{
if (m_pNumber[(iline - 1) * 4 + column]->text() == label->text())
{
int Count = label->text().toInt() * 2;
m_pNumber[(iline - 1) * 4 + column]->setText(QString::number(Count));
label->setText("");
}
}
break;
case 2:
if (m_pNumber[(iline - 1) * 4 + column]->text() == "")
{
m_pNumber[(iline - 1) * 4 + column]->setText(strText);
label->setText("");
if (m_pNumber[(iline - 2) * 4 + column]->text() == "")
{
m_pNumber[(iline - 1) * 4 + column]->setText("");
m_pNumber[(iline - 2) * 4 + column]->setText(strText);
}
else
{
if (m_pNumber[(iline - 1) * 4 + column]->text() == m_pNumber[(iline - 2) * 4 + column]->text())
{
int CountTwo = m_pNumber[(iline - 1) * 4 + column]->text().toInt() * 2;
m_pNumber[(iline - 2) * 4 + column]->setText(QString::number(CountTwo));
m_pNumber[(iline - 1) * 4 + column]->setText("");
}
}
}
else
{
if (m_pNumber[(iline - 1) * 4 + column]->text() == label->text())
{
int Count = label->text().toInt() * 2;
m_pNumber[(iline - 1) * 4 + column]->setText(QString::number(Count));
label->setText("");
if (m_pNumber[(iline - 1) * 4 + column]->text() == m_pNumber[(iline - 2) * 4 + column]->text())
{
int CountTwo = m_pNumber[(iline - 1) * 4 + column]->text().toInt() * 2;
m_pNumber[(iline - 2) * 4 + column]->setText(QString::number(CountTwo));
m_pNumber[(iline - 1) * 4 + column]->setText("");
}
}
}
break;
case 3:
if (m_pNumber[(iline - 1) * 4 + column]->text() == "")
{
m_pNumber[(iline - 1) * 4 + column]->setText(strText);
label->setText("");
if (m_pNumber[(iline - 2) * 4 + column]->text() == "")
{
m_pNumber[(iline - 1) * 4 + column]->setText("");
m_pNumber[(iline - 2) * 4 + column]->setText(strText);
if (m_pNumber[(iline - 3) * 4 + column]->text() == "")
{
m_pNumber[(iline - 2) * 4 + column]->setText("");
m_pNumber[(iline - 3) * 4 + column]->setText(strText);
}
else
{
int Countthree = m_pNumber[(iline - 2) * 4 + column]->text().toInt() * 2;
m_pNumber[(iline - 3) * 4 + column]->setText(QString::number(Countthree));
m_pNumber[(iline - 2) * 4 + column]->setText("");
}
}
else
{
int CountTwo = m_pNumber[(iline - 1) * 4 + column]->text().toInt() * 2;
m_pNumber[(iline - 2) * 4 + column]->setText(QString::number(CountTwo));
m_pNumber[(iline - 1) * 4 + column]->setText("");
}
}
else
{
if (m_pNumber[(iline - 1) * 4 + column]->text() == label->text())
{
int Count = label->text().toInt() * 2;
m_pNumber[(iline - 1) * 4 + column]->setText(QString::number(Count));
label->setText("");
if (m_pNumber[(iline - 1) * 4 + column]->text() == m_pNumber[(iline - 2) * 4 + column]->text())
{
int CountTwo = m_pNumber[(iline - 1) * 4 + column]->text().toInt() * 2;
m_pNumber[(iline - 2) * 4 + column]->setText(QString::number(CountTwo));
m_pNumber[(iline - 1) * 4 + column]->setText("");
if (m_pNumber[(iline - 2) * 4 + column]->text() == m_pNumber[(iline - 3) * 4 + column]->text())
{
int Countthree = m_pNumber[(iline - 2) * 4 + column]->text().toInt() * 2;
m_pNumber[(iline - 3) * 4 + column]->setText(QString::number(Countthree));
m_pNumber[(iline - 2) * 4 + column]->setText("");
}
}
}
}
break;
default:
break;
}
}
}
}
else if(event->key()==Qt::Key_Down)
{
foreach(NumberLabel *label, labelList) {
QString strText = label->text();
if (strText != "")
{
int i = label->objectName().toInt();
int iline = i / 4; //判断第几行
int column = i - (iline * 4); //判断列数
switch (iline)
{
case 0:
if (m_pNumber[(iline + 1) * 4 + column]->text() == "")
{
m_pNumber[(iline + 1) * 4 + column]->setText(strText);
label->setText("");
if (m_pNumber[(iline + 2) * 4 + column]->text() == "")
{
m_pNumber[(iline + 1) * 4 + column]->setText("");
m_pNumber[(iline + 2) * 4 + column]->setText(strText);
if (m_pNumber[(iline + 3) * 4 + column]->text() == "")
{
m_pNumber[(iline + 2) * 4 + column]->setText("");
m_pNumber[(iline + 3) * 4 + column]->setText(strText);
}
}
}
else
{
if (m_pNumber[(iline + 1) * 4 + column]->text() == label->text())
{
int Count = label->text().toInt() * 2;
m_pNumber[(iline + 1) * 4 + column]->setText(QString::number(Count));
label->setText("");
if (m_pNumber[(iline + 1) * 4 + column]->text() == m_pNumber[(iline + 2) * 4 + column]->text())
{
int CountTwo = m_pNumber[(iline + 1) * 4 + column]->text().toInt() * 2;
m_pNumber[(iline + 2) * 4 + column]->setText(QString::number(CountTwo));
m_pNumber[(iline + 1) * 4 + column]->setText("");
if (m_pNumber[(iline + 2) * 4 + column]->text() == m_pNumber[(iline + 3) * 4 + column]->text())
{
int Countthree = m_pNumber[(iline + 2) * 4 + column]->text().toInt() * 2;
m_pNumber[(iline + 3) * 4 + column]->setText(QString::number(Countthree));
m_pNumber[(iline + 2) * 4 + column]->setText("");
}
}
}
}
break;
case 1:
if (m_pNumber[(iline + 1) * 4 + column]->text() == "")
{
m_pNumber[(iline + 1) * 4 + column]->setText(strText);
label->setText("");
if (m_pNumber[(iline + 2) * 4 + column]->text() == "")
{
m_pNumber[(iline + 1) * 4 + column]->setText("");
m_pNumber[(iline + 2) * 4 + column]->setText(strText);
}
}
else
{
if (m_pNumber[(iline + 1) * 4 + column]->text() == label->text())
{
int Count = label->text().toInt() * 2;
m_pNumber[(iline + 1) * 4 + column]->setText(QString::number(Count));
label->setText("");
if (m_pNumber[(iline + 1) * 4 + column]->text() == m_pNumber[(iline + 2) * 4 + column]->text())
{
int CountTwo = m_pNumber[(iline + 1) * 4 + column]->text().toInt() * 2;
m_pNumber[(iline + 2) * 4 + column]->setText(QString::number(CountTwo));
m_pNumber[(iline + 1) * 4 + column]->setText("");
}
}
}
break;
case 2:
if (m_pNumber[(iline + 1) * 4 + column]->text() == "")
{
m_pNumber[(iline + 1) * 4 + column]->setText(strText);
label->setText("");
}
else
{
if (m_pNumber[(iline + 1) * 4 + column]->text() == label->text())
{
int Count = label->text().toInt() * 2;
m_pNumber[(iline + 1) * 4 + column]->setText(QString::number(Count));
label->setText("");
}
}
break;
case 3:
break;
default:
break;
}
}
}
}
for (int i = 0; i < 2; i++)
{
int random = qrand() % (16 - 0);
if (m_pNumber[random]->text() == "")
{
m_pNumber[random]->setText("2");
}
}
}
numberlabel.h
#ifndef NUMBERLABEL_H
#define NUMBERLABEL_H
#include <QWidget>
#include <QLabel>
class NumberLabel : public QLabel
{
Q_OBJECT
public:
explicit NumberLabel(QWidget *parent = nullptr);
~NumberLabel();
signals:
public slots:
};
#endif // NUMBERLABEL_H
numberlabel.cpp
#include "numberlabel.h"
NumberLabel::NumberLabel(QWidget *parent) : QLabel(parent)
{
this->setStyleSheet("background:rgb(204,192,178);border:1px solid rgb(245,245,245);border-radius:2px");
QFont textFont;
textFont.setPointSize(24);
textFont.setBold(true);
textFont.setFamily("Microsoft YaHei");
this->setFont(textFont);
this->setAlignment(Qt::AlignCenter);
}
NumberLabel::~NumberLabel()
{
}
实现这个小游戏,首先是在窗体中创建4*4的方格,初始化的时候,在随机2个方格中产生数字2,然后使用方向键进行操作的时候,进行逻辑判断,最后再随机在没有产生数字的方格中产生数字2.
效果:
ヾ( ̄▽ ̄)ByeBye