C++ Qt 待机弹球游戏

以前的电视机待机时,都有一个球在界面弹来弹去,碰到边界则改变颜色和方向。

设计算法实现该效果,qt实现界面,C++实现运动轨迹,及颜色变化。

详细注释

效果如图

 运动轨迹控制类头文件

#ifndef CMOTIONCONTROL_H
#define CMOTIONCONTROL_H#include <vector>
#include <string>/*** @brief  坐标信息结构体* @author GGX* @date   2023-08-13*/
struct SPoint
{int x;int y;/*** @brief  重载操作符* @param  [in] point 自增信息* @return 无* @author GGX* @date   2023-08-13*/SPoint & operator+=(SPoint point){x += point.x;y += point.y;return *this;}/*** @brief  判断X是否在范围内* @param  [in] lX 范围左区间* @param  [in] rX 范围右区间* @return  true 在范围内,false不在范围内* @author GGX* @date   2023-08-13*/bool isRangeX(int lX, int rX){return x > lX && x < rX;}/*** @brief  判断Y是否在范围内* @param  [in] lY 范围左区间* @param  [in] rY 范围右区间* @return  true 在范围内,false不在范围内* @author GGX* @date   2023-08-13*/bool isRangeY(int lY, int rY){return y > lY && y < rY;}
};/*** @brief  弹球控制类* @author GGX* @date   2023-08-13*/
class CMotionControl
{
public:CMotionControl();/*** @brief  设置坐标位置* @param  [in] x 坐标轴* @param  [in] y 坐标轴* @return 无* @author GGX* @date   2023-08-13*/void setPoint(int x, int y);/*** @brief  获取坐标位置* @param  无* @return SPoint 坐标位置* @author GGX* @date   2023-08-13*/SPoint getPoint();/*** @brief  设置范围右区间* @param  [in] x 坐标轴* @param  [in] y 坐标轴* @return SPoint 坐标位置* @author GGX* @date   2023-08-13*/void setRange(int x, int y);/*** @brief  设置步进值* @param  [in] SPoint x,y步进值* @return 无* @author GGX* @date   2023-08-13*/void setStep(SPoint step);/*** @brief  在坐标范围内移动弹球位置* @param  [in] SPoint x,y步进值* @return 无* @author GGX* @date   2023-08-13*/bool move();/*** @brief  获取弹球颜色* @param  无* @return std::string 弹球颜色* @author GGX* @date   2023-08-13*/std::string color();/*** @brief  获取弹球边框颜色* @param  无* @return std::string 弹球边框颜色* @author GGX* @date   2023-08-13*/std::string borderColor();protected:/*** @brief  初始化弹球颜色* @param  无* @return 无* @author GGX* @date   2023-08-13*/void initColor();private:SPoint m_Point;     //弹球位置SPoint m_Range;     //范围右区间SPoint m_Step;      //步进值size_t m_indexColor;    //当前弹球颜色std::vector<std::string> m_colors;  //弹球颜色容器
};#endif // CMOTIONCONTROL_H

运动轨迹控制类源文件

#include "cmotioncontrol.h"CMotionControl::CMotionControl()
{m_Point = {0, 0};m_Range = {0, 0};m_Step  = {0, 0};initColor();
}void CMotionControl::setPoint(int x, int y)
{m_Point = {x, y};
}SPoint CMotionControl::getPoint()
{return m_Point;
}void CMotionControl::setRange(int x, int y)
{m_Range = {x, y};
}void CMotionControl::setStep(SPoint step)
{m_Step = step;
}bool CMotionControl::move()
{//弹球是否碰壁bool bChange = false;if (!m_Point.isRangeX(0, m_Range.x)){//若是超出范围,则按反方向移动m_Step.x = -m_Step.x;bChange = true;}if (!m_Point.isRangeY(0, m_Range.y)){//若是超出范围,则按反方向移动m_Step.y = -m_Step.y;bChange = true;}if (bChange){//弹球碰壁,则变换颜色m_indexColor++;}if (m_indexColor >= m_colors.size()){m_indexColor = 0;}//弹球位置移动m_Point += m_Step;return bChange;
}std::string CMotionControl::color()
{return m_colors.at(m_indexColor);
}std::string CMotionControl::borderColor()
{return m_colors.at(m_colors.size() - m_indexColor - 1);
}void CMotionControl::initColor()
{m_indexColor = 0;//    m_colors.emplace_back("color0");
//    m_colors.emplace_back("color1");m_colors.emplace_back("black");m_colors.emplace_back("white");m_colors.emplace_back("darkGray");m_colors.emplace_back("gray");m_colors.emplace_back("lightGray");m_colors.emplace_back("red");m_colors.emplace_back("green");m_colors.emplace_back("blue");m_colors.emplace_back("darkGray");m_colors.emplace_back("cyan");m_colors.emplace_back("magenta");m_colors.emplace_back("yellow");m_colors.emplace_back("darkRed");m_colors.emplace_back("darkGray");m_colors.emplace_back("darkGreen");m_colors.emplace_back("darkBlue");m_colors.emplace_back("darkCyan");m_colors.emplace_back("darkMagenta");m_colors.emplace_back("darkYellow");
//    m_colors.emplace_back("transparent");
}

