Qt 实现 别踩白块儿。
一、实现思路
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 实现 别踩白块儿。相关推荐
- 基于Linux、QT、C++的“别踩白块儿”小游戏
基于Linux.QT.C++的"别踩白块儿"小游戏 源码链接 一.功能实现 完善的游戏界面.游戏倒计时.得分记录.历史最高分显示 二.功能描述 1.界面为4*4,一行中只有一个黑块 ...
- QT 小游戏 : 别踩白块儿~
一.实现思路 QPainter 绘制 游戏界面 PS:根据方块坐标链表绘制所有方块 支持两种操作方式 PS:鼠标事件 和 键盘事件(Q,W,E,R,T) 定时器(10ms) 刷新 方块坐标数据 根据得 ...
- python+opencv别踩白块儿游戏辅助,一天一个opencv小项目(已开源)
python+opencv别踩白块儿游戏辅助,一天一个opencv小项目(已开源) 见链接
- Cocos别踩白块儿案列1
Cocos 版本3.10 1.游戏介绍: <别踩白块儿>是由 Umoni Studio (Umoni Entertainment Limited 的前身)"制作的一款休闲益智游 ...
- 别踩白块儿 开源免费(C++)
别踩白块儿(C++) 演示视频 调用EasyX图形库,电脑没有安装图形库的话,无法运行 EasyX下载 源码下载 //主要代码,源码请下载源码文件//游戏开始 void Begin() {MOUSEM ...
- 团队项目代码分析(Android游戏:别踩白块儿)
代码组成部分: 关键代码主要分为三大部分,如下图所示(用思维导图的形式展示): 代码调用关系 通过MainActivity调用其他类❤,具体见核心代码分析! 核心代码分析 public class P ...
- 初学JS——利用JS制作的别踩白块儿(街机模式) 小游戏
初学JS--利用JS制作的别踩白块儿(街机模式) 小游戏 这个是上个星期5写的了,当时是突然想写个游戏,就想到了别踩白块儿,当时的想法是 可能普通模式的别踩白块儿因为他的"块儿"是 ...
- python 4399别踩白块儿脚本
持续无聊中,看到别踩白块儿觉得这个脚本貌似比较好写. 需要用到的python 库如下 import pyautogui from PIL import ImageGrab, Image import ...
- 傅小森的游戏制作之路-别踩白块儿
项目前言 别踩白块儿 这- 还用开发吗? 别人已经制作了呀 触屏版本多的是 是挺多的 但是 你见过按键版本的嘛? 没见过吧 这就是需要开发出来 , 进入项目需求环节 项目需求 别踩白块儿 顾名思义:不 ...
- web学习(2)--别踩白块儿(js版)(web入门)
废话不多说,就是一个简单的网页版的别踩白块儿 (踩到白块会弹出窗口,手动点击确定才能继续游戏,达到耗费你的游戏时间的目的) HTML:(注意js文件的名字和所放位置,如果和我命名的不一样,注意在第六行 ...
最新文章
- Ubuntu下通过CMake文件编译CUDA+OpenCV代码操作步骤
- 摸不到视频里的犀牛,却能在它身上画画,特效紧贴凹凸表面,动也不掉:全靠免费AE插件...
- go 自定义error怎么判断是否相等_Go Web 小技巧(二)GORM 使用自定义类型
- 图书管理系统活动图和时序图
- 程序员必不可少的firefox插件推荐
- 521分云南考生被北大录取!仅超一本线1分
- oracle mysql 透明网关_如何在Oracle中建立透明网关
- ORACLE11g安装过程-windows
- 编译 php7,编译PHP7
- 几十m的中文linux系统,体积只有十几M的linux系统Tiny Core安装体验
- Markdown支持的语言
- grep awk sed 练习题
- 进程通信的几种方式及其各自优缺点
- buck斩波电路matlab,直流斩波电路的MATLAB建模与仿真.doc
- 笔记本触摸屏使用技巧
- Macbook怎么录屏?macbook怎么屏幕录制
- VScode 直接运行ts文件
- stream_kws_cnn
- 奥利给!搞定JVM就靠它了!不看感觉错过一个亿!吐血整理两个月,原创!全网第一份超详细JVM知识点导图!!!
- 随手科技企业入选互联网金融协会增选常务理事,消除随手记投资靠谱吗
热门文章
- 空气质量等级c语言编程,华中科技大学C语言课设空气质量检测信息管理系统技术分析.docx...
- 无线MODEM使用心得
- 今天属于李志-梵高先生
- 编程:获取股票实时行情数据大全
- leetcode刷题java之739. 每日温度
- 《测试用例评审》会议纪要模板
- marvell raid linux,Marvell SATA Raid控制器 驱动程序下载——更新 Marvell 软件
- golang-ffmpeg-goav拉流解码器,支持视频拉流解码并转换为YUV、BGR24或RGB24等图像像素数据
- 阶梯形矩阵(Echelon Matrix)
- Linux的LILO引导程序,LILO引导程序