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

news2024/11/26 12:23:09

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_NAMESPACE

typedef enum direct {
    dir_UP,
    dir_DOWN,
    dir_LEFT,
    dir_RIGHT
}dir_t;


class Widget : public QWidget
{
    Q_OBJECT

public:
    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 = 0
        leftTop = 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  = 0
        leftTop = 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 ++ ;      // 例如 2
        switch (moveFlag) {
        case dir_UP:
            this->topAddRect();         // +1
            break;
        case dir_DOWN:
            this->downAddRect();     // +1
            break;
        case dir_LEFT:
            this->leftAddRect();        // +1
            break;
        case dir_RIGHT:
            this->rightAddRect();     // +1
            break;
        default:
            break;
        }
        addFood();    // 食物位置变化
        return;
    }

    // 加长蛇身  每次在最前面增加一个
   // while (count--) {
        switch (moveFlag) {
        case dir_UP:
            this->topAddRect();         // +1
            break;
        case dir_DOWN:
            this->downAddRect();     // +1
            break;
        case dir_LEFT:
            this->leftAddRect();        // +1
            break;
        case dir_RIGHT:
            this->rightAddRect();     // +1
            break;
        default:
            break;
        }
    //}

     // 为了动态显示每次最前面插入一个,最后面就减少一个
    deleteLast();       // 删除蛇尾  -1
    this->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.coloradmin.cn/o/844652.html

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

相关文章

java版直播商城平台规划及常见的营销模式 电商源码/小程序/三级分销+商城免费搭建 bbcbbc

​ Java版工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离 1. 涉及平台 平台管理、商家端&#xff08;PC端、手机端&#xff09;、买家平台&#xff08;H5/公众号、小程序、APP端&#xff08;IOS/Android&#xff09;、微服务平台&#xff08;业务服务…

Unity Sort Group(排序组)

** Unity 中的Sort Group组组件允许让Sprite Renderer(精灵渲染器)重新决定渲染顺序. ** 作为组件存在 组件内容&#xff1a; Unity 使用Sort Group 组件的Sort layer 和Order in layer的值来确定排序组在渲染队列内相对与场景内其他排序组和游戏对象的优先级。 属性功能So…

解密时尚RFID服装电商仓储系统

大家好&#xff0c;今天我们要聊一个时尚圈的新宠——RFID服装电商仓储系统&#xff01;是不是听起来就很高端大气上档次&#xff1f;别急&#xff0c;我会来给你扒一扒这个神秘的系统。 首先&#xff0c;咱们得搞清楚什么是RFID。别想太复杂&#xff0c;RFID就是一种让衣服变得…

大数据课程H2——TELECOM的电信流量项目实现

文章作者邮箱&#xff1a;yugongshiyesina.cn 地址&#xff1a;广东惠州 ▲ 本章节目的 ⚪ 了解TELECOM项目的数据收集&#xff1b; ⚪ 了解TELECOM项目的数据清洗&#xff1b; ⚪ 了解TELECOM项目的数据导出&#xff1b; ⚪ 了解TELECOM项目的数据可视化&…

抖音小店规则解读:开设个人店铺,合规经营

抖音小店是抖音平台上的一项功能&#xff0c;允许用户在抖音上开设个人店铺&#xff0c;进行商品销售。下面不若与众将介绍关于抖音小店的一些规则&#xff1a; 1. 店铺资质要求&#xff1a;开设抖音小店需要满足一定的资质要求&#xff0c;包括拥有有效身份证件、年满18周岁、…

Oracle以逗号分隔的字符串拆分为多行数据实例详解

前言 近期在工作中遇到某表某字段是可扩展数据内容&#xff0c;信息以逗号分隔生成的&#xff0c;现需求要根据此字段数据在其它表查询相关的内容展现出来&#xff0c;第一想法是切割数据&#xff0c;以逗号作为切割符&#xff0c;以下为总结的实现方法&#xff0c;以供大家参…

设计中存在的误区

1、子组件&#xff0c;如果想要出现宽度和高度&#xff0c;要在子组件中的最大的盒子定义宽度和高度&#xff0c;才能出现 1.1 你在common.js定义是不管用的&#xff0c;要在自己的盒子中定义长度和高度

Spring 基础

目录 一、什么是 Spring 框架?二、Spring 包含的模块有哪些&#xff1f;2.1 版本2.2 Spring各模块依赖 三、Spring,Spring MVC,Spring Boot 之间什么关系? 一、什么是 Spring 框架? Spring 是一款开源的轻量级 Java 开发框架&#xff0c;旨在提高开发人员的开发效率以及系统…