QT界面头文件

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <qtimer.h>class CMotionControl;namespace Ui
{
class MainWindow;
}class MainWindow : public QMainWindow
{Q_OBJECTpublic:explicit MainWindow(QWidget *parent = 0);~MainWindow();private slots:void slTimer();void on_start_clicked();private:Ui::MainWindow *ui;int m_step;             //每次移动的像素CMotionControl *m_pMotionControl; //控制弹球运动轨迹及颜色QTimer      *m_pTimer;  //定时器,触发移动
};#endif // MAINWINDOW_H

QT界面源文件

#include "mainwindow.h"
#include "ui_mainwindow.h"#include "qdebug.h"
#include "cmotioncontrol.h"MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);m_pTimer = new QTimer(this);connect(m_pTimer, SIGNAL(timeout()), this, SLOT(slTimer()));m_step = 10;m_pMotionControl = new CMotionControl();m_pMotionControl->setStep({m_step, m_step});
}MainWindow::~MainWindow()
{delete ui;delete m_pTimer;delete m_pMotionControl;
}void MainWindow::slTimer()
{//移动弹球坐标bool bChange = m_pMotionControl->move();//获取移动后的位置SPoint point = m_pMotionControl->getPoint();//移动弹球ui->label_point->move(point.x, point.y);//弹球碰壁则改变颜色if (bChange){QString bgColor = m_pMotionControl->color().c_str();QString bdColor = m_pMotionControl->borderColor().c_str();int length = 100;QString strColor = "";strColor.append(QString("min-width:%1px;").arg(length));strColor.append(QString("min-height:%1px;").arg(length));strColor.append(QString("max-width:%1px;").arg(length));strColor.append(QString("max-height:%1px;").arg(length));strColor.append(QString("border-radius:%1px;").arg(length / 2));strColor.append(QString("border:%1px solid %2;").arg(3).arg(bdColor));strColor.append(QString("background-color:%1;").arg(bgColor));ui->label_point->setStyleSheet(QString("QLabel{%1}").arg(strColor));  //设置样式表}qDebug() << "SPoint: {" << point.x << ", " << point.y << "}";
}void MainWindow::on_start_clicked()
{//设置弹球起点m_pMotionControl->setPoint(ui->label_point->pos().x(),ui->label_point->pos().y());//设置弹球范围m_pMotionControl->setRange(width() - ui->label_point->width() - m_step,height() - ui->label_point->height() - m_step);int msec = 50;//启停定时器if (m_pTimer->isActive()){m_pTimer->stop();}else{m_pTimer->start(msec);}
}

码云地址:svn://gitee.com/gongguixing/daily-learning/qt_ui/Pinball

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/75962.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

靠写作,我小赚了五位数!

玩AI已经有一段时间&#xff0c;会员群里现在很多小伙伴对AI的工具都是如数家珍&#xff01;因为我自己本身是程序猿出身&#xff0c;但是群里其实很多同学都不是很懂程序。下面我们要开展一个非常接底气的活动&#xff0c;就是AI写作。AI写作其实是非常有意思的事情&#xff0…

【11】Redis学习笔记 (微软windows版本)【Redis】

