一、游戏演示

手机上经典的1024游戏,通过Qt实现了电脑版本,先看效果:

二、说明

  1. 布局和配色借鉴了手机游戏;
  2. 通过上下左右按键的操作,控制数字的移动;
  3. 在移动过程中相同的数学会自动合并,变成更大的数字。

三、主要代码

界面布局:

#pragma once#include <QtWidgets/QMainWindow>
#include "ui_DD1024.h"class QGraphicsScene;
class QGraphicsView;
class QKeyEvent;
class RandomPos;
class AutoMoveItem;class DD1024 : public QMainWindow {Q_OBJECTpublic:DD1024(QWidget *parent = Q_NULLPTR);private:void init();
private:void keyPressEvent(QKeyEvent *e)override;private slots:void slotStart();
private:Ui::DD1024Class ui;QGraphicsScene* _mainScene = nullptr;QGraphicsView* _mainView = nullptr;QColor _bkColor = QColor(187, 173, 160);RandomPos* _randomPos = nullptr;AutoMoveItem* _autoMoveItem = nullptr;
};
#include "DD1024.h"
#include <QGraphicsScene>
#include <QGraphicsView>
#include <QMessageBox>
#include <QKeyEvent>
#include "DD1024Def.h"
#include "QGraphicsRoundRectItem.h"
#include "RandomPos.h"
#include "AutoMoveItem.h"DD1024::DD1024(QWidget *parent): QMainWindow(parent) {ui.setupUi(this);this->grabKeyboard(); //使其具有捕获键盘事件的能力init();
}void DD1024::init() {if (_mainScene == nullptr) {_mainScene = new QGraphicsScene;_mainScene->setSceneRect(0, 0, BOX_LENGTH * 4 + BOX_INTERVAL * 5, BOX_LENGTH * 4 + BOX_INTERVAL * 5);_randomPos = new RandomPos;_autoMoveItem = new AutoMoveItem;for (int row = 0;row < 4;row ++){for (int col = 0; col < 4; col++) {QGraphicsRoundRectItem*item = new QGraphicsRoundRectItem(row, col, 0);_mainScene->addItem(item);_randomPos->appendAllItem(item);_autoMoveItem->appendAllItem(row, col, item);}}}if (_mainView == nullptr) {_mainView = new QGraphicsView;_mainView->setBackgroundBrush(_bkColor);_mainView->setRenderHint(QPainter::Antialiasing);_mainView->setScene(_mainScene);}ui.verticalLayoutMain->addWidget(_mainView);connect(ui.pushButtonStart, SIGNAL(clicked()), this, SLOT(slotStart()));
}void DD1024::keyPressEvent(QKeyEvent *e) {if (e->key() == Qt::Key_Left) {//左_autoMoveItem->moveLeft();} else if (e->key() == Qt::Key_Right) {//右_autoMoveItem->moveRight();} else if (e->key() == Qt::Key_Up) {//上_autoMoveItem->moveUp();} else if (e->key() == Qt::Key_Down) {//下_autoMoveItem->moveDown();}if (!_randomPos->setOnlyItemNumber()) {//数据全部填满if (_autoMoveItem->isGameFinish()) {//游戏结束QMessageBox::information(nullptr, QStringLiteral("提示"), QStringLiteral("游戏结束!"), QMessageBox::Yes);}}_mainScene->update();QWidget::keyPressEvent(e);
}void DD1024::slotStart() {_randomPos->setOnlyItemNumber();_randomPos->setOnlyItemNumber();_mainScene->update();
}

方块类:

#pragma once#include <QObject>
#include <QColor>
#include <QRectF>
#include <QGraphicsItem>class QTimer;class QGraphicsRoundRectItem :public QObject, public QGraphicsItem {Q_OBJECTpublic:QGraphicsRoundRectItem(QGraphicsItem *parent = nullptr);QGraphicsRoundRectItem(int row, int col, int number, QGraphicsItem *parent = nullptr);~QGraphicsRoundRectItem();void setNumber(int num);int&getNumber() { return _number; }//动画显示出来void animationShow();private:void setRowCol(int r, int c, int number);//绘图区域QRectF boundingRect() const;//绘制按钮图像的函数void paint(QPainter *painter,const QStyleOptionGraphicsItem *option,QWidget *widget = 0)override;private slots:void slotShowRect();
protected:QColor _rectColor = QColor(199, 189, 179);//背景颜色int _fontAlpha = 255;QColor _fontColor = QColor(0, 0, 0);//字体颜色int _fontSize = 40;//字体大小int _row = 0;int _col = 0;QRectF _rect;int _number = 0;//当前值QTimer* _timerShow = nullptr;
};
#include <QPainter>
#include <QPen>
#include <QTimer>
#include "QGraphicsRoundRectItem.h"
#include "DD1024Def.h"QGraphicsRoundRectItem::QGraphicsRoundRectItem(QGraphicsItem *parent): QGraphicsItem(parent) {_timerShow = new QTimer;_timerShow->setInterval(50);connect(_timerShow, SIGNAL(timeout()), this, SLOT(slotShowRect()));
}QGraphicsRoundRectItem::QGraphicsRoundRectItem(int row, int col, int number, QGraphicsItem *parent /*= nullptr*/) {setRowCol(row, col, number);_timerShow = new QTimer;_timerShow->setInterval(50);connect(_timerShow, SIGNAL(timeout()), this, SLOT(slotShowRect()));
}QGraphicsRoundRectItem::~QGraphicsRoundRectItem() {}void QGraphicsRoundRectItem::setNumber(int num) {_number = num;switch (_number) {case 0:case 2:_rectColor = QColor(227, 219, 208);_fontColor = QColor(0, 0, 0);_fontSize = 40;break;case 4:_rectColor = QColor(227, 216, 196);_fontColor = QColor(0, 0, 0);_fontSize = 40;break;case 8:_rectColor = QColor(231, 180, 135);_fontColor = QColor(255, 255, 255);_fontSize = 40;break;case 16:_rectColor = QColor(245, 149, 99);_fontColor = QColor(255, 255, 255);_fontSize = 40;break;case 32:_rectColor = QColor(245, 124, 95);_fontColor = QColor(255, 255, 255);_fontSize = 40;break;case 64:_rectColor = QColor(246, 93, 59);_fontColor = QColor(255, 255, 255);_fontSize = 40;break;case 128:_rectColor = QColor(237, 206, 113);_fontColor = QColor(255, 255, 255);_fontSize = 36;break;case 256:_rectColor = QColor(237, 204, 97);_fontColor = QColor(255, 255, 255);_fontSize = 36;break;case 512:_rectColor = QColor(236, 200, 80);_fontColor = QColor(255, 255, 255);_fontSize = 36;break;case 1024:_rectColor = QColor(237, 197, 63);_fontColor = QColor(255, 255, 255);_fontSize = 28;break;case 2048:_rectColor = QColor(238, 194, 46);_fontColor = QColor(255, 255, 255);_fontSize = 28;break;case 4096:_rectColor = QColor(237, 113, 207);_fontColor = QColor(255, 255, 255);_fontSize = 28;break;case 8192:_rectColor = QColor(237, 97, 204);_fontColor = QColor(255, 255, 255);_fontSize = 28;break;case 16384:_rectColor = QColor(238, 80, 201);_fontSize = 22;break;case 32768:_rectColor = QColor(237, 63, 197);_fontColor = QColor(255, 255, 255);_fontSize = 22;break;case 65536:_rectColor = QColor(236, 46, 194);_fontColor = QColor(255, 255, 255);_fontSize = 22;break;case 131072:_rectColor = QColor(236, 46, 194);_fontColor = QColor(255, 255, 255);_fontSize = 18;break;default:break;}
}void QGraphicsRoundRectItem::animationShow() {if (_timerShow->isActive()){_timerShow->stop();}_fontAlpha = 0;_timerShow->start();
}void QGraphicsRoundRectItem::setRowCol(int r, int c, int number) {_row = r;_col = c;_rect.setTop((_row + 1)*BOX_INTERVAL + _row * BOX_LENGTH);_rect.setLeft((_col + 1)*BOX_INTERVAL + _col * BOX_LENGTH);_rect.setWidth(BOX_LENGTH);_rect.setHeight(BOX_LENGTH);setNumber(number);
}QRectF QGraphicsRoundRectItem::boundingRect() const {return _rect;
}void QGraphicsRoundRectItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget /*= 0*/) {painter->setPen(Qt::NoPen);painter->setBrush(QBrush(_rectColor));painter->drawRoundRect(_rect, ROUND_RADIUS, ROUND_RADIUS);if (_number != 0){_fontColor.setAlpha(_fontAlpha);QPen pen(_fontColor);QFont font(QStringLiteral("宋体"), _fontSize, QFont::Bold);QString text = QString::number(_number);painter->setPen(pen);painter->setFont(font);painter->drawText(_rect, Qt::AlignCenter, text);}
}void QGraphicsRoundRectItem::slotShowRect() {_fontAlpha += 20;if (_fontAlpha > 255){_timerShow->stop();}update();
}

