一、实现思路

  1. QPainter 绘制 游戏界面
    PS:根据方块坐标链表绘制所有方块
  2. 支持两种操作方式
    PS:鼠标事件 和 键盘事件(Q,W,E,R,T)
  3. 定时器(10ms) 刷新 方块坐标数据
  4. 根据得分修改方块的步进速度
    PS:简单的 step = sum % 10;【自己可以修改成喜欢的规则】

二、实际效果

三、关键代码分析

源码链接 : https://github.com/AutoCatFuuuu/QT/tree/master/whiteblock

1. 方块坐标信息处理类 【BlockData】

PS: 无非就是增删查改的功能

#ifndef BLOCKDATA_H
#define BLOCKDATA_H#include <stdio.h>struct BData{int x;int y;int width;int height;BData *next;
};class BlockData
{public:BlockData();~BlockData();void init(BData **d,int x=0,int y=0,int width=0,int height=0);   //初始化void insert(BData *d);          //插入数据bool remove(int x,int y);       //删除数据bool remove(int x);             //删除数据void updata(int step);          //更新数据bool judge(int y);              //判断数据void clear();                   //清空数据BData* get(){ return head;}     //读取数据void show();                    //显示数据
private:BData *head;BData *tail;
};#endif // BLOCKDATA_H
2 . 游戏操作界面类 【TestWidget】#####

这里有多种方法实现,我是在mianwindow.ui 里拖个widget 再提升为 TestWidget 【记得设置facus属性 键盘事件需要用到的】

