一、实现思路

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

二、实际效果

三、关键代码分析

QT       += core guigreaterThan(QT_MAJOR_VERSION, 4): QT += widgetsTARGET = whiteblock
TEMPLATE = appSOURCES += main.cpp\mainwindow.cpp \blockdata.cpp \testwidget.cppHEADERS  += mainwindow.h \blockdata.h \testwidget.hFORMS    += mainwindow.ui \testwidget.ui
#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
#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>namespace Ui {class MainWindow;
}class MainWindow : public QMainWindow
{Q_OBJECTpublic:explicit MainWindow(QWidget *parent = 0);~MainWindow();private slots:void on_pushButton_clicked();void on_pushButton_2_clicked();private:Ui::MainWindow *ui;
};#endif // MAINWINDOW_H
#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
#include "blockdata.h"BlockData::BlockData()
{head = NULL;tail = NULL;
}BlockData::~BlockData()
{clear();
}void BlockData::init(BData **d, int x, int y, int width, int height)
{BData *n = *d;n->x = x;n->y = y;n->width = width;n->height = height;n->next = NULL;
}void BlockData::insert(BData *d)
{if(!tail) {head = d;tail = d;return;}tail->next = d;tail = tail->next;
}bool BlockData::remove(int x,int y)
{if(!head)return false;if(x < head->x || head->x + head->width < x|| y < head->y || head->y + head->height < y)return false;BData *n = head;//头尾相同if(n == tail) {head = tail = NULL;} else {head = head->next;}delete n;return true;
}bool BlockData::remove(int x)
{if(!head)return false;if(x < head->x || head->x + head->width < x)return false;BData *n = head;//头尾相同if(n == tail) {head = tail = NULL;} else {head = head->next;}delete n;return true;
}void BlockData::updata(int step)
{BData *n = head;while(n) {n->y += step;n = n->next;}
}bool BlockData::judge(int y)
{if(head && head->y >= y)return false;return true;
}void BlockData::clear()
{BData *n = head;while(n) {head = head->next;delete n;n = head;}tail = 0;
}void BlockData::show()
{BData *n = head;while(n) {printf("%d,%d,%d,%d\n",n->x,n->y,n->width,n->height);n = n->next;}printf("====================\n");fflush(stdout);
}
#include "mainwindow.h"
#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);MainWindow w;w.show();return a.exec();
}
#include "mainwindow.h"
#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);MainWindow::setWindowTitle(tr("钢琴块儿"));connect(ui->widget,&TestWidget::value,this,[=](int value){ui->label->setText(QString::number(value));});
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::on_pushButton_clicked()
{ui->widget->start();ui->widget->setFocus();
}void MainWindow::on_pushButton_2_clicked()
{ui->widget->restart();ui->widget->setFocus();
}
#include "testwidget.h"
#include "ui_testwidget.h"#include <QPainter>
#include <QTime>
#include <QDebug>TestWidget::TestWidget(QWidget *parent) :QWidget(parent),ui(new Ui::TestWidget)
{ui->setupUi(this);connect(&timer,&QTimer::timeout,this,&TestWidget::updateData);timer.setInterval(10);isfailure = false;step = 1;sum=0;QTime time = QTime::currentTime();qsrand(QTime(0,0,0).secsTo(time));QTimer::singleShot(10,this,[=](){setDSize(width()/5,height()/5);});
}TestWidget::~TestWidget()
{delete ui;
}void TestWidget::setDSize(int width, int height)
{Dwidth = width;Dheight = height;
}void TestWidget::start()
{timer.start();
}void TestWidget::restart()
{timer.stop();bData.clear();isfailure = false;step = 1;sum = 0;emit value(sum);timer.start();
}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,"你已失败");}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();
}

四、源码:

Qt小游戏_别踩白块儿

Qt 实现 别踩白块儿。相关推荐

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

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

  2. QT 小游戏 : 别踩白块儿~

    一.实现思路 QPainter 绘制 游戏界面 PS:根据方块坐标链表绘制所有方块 支持两种操作方式 PS:鼠标事件 和 键盘事件(Q,W,E,R,T) 定时器(10ms) 刷新 方块坐标数据 根据得 ...

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

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

  4. Cocos别踩白块儿案列1

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

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

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

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

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

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

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

  8. python 4399别踩白块儿脚本

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

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

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

  10. web学习(2)--别踩白块儿(js版)(web入门)

    废话不多说,就是一个简单的网页版的别踩白块儿 (踩到白块会弹出窗口,手动点击确定才能继续游戏,达到耗费你的游戏时间的目的) HTML:(注意js文件的名字和所放位置,如果和我命名的不一样,注意在第六行 ...

最新文章

  1. Ubuntu下通过CMake文件编译CUDA+OpenCV代码操作步骤
  2. 摸不到视频里的犀牛,却能在它身上画画,特效紧贴凹凸表面,动也不掉:全靠免费AE插件...
  3. go 自定义error怎么判断是否相等_Go Web 小技巧(二)GORM 使用自定义类型
  4. 图书管理系统活动图和时序图
  5. 程序员必不可少的firefox插件推荐
  6. 521分云南考生被北大录取!仅超一本线1分
  7. oracle mysql 透明网关_如何在Oracle中建立透明网关
  8. ORACLE11g安装过程-windows
  9. 编译 php7,编译PHP7
  10. 几十m的中文linux系统,体积只有十几M的linux系统Tiny Core安装体验
  11. Markdown支持的语言
  12. grep awk sed 练习题
  13. 进程通信的几种方式及其各自优缺点
  14. buck斩波电路matlab,直流斩波电路的MATLAB建模与仿真.doc
  15. 笔记本触摸屏使用技巧
  16. Macbook怎么录屏?macbook怎么屏幕录制
  17. VScode 直接运行ts文件
  18. stream_kws_cnn
  19. 奥利给!搞定JVM就靠它了!不看感觉错过一个亿!吐血整理两个月,原创!全网第一份超详细JVM知识点导图!!!
  20. 随手科技企业入选互联网金融协会增选常务理事,消除随手记投资靠谱吗

热门文章

  1. 空气质量等级c语言编程,华中科技大学C语言课设空气质量检测信息管理系统技术分析.docx...
  2. 无线MODEM使用心得
  3. 今天属于李志-梵高先生
  4. 编程:获取股票实时行情数据大全
  5. leetcode刷题java之739. 每日温度
  6. 《测试用例评审》会议纪要模板
  7. marvell raid linux,Marvell SATA Raid控制器 驱动程序下载——更新 Marvell 软件
  8. golang-ffmpeg-goav拉流解码器,支持视频拉流解码并转换为YUV、BGR24或RGB24等图像像素数据
  9. 阶梯形矩阵(Echelon Matrix)
  10. Linux的LILO引导程序,LILO引导程序