Qt小项目贪吃蛇实线,主要掌握定时器、信号与槽、按键事件、绘制事件、坐标运算、随机数生成等

Qt小项目贪吃蛇实线,主要掌握定时器、信号与槽、按键事件、绘制事件、坐标运算、随机数生成等

  • Qt 贪吃蛇演示
  • QWidget 绘制界面
  • 项目源文件 注释清晰
    • widget.h
    • widget.cpp
  • 拓展
    • QTimer
    • QKeyEvent
    • QRectF
    • QPointF
    • QPainter
    • QIcon

Qt 贪吃蛇演示

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

QWidget 绘制界面

在这里插入图片描述
在这里插入图片描述

项目源文件 注释清晰

widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QtDebug>#include <QKeyEvent>
#include <QTimer>
#include <QRectF>
#include <QPointF>#include <QIcon>
#include <QPainter>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEtypedef enum direct {dir_UP,dir_DOWN,dir_LEFT,dir_RIGHT
}dir_t;class Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private:void topAddRect();void deleteLast();void downAddRect();void leftAddRect();void rightAddRect();void addFood();bool  checkHit();protected:// 按键按压处理void keyPressEvent(QKeyEvent *event);void paintEvent(QPaintEvent *event);private Q_SLOTS:void my_timeout();private:Ui::Widget *ui;int moveFlag = dir_t::dir_UP;bool gameStart = false;QTimer *timer;const int startTime = 100;// 贪吃蛇QList<QRectF>snakeList;// 贪吃蛇小方块const int  nodeWidth = 20;const  int  nodeHeight = 20;// 食物QRectF food;};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"// 三个方块代码蛇,最上面的第一个和最后面的一个通过按键进行交替删除 即snake[0]永远表示头Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);this->setWindowTitle("贪吃蛇疯子");this->setWindowIcon(QIcon(":/icons/title.jpg"));qDebug()<<"x = "<<this->x()<<" y = "<<this->y()<<" height = "<<this->height()<<" width = "<<this->width();timer = new QTimer();connect(timer, &QTimer::timeout, this , &Widget::my_timeout);// 初始化蛇身子 3个方块QRectF rect(this->width()/2,this->height()/2,nodeWidth,nodeHeight);snakeList.append(rect);topAddRect();topAddRect();// 添加食物addFood();
}Widget::~Widget()
{delete ui;
}// 增加一个方块 左上和右下确认一个方块坐标系
void Widget::topAddRect()
{QPointF leftTop;                // 左上角坐标QPointF rightBottom;       // 右上角坐标if (snakeList[0].y()  <=  0) {// 当蛇移动到窗口顶部:确认新坐标 y = 窗口高度 - 蛇方块高度leftTop = QPointF(snakeList[0].x(), this->height() - nodeHeight);rightBottom  = QPointF(snakeList[0].x() + nodeWidth , this->height());}else {// 向上移动: y坐标必然减少 减少的右下角坐标为之前的下一个方块的右上角坐标leftTop = QPointF(snakeList[0].x(), snakeList[0].y() - nodeHeight);rightBottom = snakeList[0].topRight();}// 插入矩形小方块1个,由于采用的是List链表,这是典型的前插,追加snakeList.insert(0,QRectF(leftTop,rightBottom));
}void Widget::downAddRect()
{QPointF leftTop;                // 左上角坐标QPointF rightBottom;       // 右上角坐标if (snakeList[0].y() > this->height() - nodeHeight) {// 当蛇移动到窗口底部:确认新坐标 y = 0leftTop = QPointF(snakeList[0].x(), 0);rightBottom  = QPointF(snakeList[0].x() + nodeWidth, 0 + nodeHeight);}else {// 向下移动: y坐标必然增加leftTop = QPointF(snakeList[0].x(), snakeList[0].y() + nodeHeight);rightBottom = snakeList[0].bottomRight() + QPointF(0,nodeHeight);}// 插入矩形小方块1个snakeList.insert(0,QRectF(leftTop,rightBottom));
}void Widget::leftAddRect()
{QPointF leftTop;                // 左上角坐标QPointF rightBottom;       // 右上角坐标if (snakeList[0].x() <= 0) {// 当蛇移动到窗口最左部:确认新坐标 x = 窗口宽度 - 小方块宽度leftTop = QPointF(this->width() - nodeWidth, snakeList[0].y());}else {// 向左移动:x坐标必然减少leftTop = QPointF(snakeList[0].x() - nodeWidth, snakeList[0].y());}// 右下角坐标 = 之前一个的左上角坐标x,y + 小方块的宽高rightBottom  = leftTop + QPointF(nodeWidth, nodeHeight);// 插入矩形小方块1个snakeList.insert(0,QRectF(leftTop,rightBottom));
}void Widget::rightAddRect()
{QPointF leftTop;                // 左上角坐标QPointF rightBottom;       // 右上角坐标if (snakeList[0].x() + nodeWidth > this->width()) {// 当蛇移动到窗口最右部:确认新坐标 x  = 0leftTop = QPointF(0, snakeList[0].y());}else {// 向右移动:x坐标必然增加leftTop = QPointF(snakeList[0].x() + nodeWidth, snakeList[0].y());}// 右下角坐标 = 之前一个的左上角坐标x,y + 小方块的宽高rightBottom  = leftTop + QPointF(nodeWidth, nodeHeight);// 插入矩形小方块1个snakeList.insert(0,QRectF(leftTop,rightBottom));
}// 删除蛇身最后一个
void Widget::deleteLast()
{snakeList.removeLast();
}// 食物是随机出现的
void Widget::addFood()
{int rectX = (qrand() % (this->width() / 20)) * 20;int rectY = (qrand() % (this->height() / 20)) * 20;// 控制小球出现的范围if (rectX >= 0 && rectY>=0) {food = QRectF(rectX, rectY, nodeWidth, nodeHeight);qDebug()<<"food = "<<food;}
}// 蛇头和蛇身碰撞检查,其实就是蛇头和蛇尾其中一个方块重合
bool Widget::checkHit()
{// 整个蛇的长度都遍历一遍for (int i =0 ; i < snakeList.length(); i++) {// 从蛇头后的第一个开始检查 只要有for (int j=  i+ 1; j < snakeList.length();j++) {// rect0和rectx相等,表示它们的坐标、宽度和高度都一致if (snakeList[0] == snakeList[j]) {return true;}}}return false;
}void Widget::keyPressEvent(QKeyEvent *event)
{switch (event->key()) {case Qt::Key::Key_Up:if (moveFlag != dir_DOWN) {moveFlag = dir_UP;}break;case Qt::Key::Key_Down:if (moveFlag != dir_UP) {moveFlag = dir_DOWN ;}break;case Qt::Key::Key_Left:if (moveFlag != dir_RIGHT) {moveFlag = dir_LEFT;}break;case Qt::Key::Key_Right:if (moveFlag != dir_LEFT) {moveFlag = dir_RIGHT;}break;case Qt::Key_Space:if (gameStart == false) {gameStart = true;timer->start(startTime); // 100ms}else {gameStart = false;timer->stop();}break;default:break;}
}void Widget::paintEvent(QPaintEvent *event)
{QPainter painter(this);QPen pen;QBrush brush;QPixmap pix;// 绘制图片背景pix.load(":/icons/bg_snake.png");painter.drawPixmap(0,0,this->width(),this->height(),pix);// 绘制蛇pen.setColor(Qt::color0);brush.setColor(Qt::darkGreen);          // 绿色brush.setStyle(Qt::SolidPattern);       // 实线图案painter.setPen(pen);painter.setBrush(brush);for (int i = 0; i < snakeList.length(); i++) {painter.drawRect(snakeList[i]);}// 分数ui->label_score->setText(QString::number(snakeList.length() -3));// 绘制食物painter.drawEllipse(food);// 蛇头碰到蛇身结束游戏if (checkHit()) {QFont font("方正舒体",30,QFont::ExtraLight,false);painter.setFont(font);painter.drawText((this->width() - 200)/2,this->height()/2,QString("游戏结束"));timer->stop();}QWidget::paintEvent(event);}// 定时器槽函数
void Widget::my_timeout()
{//int count = 1;  // 采用这种方式也可以加长蛇身,不过我还是喜欢我的烂方法// 判断蛇是否吃到食物 是否重合[交叉;相交;贯穿;横穿;横断]  蛇变长if (snakeList[0].intersects(food)) {qDebug()<<"吃到食物 snakeList[0] = "<<snakeList[0]<<" food = "<<food;//count ++ ;      // 例如 2switch (moveFlag) {case dir_UP:this->topAddRect();         // +1break;case dir_DOWN:this->downAddRect();     // +1break;case dir_LEFT:this->leftAddRect();        // +1break;case dir_RIGHT:this->rightAddRect();     // +1break;default:break;}addFood();    // 食物位置变化return;}// 加长蛇身  每次在最前面增加一个// while (count--) {switch (moveFlag) {case dir_UP:this->topAddRect();         // +1break;case dir_DOWN:this->downAddRect();     // +1break;case dir_LEFT:this->leftAddRect();        // +1break;case dir_RIGHT:this->rightAddRect();     // +1break;default:break;}//}// 为了动态显示每次最前面插入一个,最后面就减少一个deleteLast();       // 删除蛇尾  -1this->update(); // 刷新绘制函数
}

拓展

QTimer

QTimer是Qt中用于定时器操作的类,它提供了一些常用的函数来控制和管理定时器的运行。下面是一些常用的QTimer函数的简介:

  1. start(int msec): 启动定时器,以指定的毫秒数为间隔触发定时器的timeout()信号。
  2. stop(): 停止定时器,不再触发timeout()信号。
  3. setInterval(int msec): 设置定时器的间隔时间,以毫秒为单位。
  4. interval(): 获取当前定时器的间隔时间。
  5. isActive(): 判断定时器是否处于活动状态,即是否正在运行。
  6. setSingleShot(bool singleShot): 设置定时器的运行模式,如果设置为true,则定时器只触发一次;如果设置为false(默认值),则定时器会一直触发。
  7. singleShot(int msec, const QObject* receiver, const char* member): 创建一个单次触发的定时器,指定触发时间、接收信号的对象和相应的槽函数。
  8. remainingTime(): 获取定时器剩余的触发时间,以毫秒为单位。

这些函数提供了基本的定时器操作功能,可以配合定时器的信号timeout()以及连接(Qt的信号与槽机制)来实现所需的定时操作。

QKeyEvent

QKeyEvent是Qt中用于处理键盘事件的类,它提供了一些常用的函数来获取和处理键盘事件的相关信息。下面是一些常用的QKeyEvent函数的简介:

  1. key(): 获取触发键盘事件的按键的Qt键盘码,返回一个Qt::Key枚举值。
  2. text(): 获取触发键盘事件的按键对应的文字,返回一个QString。
  3. modifiers(): 获取触发键盘事件时的修饰键状态,返回一个Qt::KeyboardModifiers枚举值,可用于检查Shift、Ctrl、Alt等修饰键的状态。
  4. isAutoRepeat(): 判断触发键盘事件的按键是否是自动重复的按下事件。
  5. count(): 获取自动重复按键连续触发的次数。
  6. nativeVirtualKey(): 获取底层平台的虚拟键码,返回一个int值。
  7. nativeModifiers(): 获取底层平台的修饰键状态,返回一个int值。

这些函数可以帮助你获取与键盘事件相关的信息,例如获取按下的键是哪个键,是否同时按下了修饰键,以及自动重复事件的次数等。你可以使用这些函数来处理键盘事件并根据需要执行相应的操作。

QRectF

QRectF是Qt中用于表示浮点数精度的矩形区域的类,它提供了一些常用的函数来操作和管理矩形区域。下面是一些常用的QRectF函数的简介:

  1. QRectF(): 默认构造函数,创建一个无效的矩形区域。
  2. QRectF(qreal x, qreal y, qreal width, qreal height): 构造函数,创建一个以给定坐标、宽度和高度定义的矩形区域。
  3. setRect(qreal x, qreal y, qreal width, qreal height): 设置矩形区域的位置和尺寸。
  4. setCoords(qreal x1, qreal y1, qreal x2, qreal y2): 设置矩形区域的左上角和右下角的坐标。
  5. x(), y(), width(), height(): 获取矩形区域的左上角的x和y坐标,以及宽度和高度。
  6. left(), top(), right(), bottom(): 获取矩形区域的左、上、右、下边界的坐标。
  7. setX(qreal x), setY(qreal y), setWidth(qreal width), setHeight(qreal height): 设置矩形区域的左上角的x和y坐标,以及宽度和高度。
  8. setLeft(qreal left), setTop(qreal top), setRight(qreal right), setBottom(qreal bottom): 设置矩形区域的左、上、右、下边界的坐标。
  9. moveTo(qreal x, qreal y): 移动矩形区域的位置,将其左上角设置为给定坐标。
  10. translated(qreal dx, qreal dy): 平移矩形区域,沿x和y方向分别平移给定的距离。
  11. contains(const QPointF &point): 判断矩形区域是否包含给定的点。
  12. isEmpty(): 判断矩形区域是否为空,即宽度或高度是否为0。
  13. isNull(): 判断矩形区域是否为空,即宽度和高度是否为0。

QPointF

QPointF是Qt中用于表示浮点数精度的二维点的类,它提供了一些常用的函数来操作和管理点的坐标。下面是一些常用的QPointF函数的简介:

  1. QPointF(): 默认构造函数,创建一个具有零值坐标的点。
  2. QPointF(qreal x, qreal y): 构造函数,创建一个具有给定坐标的点。
  3. setX(qreal x), setY(qreal y): 设置点的x和y坐标。
  4. x(), y(): 获取点的x和y坐标。
  5. isNull(): 判断点是否为空,即坐标是否为零值。
  6. manhattanLength(): 计算点到坐标原点的曼哈顿距离(绝对值之和)。
  7. distanceToLine(const QLineF &line): 计算点到给定直线的距离。
  8. distanceToPoint(const QPointF &point): 计算点到给定点的距离。
  9. operator==(const QPointF &p1, const QPointF &p2): 判断两个点是否相等。
  10. operator!=(const QPointF &p1, const QPointF &p2): 判断两个点是否不相等。
  11. isNull(const QPointF &point): 判断给定点是否为空,即坐标是否为零值。

这些函数提供了对点的基本操作,包括设置坐标、获取坐标、判断点是否为空、计算与其他点或直线的距离等。你可以使用这些函数来创建、修改和计算点的坐标,以满足你的需求。

QPainter

QPainter是Qt提供的一个用于绘图的类,它封装了绘制图形、图像以及文本的功能。下面是一些常用的QPainter函数的简介:

  1. begin(QPaintDevice *device): 开始在给定的绘图设备上进行绘制,device可以是QWidget、QImage等。
  2. end(): 结束绘制操作。
  3. setPen(const QPen &pen): 设置绘制的画笔,用于定义线条的样式、颜色等属性。
  4. setBrush(const QBrush &brush): 设置绘制的刷子,用于填充封闭图形的颜色、渐变等属性。
  5. setRenderHint(RenderHint hint, bool on = true): 开启或关闭绘制的渲染提示,例如抗锯齿、文本反锯齿等。
  6. drawLine(const QLine &line): 绘制直线。
  7. drawRect(const QRect &rect): 绘制矩形。
  8. drawEllipse(const QRect &rect): 绘制椭圆。
  9. drawText(const QPointF &pos, const QString &text): 在给定点位置绘制文本。
  10. drawPixmap(const QRectF &targetRect, const QPixmap &pixmap): 在给定矩形区域绘制像素图。
  11. save(), restore(): 保存和恢复绘图状态,用于实现绘制状态的切换、叠加效果等。
  12. resetTransform(): 重置坐标变换矩阵。
  13. translate(qreal dx, qreal dy): 平移画笔的原点。
  14. scale(qreal sx, qreal sy): 缩放画笔,按比例调整绘图。
  15. rotate(qreal angle): 旋转画笔,围绕原点进行旋转。

这些函数提供了绘制基本图形、文本和图像的能力,通过设置画笔、刷子和渲染提示等属性,可以实现不同样式的绘制效果。同时,你还可以使用平移、缩放和旋转等变换函数来改变画笔的绘制位置和方向。使用这些函数,你可以实现各种绘图需求,创建出丰富多样的用户界面。

QIcon

QIcon是Qt提供的一个用于管理图标的类,它可以加载、显示和操作图标。下面是一些常用的QIcon函数的简介:

  1. QIcon(): 默认构造函数,创建一个空的图标。
  2. QIcon(const QString &filename): 构造函数,根据给定的文件名加载图标。
  3. QIcon(const QPixmap &pixmap): 构造函数,根据给定的像素图创建图标。
  4. QIcon(const QIcon &other): 拷贝构造函数,创建一个与给定图标相同的拷贝。
  5. addFile(const QString &filename, const QSize &size = QSize(), QIcon::Mode mode = QIcon::Normal, QIcon::State state = QIcon::Off): 添加一个图像文件到图标中,可以指定图像的大小、模式和状态。
  6. isNull(): 判断图标是否为空,即没有加载任何图像。
  7. pixmap(const QSize &size, QIcon::Mode mode = QIcon::Normal, QIcon::State state = QIcon::Off) const: 获取图标的像素图,可以指定图像的大小、模式和状态。
  8. paint(QPainter *painter, const QRect &rect, Qt::Alignment alignment = Qt::AlignCenter, QIcon::Mode mode = QIcon::Normal, QIcon::State state = QIcon::Off) const: 在给定的矩形区域内绘制图标,可以指定对齐方式、模式和状态。
  9. operator=(const QIcon &other): 赋值运算符,将给定图标的内容复制到当前图标。
  10. operator==, operator!=: 用于比较两个图标是否相等或不相等。

这些函数提供了加载、显示和操作图标的功能,你可以根据需要加载图像文件,设置图标的大小、模式和状态,绘制图标到指定的区域,并进行图标的比较和赋值操作。QIcon类在Qt中广泛用于界面开发,它使得图标的管理和使用变得简单和灵活。

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

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

相关文章

开关电源控制--电流纹波率

什么是电流纹波率 电流纹波率&#xff08;Current Ripple Ratio&#xff09;是开关电源控制中一个重要的参数。它表示输出电流的波动程度&#xff0c;通常以百分比表示。 当电流纹波率为0.4时&#xff0c;意味着输出电流的波动相对较小&#xff0c;波动范围约为输出电流的0.4…

【Java split】split() 函数分割字符串出现空格的问题以及带转义符号的字符串分割为数组(106)

本文重点&#xff1a; 1.带转义符号的字符串转数组格式&#xff1b; 2.split() 函数分割空字符串后数组中元素前出现空格&#xff1b; 3.split() 函数分割需注意的问题&#xff1b; 测试代码&#xff1a; import java.util.ArrayList; import java.util.Arrays; import java.u…

Python 程序设计入门(013)—— 字典的操作(2):字典的常用操作总结

Python 程序设计入门&#xff08;013&#xff09;—— 字典的操作&#xff08;2&#xff09;&#xff1a;字典的常用操作总结 目录 Python 程序设计入门&#xff08;013&#xff09;—— 字典的操作&#xff08;2&#xff09;&#xff1a;字典的常用操作总结一、获取字典中元素…

JUC并发编程之CAS

目录 1.什么是CAS 1.1 CAS的定义 1.2 CAS的应用场景 2. CAS的原理 2.1 比较和交换操作 2.2 CAS的实现原理 2.3 CAS的ABA问题及解决方案 3. Java中的CAS 3.1 java.util.concurrent.atomic 包 3.2 AtomicInteger 与 AtomicLong 3.3 ABA问题的解决&#xff1a;AtomicSta…

JavaScript 原型链解析,宏任务和微任务

目录 什么是原型链&#xff1f; 原型与构造函数 原型链的工作原理 实例&#xff1a;理解原型链 宏任务&#xff08;Macro Task&#xff09; 微任务&#xff08;Micro Task&#xff09; 什么是原型链&#xff1f; JavaScript 是一门基于原型的语言&#xff0c;而原型链是…

C# 有效的字母异位词

242 有效的字母异位词 给定两个字符串 和 &#xff0c;编写一个函数来判断 是否是 的字母异位词。stts 注意&#xff1a;若 和 中每个字符出现的次数都相同&#xff0c;则称 和 互为字母异位词。stst 示例 1: 输入: s “anagram”, t “nagaram” 输出: true 示例 2: 输…

11. Redis基础知识

文章目录 一、概述二、数据类型STRINGLISTSETHASHZSET 三、数据结构字典跳跃表 四、使用场景计数器缓存查找表消息队列会话缓存分布式锁实现其它 五、Redis 与 Memcached数据类型数据持久化分布式内存管理机制 六、键的过期时间七、数据淘汰策略八、持久化RDB 持久化AOF 持久化…

Netty:ByteBuf的最大快速可以写入字节数

说明 通过io.netty.buffer.ByteBuf的maxFastWritableBytes()函数可以得到最大快速可写入字节数。最大快速可写入字节数表示没有内部再分配内存的情况下肯定可以写入的最大字节数。maxFastWritableBytes() capacity&#xff08;容量&#xff09; - writerIndexwritableBytes()…

【C++从0到王者】第十八站:手把手教你写一个简单的优先级队列

文章目录 一、优先级队列简介二、优先级队列的接口说明1.基本介绍及其使用2.构造函数3.求数组中第k个最大的元素 三、手撕优先级队列四、仿函数1.仿函数介绍2.优先级队列添加仿函数3.需要自己写仿函数的情形 五、优先级队列完整代码 一、优先级队列简介 优先级队列是一种容器适…

Java经典面试题总结(一)

Java经典面试题总结&#xff08;一&#xff09; 题一&#xff1a;Java编译运行原理题二&#xff1a;JDK&#xff0c;JVM&#xff0c;JRE三者之间的关系题三&#xff1a;谈一下对冯诺依曼体系的了解题四&#xff1a;重载与重写的区别题五&#xff1a;拆箱装箱是指什么&#xff1…

Diffusion-GAN: Training GANs with Diffusion

目录 Abstract 1. Introduction 2. Preliminaries: GANs and diffusion-based generative models 3. Diffusion-GAN: Method and Theoretical Analysis 3.1 Instance noise injection via diffusion 3.2 Adversarial Training 3.3 Adaptive diffffusion 3.4 Theoretica…

微服务技术栈

微服务技术栈是指在开发和构建微服务架构时使用的一组技术和工具。微服务架构是一种软件开发模式&#xff0c;将一个大型应用程序拆分为一组小型、自治的服务&#xff0c;每个服务独立部署、可独立扩展&#xff0c;并通过轻量级的通信机制进行互相协作。 微服务技术栈通常包括…

Netty 入门指南

文章目录 前言Netty介绍Netty发展历程Netty核心组件实现HTTP服务器总结 前言 上文《BIO、NIO、IO多路复用模型详细介绍&Java NIO 网络编程》介绍了几种IO模型以及Java NIO&#xff0c;了解了在网络编程时使用哪种模型可以提高系统性能及效率。即使Java NIO可以帮助开发人员…

44.实现爱尔兰B公式计算并输出表格(matlab程序)

1.简述 1.话务量定义 话务量指在一特定时间内呼叫次数与每次呼叫平均占用时间的乘积。 话务量反映了电话负荷的大小&#xff0c;与呼叫强度和呼叫保持时间有关。呼叫强度是单位时间内发生的呼叫次数&#xff0c;呼叫保持时间也就是占用时间。 话务量计算方法 话务量公式为…

[CKA]考试之集群故障排查 – kubelet故障

由于最新的CKA考试改版&#xff0c;不允许存储书签&#xff0c;本博客致力怎么一步步从官网把答案找到&#xff0c;如何修改把题做对&#xff0c;下面开始我们的 CKA之旅 题目为&#xff1a; Task 一个名为wk8s-node-0的节点状态为NotReady&#xff0c;让其他恢复至正常状态…

c++调用ffmpeg api录屏 并进行udp组播推流

代码及工程见https://download.csdn.net/download/daqinzl/88155241 开发工具&#xff1a;visual studio 2019 播放&#xff0c;采用ffmpeg工具集里的ffplay.exe, 执行命令 ffplay udp://224.1.1.1:5001 主要代码如下: #include "pch.h" #include <iostream>…

RANSAC算法在Python中的实现与应用探索:线性拟合与平面拟合示例

第一部分:RANSAC算法与其应用 在我们的日常生活和多个领域中,如机器学习,计算机视觉,模式识别等,处理数据是一个非常重要的任务。尤其是当我们需要从嘈杂的数据中获取信息或拟合模型时。有时候,数据可能包含异常值或噪声,这可能会对我们的结果产生重大影响。为了解决这…

【搜索】DFS剪枝与优化

算法提高课笔记 目录 小猫爬山题意思路代码 数独题意思路代码 木棒题意思路代码 生日蛋糕题意思路代码 剪枝是什么意思呢&#xff1f; 我们知道&#xff0c;不管是内部搜索还是外部搜索&#xff0c;都可以形成一棵搜索树&#xff0c;如果将搜索树全部遍历一遍&#xff0c;效率…

【深度学习_TensorFlow】误差函数

写在前面 搭建完网络层后&#xff0c;在每层网络中都要进行前向计算&#xff0c;下一步就是选择合适的误差函数来计算误差。其中均方差函数和交叉熵函数在深度学习中比较常见&#xff0c;均方差函数主要用于回归问题&#xff0c;交叉熵函数主要用于分类问题。 写在中间 均方差…

低功耗LoRaWAN国产低功耗LoRa+RF射频前端芯片XD6500S

目录 典型应用XD6500S简介芯片特性 LoRa系列选型参考 LoRa是为低数据速率、远距离距离和超低功耗而优化的扩频协议&#xff0c;用于LPWAN应用程序的通信。 典型应用 一、智慧农业   智慧农业大田解决方案利用传感设备、自动化控制设备、气象站实时监测采集田间土壤墒情、气象…