qt制作2048小游戏

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

  • 1
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

加油小杜(接qt定制功能,单模块开发等)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值