注意:官redis方不支持windows版本 只支持linux 此笔记是依托微软开发windows版本学习 一、前言 Redis简介&#xff1a; Redis&#xff08;Remote Dictionary Server&#xff09;是一个开源的内存数据结构存储系统&#xff0c;它也被称为数据结构服务器。Redis以键值对&am…

Docker自学:利用FastAPI建立一个简单的web app

环境配置&#xff1a;下载Docker Desktop 文件一&#xff1a;main.py from typing import Unionfrom fastapi import FastAPIimport uvicornapp FastAPI()app.get("/") def read_root():return {"Hello": "World"}app.get("/items/{item…

机器学习与模式识别3(线性回归与逻辑回归)

一、线性回归与逻辑回归简介 线性回归主要功能是拟合数据&#xff0c;常用平方误差函数。 逻辑回归主要功能是区分数据&#xff0c;找到决策边界&#xff0c;常用交叉熵。 二、线性回归与逻辑回归的实现 1.线性回归 利用回归方程对一个或多个特征值和目标值之间的关系进行建模…

Win11游戏高性能模式怎么开

1、点击桌面任务栏上的“开始”图标&#xff0c;在打开的应用中&#xff0c;点击“设置”&#xff1b; 2、“设置”窗口&#xff0c;左侧找到“游戏”选项&#xff0c;在右侧的选项中&#xff0c;找到并点击打开“游戏模式”&#xff1b; 3、打开的“游戏模式”中&#xff0c;找…

MySQL8.0.26-Linux版安装

MySQL8.0.26-Linux版安装 1. 准备一台Linux服务器 云服务器或者虚拟机都可以; Linux的版本为 CentOS7; 2. 下载Linux版MySQL安装包 MySQL :: Download MySQL Community Server (Archived Versions) 3. 上传MySQL安装包 4. 创建目录,并解压 mkdir mysql ​ tar -xvf mysql-8…

从 Ansible Galaxy 使用角色

从 Ansible Galaxy 使用角色 根据下列要求&#xff0c;创建一个名为 /home/curtis/ansible/roles.yml 的 playbook &#xff1a; playbook 中包含一个 play&#xff0c; 该 play 在 balancers 主机组中的主机上运行并将使用 balancer 角色。 此角色配置一项服务&#xff0c;以…

机器学习深度学习——transformer(机器翻译的再实现)

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位即将上大四&#xff0c;正专攻机器学习的保研er &#x1f30c;上期文章&#xff1a;机器学习&&深度学习——自注意力和位置编码&#xff08;数学推导代码实现&#xff09; &#x1f4da;订阅专栏&#xff1a;机器…

【论文阅读】 Model Sparsity Can Simplify Machine Unlearning

Model Sparsity Can Simplify Machine Unlearning 背景主要内容Contribution Ⅰ&#xff1a;对Machine Unlearning的一个全面的理解Contribution Ⅱ&#xff1a;说明model sparsity对Machine Unlearning的好处Pruning方法的选择sparse-aware的unlearning framework Experiments…

Linux问题--docker启动mysql时提示3306端口被占用

问题描述&#xff1a; 解决方法&#xff1a; 1.如果需要kill掉mysqld服务可以先通过 lsof -i :3306 2. 查询到占用3306的PID&#xff0c;随后使用 kill -15 PID 来kill掉mysqld服务。 最后结果

Python打包可执行文件-cx_Freeze

目录 简介 安装 问题处理 使用 打包 简介 之前有篇文章有使用pyinstaller打包.exe文件&#xff0c;但是没有详细介绍过&#xff0c;这次整理下 python入门-从安装环境配置(Anaconda)到做一个下班打卡提醒.exe小工具_瑶山的博客-CSDN博客 Python程序发布时&#xff0c;通常…

chatGPT-对话爱因斯坦

引言 阿尔伯特爱因斯坦&#xff08; 1879年 3 月 14 日 – 1955 年 4 月 18 日&#xff09;是一位出生于德国的理论物理学家&#xff0c;被广泛认为成为有史以来最伟大、最有影响力的科学家之一。他以发展相对论而闻名&#xff0c;他还对量子力学做出了重要贡献&#xff0c;因…