重要信号换成加地过孔的重要性【从仿真看本质】

文章目录 前言 前言 为什么需要在差分或者重要信号换层时在它们旁边加上地孔呢&#xff1f; 大家可能如果对画 PCB 没有经验的话&#xff0c;可能不太理解为什么差分线在换层时需要在 差分孔旁边打上地孔&#xff0c;这个问题有很多人都不太明白&#xff0c;为什么要这么做&…

K8s集群安全机制(RBAC)

RBAC 基于角色的访问控制

虹科展会丨诚邀您参与8月9-11日上海汽车测试及开发博览会,虹科在【3002】展位等您来!

汽车测试及质量监控博览会&#xff08;中国&#xff09;(Testing Expo China – Automotive)是引领世界的国际博览会&#xff0c;展示汽车测试、开发和验证技术的各个方面&#xff0c;每年在上海举行&#xff0c;并在底特律和斯图加特举办年度姊妹展会。 2023年的汽车测试及质…

python人工智能可以干什么,python人工智能能干什么

大家好&#xff0c;给大家分享一下python做人工智能需要什么水平&#xff0c;很多人还不知道这一点。下面详细解释一下。现在让我们来看看&#xff01; 人工智能包含常用机器学习和深度学习两个很重要的模块&#xff0c;而python拥有matplotlib、Numpy、sklearn、keras等大量的…

Self-Attention、transformer代码、word2vec理论(skip-gram、CNOW)、近似训练 (第十三次组会)

@[TOC](Self-Attention、transformer代码、word2vec理论(skip-gram、CNOW)、近似训练 (第十三次组会)) Self-Attention相关 Transformer代码

成功的公文写作,需要注重结构和表达的准确性

首先&#xff0c;公文需要遵循一定的结构和布局&#xff0c;例如开头、正文和结尾的组成&#xff0c;每个部分的内容和格式都需要符合规范和标准。在结构方面&#xff0c;公文需要具备清晰的逻辑性和条理性&#xff0c;通过段落和标题的使用&#xff0c;使文章结构更加清晰明了…

【C++】STL——set和map及multiset和multiset的介绍及使用

&#x1f680; 作者简介&#xff1a;一名在后端领域学习&#xff0c;并渴望能够学有所成的追梦人。 &#x1f681; 个人主页&#xff1a;不 良 &#x1f525; 系列专栏&#xff1a;&#x1f6f8;C &#x1f6f9;Linux &#x1f4d5; 学习格言&#xff1a;博观而约取&#xff0…

Win7 专业版Windows time w32time服务电脑重启后老是已停止

环境&#xff1a; Win7 专业版 问题描述&#xff1a; Win7 专业版Windows time w32time服务电脑重启后老是已停止 解决方案&#xff1a; 1.检查启动Remote Procedure Call (RPC)、Remote Procedure Call (RPC) Locator&#xff0c;DCOM Server Process Launcher这三个服务是…

re学习(29)攻防世界-CatFly(复原反汇编)

因为这是一个.dll文件&#xff0c;在Linux上运行一下&#xff1a; 找到主要函数&#xff1a;&#xff08;以及由上面三部分对应的代码部分&#xff09; __int64 __fastcall main(int a1, char **a2, char **a3) {size_t v3; // rbx__int16 v5[4]; // [rsp10h] [rbp-4B0h] B…

decimal类型在MySQL中的正确使用 (长度和小数点)

1. MySQL(decimal) 对应 Java(BigDecimal) 2. decimal(16,2) MySQL中类型的设置, 长度16, 保留2位小数 3. 如果长度小于14, 则会出现没小数位的情况

32位M0核单片机XL32F003芯片特征和功能介绍

XL32F003 系列微控制器采用高性能的 32 位 ARMCortex- M0 内核&#xff0c;宽电压工作范围的MCU。嵌入高达64 Kbytes flash和8 Kbytes SRAM存储器&#xff0c;最高工作频率32 MHz。包含多种不同封装类型多款产品。芯片集成多路I2C、SPI、 USART等通讯外设&#xff0c;1路12 bit…

1、sparkStreaming概述

1、sparkStreaming概述 1.1 SparkStreaming是什么 它是一个可扩展&#xff0c;高吞吐具有容错性的流式计算框架 吞吐量&#xff1a;单位时间内成功传输数据的数量 之前我们接触的spark-core和spark-sql都是处理属于离线批处理任务&#xff0c;数据一般都是在固定位置上&…