#ifndef TESTWIDGET_H
#define TESTWIDGET_H#include <QWidget>
#include <QMouseEvent>
#include <QKeyEvent>
#include <QTimer>
#include "blockdata.h"namespace Ui {class TestWidget;
}class TestWidget : public QWidget
{Q_OBJECTpublic:explicit TestWidget(QWidget *parent = 0);~TestWidget();void setDSize(int width,int height);    //设置方块宽高void start();                           //开始游戏void restart();                         //重新开始
protected:void paintEvent(QPaintEvent *event);        //绘制界面void mousePressEvent(QMouseEvent *event);   //点击事件void keyReleaseEvent(QKeyEvent *event);     //键盘事件
signals:void failure();         //失败信号void value(int value);  //成绩信号
private slots:void updateData();      //更新数据
private:Ui::TestWidget *ui;QTimer timer;       //定时器BlockData bData;    //方块坐标数据类int step;           //步进速度int Dwidth;         //小方块宽度int Dheight;        //小方块高度bool isfailure;     //失败标志int sum;            //总分
};#endif // TESTWIDGET_H
void TestWidget::paintEvent(QPaintEvent *event)
{QPainter painter(this);painter.fillRect(rect(),Qt::white);painter.setBrush(Qt::black);if(isfailure) {int w = 200;int h = 30;QFont f;f.setPixelSize(32);painter.setFont(f);painter.drawText((width()-w)/2,(height()-h)/2,w,h,Qt::AlignCenter,"failure!!!");}else {BData* d = bData.get();while(d){painter.drawRect(d->x,d->y,d->width,d->height);d = d->next;}}
}void TestWidget::mousePressEvent(QMouseEvent *event)
{QPoint point = event->pos();if(bData.remove(point.x(),point.y())) {sum++;emit value(sum);//刷新速度if(sum%10 == 0)step++;}
}void TestWidget::keyReleaseEvent(QKeyEvent *event){if(event->isAutoRepeat())return;bool _sum = false;switch(event->key()){case Qt::Key_Q:     _sum = bData.remove(Dwidth-1);break;case Qt::Key_W:     _sum = bData.remove(2*(Dwidth-1));break;case Qt::Key_E:     _sum = bData.remove(3*(Dwidth-1));break;case Qt::Key_R:     _sum = bData.remove(4*(Dwidth-1));break;case Qt::Key_T:     _sum = bData.remove(5*(Dwidth-1));break;default:break;}if(_sum) {sum++;emit value(sum);//刷新速度if(sum%10 == 0)step++;}
}void TestWidget::updateData()
{static int _step = Dheight;// 插入新值if(_step >= Dheight) {BData *d = new BData;int x = qrand() % 4;bData.init(&d,x*Dwidth,-Dheight,Dwidth,Dheight);bData.insert(d);_step = 0;}// 更新数据bData.updata(step);//判断失败条件if(!bData.judge(height())) {isfailure = true;emit failure();timer.stop();}_step+=step;//刷新界面update();
}

三、写在最后

 在B站逛的时候看见别人用JS写了《别踩白块儿》,发现代码量挺少的,那如果用QT写会怎样呢?
然后这就是兴趣使然的结果了。没有华丽丽的效果,只有朴实有力的功能。【强行解释自己菜得扣脚(ˉ▽ˉ;)...】
如果有兴趣和我交流的话,可以留言【佛系回复】或者 加我QQ 673315140

QT 小游戏 : 别踩白块儿~相关推荐

  1. 基于Linux、QT、C++的“别踩白块儿”小游戏

    基于Linux.QT.C++的"别踩白块儿"小游戏 源码链接 一.功能实现 完善的游戏界面.游戏倒计时.得分记录.历史最高分显示 二.功能描述 1.界面为4*4,一行中只有一个黑块 ...

  2. python+opencv别踩白块儿游戏辅助,一天一个opencv小项目(已开源)

    python+opencv别踩白块儿游戏辅助,一天一个opencv小项目(已开源) 见链接

  3. 初学JS——利用JS制作的别踩白块儿(街机模式) 小游戏

    初学JS--利用JS制作的别踩白块儿(街机模式) 小游戏 这个是上个星期5写的了,当时是突然想写个游戏,就想到了别踩白块儿,当时的想法是 可能普通模式的别踩白块儿因为他的"块儿"是 ...

  4. 傅小森的游戏制作之路-别踩白块儿

    项目前言 别踩白块儿 这- 还用开发吗? 别人已经制作了呀 触屏版本多的是 是挺多的 但是 你见过按键版本的嘛? 没见过吧 这就是需要开发出来 , 进入项目需求环节 项目需求 别踩白块儿 顾名思义:不 ...

  5. 团队项目代码分析(Android游戏:别踩白块儿)

    代码组成部分: 关键代码主要分为三大部分,如下图所示(用思维导图的形式展示): 代码调用关系 通过MainActivity调用其他类❤,具体见核心代码分析! 核心代码分析 public class P ...

  6. c++游戏别踩白块课程设计

    摘 要: 别踩白块儿游戏是一款非常好玩的游戏.游戏课程设计提供了游戏的说明,设计者的简介,游戏功能的实现.游戏中实现音效,动画. 关键词:音乐,动画,功能 一.概述 <别踩白块儿 Don't T ...

  7. python 4399别踩白块儿脚本

    持续无聊中,看到别踩白块儿觉得这个脚本貌似比较好写. 需要用到的python 库如下 import pyautogui from PIL import ImageGrab, Image import ...

  8. Cocos别踩白块儿案列1

    Cocos  版本3.10 1.游戏介绍: <别踩白块儿>是由 Umoni Studio (Umoni Entertainment Limited 的前身)"制作的一款休闲益智游 ...

  9. 别踩白块儿 开源免费(C++)

    别踩白块儿(C++) 演示视频 调用EasyX图形库,电脑没有安装图形库的话,无法运行 EasyX下载 源码下载 //主要代码,源码请下载源码文件//游戏开始 void Begin() {MOUSEM ...

最新文章

  1. python中函数的作用域_Python中的函数作用域
  2. 几个关于噪声测量的实验
  3. 产品经理对接第三方case,国内外4家公司联动落地项目
  4. DICOM医学图像处理:Dcmtk与fo-dicom保存文件的不同设计模式之“同步VS异步”+“单线程VS多线程”...
  5. Git中pull,commit和push的概念
  6. 一起谈.NET技术,Silverlight实例教程 - Out of Browser的Debug和Notifications窗口
  7. 将两个递增的有序链表合并为一个递增的有序链表。要求结果链表仍使用原来两个链表的存储空间,不另外占用其他的空间。表中不允许又重复的数据
  8. mongo:(2)mongoDB简介
  9. 奖学金设计mysql_基于JAVA的奖学金评定系统设计与实现(MySQL)(含录像)
  10. 两个指针变量可以相减
  11. kindeditor编辑器
  12. 法拉利等12家车厂 将与苹果手机联网(图)
  13. GCN、GAT、凸优化、贝叶斯、MCMC、LDA
  14. windows2008系统缓存修改
  15. Ubuntu安装时出现“failed to load ldlinux.c32”[已解决]
  16. cfd初学者怎么调试适合自己使用的linux系统
  17. 利用SPI编写类似sockscap的代理工具
  18. 网络基础之冲突域和广播域
  19. 正规手游代理该怎么选?
  20. zotero+坚果云+PDF Expert实现ipad与windows文献阅读同步

热门文章

  1. ConcurrentHashMap的扩容方法transfer源码详解
  2. Simpsons’ Hidden Talents
  3. 一文读懂服务式办公室、共享办公室、联合办公空间、开放式工位的关系
  4. 英语作文计算机国际会议开幕词,英文一篇计算机国际会议的开幕词
  5. 2021年4月Bmob无法访问Bmob云服务器
  6. Android问题集锦之三十一:Android Studio: Plugin with id 'android-library' not found
  7. 大事件!全球顶级院士科学家齐聚阿里巴巴
  8. Oracle进阶篇之查看执行计划
  9. 微信注册筛选软件 微信开通筛选技术
  10. python强化学习之Q-learning算法