资源下载
aaa

Qt编写1024游戏相关推荐

  1. 【逆向工程】x64dbg逆向扫雷及QT编写游戏辅助

    目标制作游戏辅助,实现扫雷一键通关等各种功能 最终效果 涉及知识 模拟菜单点击和修改旗子数量 一键扫雷功能实现 网上的X64dbg新手入门的教程很少,因为自己也是个新手菜狗并且直接跳过了OD用的X64 ...

  2. Qt编写的小软件:一个模拟按键按下和鼠标(左键)按下的小工具

    最近玩SLG游戏的时候有大量对剧情推进无意义的对话想要跳过的时候只能狂按空格键或者狂点鼠标,还好本人好歹是程序员,于是写了个小工具来处理. 下载地址:Qt编写的模拟鼠标按下和按键按下的小工具-C++文 ...

  3. 用Qt 编写黑白棋程序

    用Qt 编写黑白棋程序 前言:这是继三天学习c++后,学习了两天Qt 做的项目. 软件设计开发流程: 瀑布模型: 可行性分析 时间: 共8天(其中前两天学习Qt3.1 与Qt4.3.5,中间编程,最后 ...

  4. Qt编写OpenMP程序--循环测试

    第一篇:https://blog.csdn.net/hats8888/article/details/46378281 最近一个客户需要处理大量股票数据,并跑到数据库里,原来的程序导入数据到数据库需要 ...

  5. 在编写flash游戏播放声音时的一个要注意的地方

    在编写flash游戏播放声音时的一个要注意的地方 如果该机子没有装声卡,或是声卡有问题,或操作系统如win 2003 server禁用了声卡,或提示没有活动混音器设备可用 播放声音得不到channel ...

  6. Qt编写可换肤的中文双拼汉字输入法

    时间过得真快,不知不觉已到2015年,农历春节一眨眼就过去了,端正状态收拾心情整装待发出发. 曾经有段时间,我有一个很执着的梦想,我要导演出一部空前绝后的巨幕.不过现实无情地碾碎我的梦想,也同时将我推 ...

  7. qt编写activex_Qt中使用ActiveX(一)

    由于最近需要使用ActiveX,一般来说可以使用微软提供的MFC或者ATL框架来开发,由于我个人对这部分内容不是很熟悉,好在Qt也提供对于ActiveX的支持.本文主要记录个人学习ActiveX的一些 ...

  8. python编写剪刀石头布游戏_闲着也是闲着:PYTHON 编写剪刀石头布游戏

    闲着也是闲着:PYTHON 编写剪刀石头布游戏 突如其来的一场变故,使得这个假期尤为的漫长,特别是不知什么时候终结的假期,尤其的漫长.闲着也是闲着,不如来学习学习Python吧. 我学习新的语言,不喜 ...

  9. 一分钟教你学会python_十分钟教你学会python编写小游戏

    原标题:十分钟教你学会python编写小游戏 看过,估计大家都已经精通了吧,好的,话不多说,今天就活学活用,用python来编写纸牌游戏21点,江湖人称黑杰克,BLACK JACK-(注意法式卷舌). ...

  10. QT实现maroon游戏

    QT实现maroon游戏 项目简介 项目技术 项目展示 主要源码片段解析 获取完整项目源码传送门 项目简介 一款适用于触摸设备的Qt Quick游戏,该游戏使用SpriteSequence,Parti ...

最新文章

  1. 你们AI圈儿,已经引起了罗马教皇的警惕
  2. ans_rproxy 说明
  3. 协方差特征 image feature 二阶pooling + ECCV12
  4. mysql集群搭建_mysql高可用集群搭建
  5. 1小时搞懂设计模式之工厂模式(简单工厂)
  6. angularjs框架
  7. C++的构造函数总结
  8. h5 监听浏览器被切换到后台或者手机锁屏再次唤起事件
  9. 希捷发布新NAS产品为小型企业提供存储便利性
  10. 构造方法传参数的小心得
  11. 转载:国内从事机器视觉领域的公司
  12. H5游戏开发:FC小蜜蜂
  13. 关于财务BI系统-报表分析(全)
  14. 如何做到微信机器人不封号_如何正确使用微信聊天机器人才能避免被封号?
  15. 微信聊天记录导出文本
  16. 软件架构-redis特性和集群特性(下)
  17. python判断火车票座位_用Python实现火车票查询(含票价版)
  18. NLP学习路径(三):NLP中文分词技术
  19. 相机的标定之手机相机的标定
  20. IDEA Maven遇到的问题 wating for maven import completionomitted for duplicate jar

热门文章

  1. 循环不变式、数学归纳法、归纳推理和演绎推理学习总结
  2. stm32做的usb游戏手柄xbox360
  3. 港中文深圳校区计算机研究生怎么样,港中文(深圳)就业报告:应届生年薪40万!这所学校值得读吗?...
  4. 项目人力资源管理之编制项目人力资源管理计划
  5. Unity模拟榴弹运动轨迹
  6. 电脑查看wifi密码
  7. FLUKE OTDR光纤断点测试仪OFP2-100-Q特色功能及亮点分析
  8. 获取select选中的值php,js如何获取select标签选中的值
  9. 网课答案搜题API接口使用
  10. 将idea maven项目中webapp文件夹的改为Web Root