【Qt项目专栏】贪吃蛇小游戏1.0

news2024/11/24 14:25:36

  • 博客主页:Duck Bro 博客主页
  • 系列专栏:Qt 专栏
  • 关注博主,后期持续更新系列文章
  • 如果有错误感谢请大家批评指出,及时修改
  • 感谢大家点赞👍收藏⭐评论✍

贪吃蛇小游戏1.0

项目编号:01

文章目录

  • 贪吃蛇小游戏1.0
    • 一、项目介绍及演示
      • 1. 项目介绍
      • 2. 项目演示
      • 3. 窗口介绍
        • 3.1 游戏大厅窗口
        • 3.2 游戏关卡选择窗口
        • 3.3 游戏房间窗口
    • 二、创建项目及资源配置
      • 1. 创建项目(QWidget)
      • 2. 资源配置(图片声音素材)
    • 三、项目实现
      • 1. 游戏大厅
        • 1.1 重写绘图事件
        • 1.2 设置窗口大小、图标、标题
        • 1.3 设置开始按钮样式
      • 2. 游戏关卡选择
        • 2.1 创建GameSelect类
        • 2.2 连接按钮和窗口跳转
      • 3. 游戏房间
        • 3.1 创建GameRoom类
        • 3.2 对游戏房间数据结构进行封装
        • 3.3 初始化游戏房间界面
        • 3.4 绘制界面窗口
        • 3.5 蛇的移动
        • 3.6 绘制蛇头身体尾巴
        • 3.6 绘制食物与分数
        • 3.7 判定游戏结束
        • 3.8 随机生成食物节点
        • 3.9 创建游戏开始和暂停按钮
        • 3.10 实现定时器的超时槽函数
        • 3.11 设置游戏退出按钮
        • 3.12 获取历史战绩
    • 四、项目源码获取
      • 1. 网盘链接
      • 2. Gitee链接


一、项目介绍及演示

1. 项目介绍

贪吃蛇游戏规则:简单来说,贪吃蛇游戏规则是玩家通过四个方向键来控制蛇的移动控制其在地图上吃豆子。蛇运动过程中撞到墙壁或蛇身,则立即结束游戏。

当前是贪吃蛇1.0版本,后续会对贪吃蛇游戏进行美化及增加更多功能,尽情期待。
在贪吃蛇2.0中会对项目进行图片的美化,及键盘快捷键的添加。

2. 项目演示

动图演示【GIF动图演示】
在这里插入图片描述

3. 窗口介绍

3.1 游戏大厅窗口

在首页中有历史战绩、开始游戏两个按钮。历史战绩用于展示以前游玩的历史记录;开始游戏用于跳转到游戏关卡选择难度界面。
在这里插入图片描述

3.2 游戏关卡选择窗口

在这里插入图片描述

3.3 游戏房间窗口

在这里插入图片描述


二、创建项目及资源配置

1. 创建项目(QWidget)

在桌面上创建一个名为Snake的文件夹,用于存放项目代码

在这里插入图片描述
打开Qt,点击新建项目
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

2. 资源配置(图片声音素材)

在上述创建完成后,新建一个qrc文件,步骤如下
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
完成上述步骤,将素材包复制到项目中
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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


三、项目实现

1. 游戏大厅

1.1 重写绘图事件

在gamehall.h文件中,进行重写绘图事件函数的声明

在这里插入图片描述

鼠标当到painEvent函数上点击Alt+Enter(回车),为painEvent函数添加定义

在这里插入图片描述
在上述过程后,开始编辑painEvent函数。
第一步,先实例化画家,使用QPainter painter(this)实例化一个画家,this是让画家在当前窗口(gamehall)进行绘制。注意在使用QPainter需要包含头文件#include<QPainter>
第二步,再实例化绘图设备,将图片加载到绘图设备中。注意在使用QPixmap需要包含头文件#include<QPixmap>
第三步,再进行绘画,使用drawPixmap()方法,参数1和参数2,表示绘制开始的坐标;参数3,表示绘制的宽度;参数4,表示绘制的高度;参数5,表示绘制的图片。

void GameHall::paintEvent(QPaintEvent *event)
{
    //实例化画家,this:让画家在当前窗口进行绘制
    QPainter painter(this);
    //实例化绘图设备
    QPixmap pix(":/res/game_hall.png");
    //绘画 0,0从界面左上角开始绘画根据窗口的宽和高进行绘制
    painter.drawPixmap(0,0,this->width(),this->height(),pix);
}
1.2 设置窗口大小、图标、标题

第一步,先修改窗口的大小通过setFixedSize()方法将窗口的宽度设置为1000,高度设置为800。
第二步,设置窗口的图标先通过QIcon()将图片加载到项目中,再通过setWindowIcon()方法设置到窗口中。
第三步,设置窗口的标题通过setWindowTitle()方法将文字设置到窗口标题中。

GameHall::GameHall(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::GameHall)
{
    ui->setupUi(this);
    //设置窗口大小
    this->setFixedSize(1000,800);
    //设置窗口的图标
    this->setWindowIcon(QIcon(":/res/ico.png"));
    //设置窗口标题
    this->setWindowTitle("游戏大厅");
}
1.3 设置开始按钮样式

第一步,通过QPushButton创建一个游戏开始按钮,按钮文本设置为"开始游戏",this在父窗口中显示。
第二步,通过move移动按钮再窗口中的位置,消除按钮的边框。
第三步,修改按钮中的文本样式,需要先创建一个字体样式(字体为黑体,大小为20像素),最后通过setFont方法将字体样式加载到按钮中。

GameHall::GameHall(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::GameHall)
{
    ui->setupUi(this);
    //设置窗口大小
    this->setFixedSize(1000,800);
    //设置窗口的图标
    this->setWindowIcon(QIcon(":/res/ico.png"));
    //设置窗口标题
    this->setWindowTitle("游戏大厅");


    //添加开始游戏按钮
    QPushButton * startButton = new QPushButton("开始游戏",this);
    //设置按钮的位置
    startButton->move(450,600);
    //消除按钮边框
    startButton->setStyleSheet("QPushButton{border:0px}");
    //创建字体样式
    QFont font("黑体", 20);
    //将字体样式加入到按钮文本中
    startButton->setFont(font);

}

点击运行,游戏大厅窗口界面就完成了,如下图
在这里插入图片描述

2. 游戏关卡选择

2.1 创建GameSelect类

先创建一个新的类,名为为GameSelect,基类选择QWidget
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.2 连接按钮和窗口跳转

在gamehall.cpp中进行编辑按钮的信号和槽,实现点击按钮跳转至关卡选择窗口
第一步,先创建出一个GameSelect窗口,在创建时要包含头文件#include "gameselect.h"
第二步,进行连接使用connnect()方法进行信号和槽函数之间的连接,使用Lambda表达式进行槽函数的编写。
第三步,编辑Lambda表达式,使用close()方法关闭当前窗口。
第四步,将关卡选择窗口设置为同游戏大厅窗口大小相同。
第五步,打开游戏关卡选择窗口。
第六步,给按钮添加点击音效,首先在.pro文件中添加multimedia,然后使用play()进行添加音效。
在这里插入图片描述

#include "gamehall.h"
#include "ui_gamehall.h"
#include "gameselect.h"
#include <QPainter>
#include <QPixmap>
#include <QIcon>
#include <QPushButton>
#include <QFont>
#include <QSound>
GameHall::GameHall(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::GameHall)
{
    ui->setupUi(this);
    //设置窗口大小
    this->setFixedSize(1000,800);
    //设置窗口的图标
    this->setWindowIcon(QIcon(":/res/ico.png"));
    //设置窗口标题
    this->setWindowTitle("游戏大厅");


    //添加开始游戏按钮
    QPushButton * startButton = new QPushButton("开始游戏",this);
    //设置按钮的位置
    startButton->move(450,600);
    //消除按钮边框
    startButton->setStyleSheet("QPushButton{border:0px}");
    //创建字体样式
    QFont font("黑体", 20);
    //将字体样式加入到按钮文本中
    startButton->setFont(font);
    //新建GameSelect窗口
    GameSelect * gameSelect = new GameSelect;

    //Lambda表达式
    connect(startButton,&QPushButton::clicked,[=](){
        //先关闭当前窗口
        this->close();
        //设置gameSelect窗口大小跟gamehall窗口大小一样
        gameSelect->setGeometry(this->geometry());
        //打开gameselect窗口
        gameSelect->show();
        //添加按钮点击的音效
        QSound::play(":/res/clicked.wav");

    });

}

编写gameselect.h文件,同游戏大厅步骤,这里不重复进行介绍,,详细看下下方代码注释。

在这里插入图片描述

#include "gameselect.h"
#include "gamehall.h"
#include <QPainter>
#include <QPixmap>
#include <QPushButton>
#include <QIcon>
#include <QSound>
GameSelect::GameSelect(QWidget *parent) : QWidget(parent)
{
    //设置窗口大小
    this->setFixedSize(1000,800);
    //设置窗口的图标
    this->setWindowIcon(QIcon(":/res/ico.png"));
    //设置窗口标题
    this->setWindowTitle("关卡选择");


    //创建返回按钮
    QPushButton * returnbutton = new QPushButton(this);
    returnbutton->resize(50,50);
    returnbutton->setIcon(QIcon(":/res/back.png"));
    returnbutton->setIconSize(returnbutton->size());
    returnbutton->move(900,700);

    //建立信号和槽函数的联系
    connect(returnbutton,&QPushButton::clicked,[=](){
        //创建游戏大厅窗口
        GameHall * gamehall = new GameHall;
        //关闭当前窗口
        this->close();
        //展开游戏大厅窗口
        gamehall->show();
        //添加音效
        QSound::play(":/res/clicked.wav");

    });

    //创建文本样式
    QFont font("黑体",30);

    //创建简单难度按钮
    QPushButton * simplebutton = new QPushButton("简单模式",this);
    //将样式设置到按钮中
    simplebutton->setFont(font);
    //设置按钮在窗口中的位置
    simplebutton->move(400,170);
    //进行信号与槽的连接
    
    //创建普通难度按钮
    QPushButton * commonbutton = new QPushButton("普通模式",this);
    //将样式设置到按钮中
    commonbutton->setFont(font);
    //设置按钮在窗口中的位置
    commonbutton->move(400,270);

    //创建困难难度按钮
    QPushButton * difficultybutton = new QPushButton("困难模式",this);
    //将样式设置到按钮中
    difficultybutton->setFont(font);
    //设置按钮在窗口中的位置
    difficultybutton->move(400,370);

    //创建历史记录按钮
    QPushButton * hisbutton = new QPushButton("历史记录",this);
    //将样式设置到按钮中
    hisbutton->setFont(font);
    //设置按钮在窗口中的位置
    hisbutton->move(400,470);

}

void GameSelect::paintEvent(QPaintEvent *event)
{
    //实例化画家,this:让画家在当前窗口进行绘制
    QPainter painter(this);
    //实例化绘图设备
    QPixmap pix(":/res/game_select.png");
    //绘画
    painter.drawPixmap(0,0,this->width(),this->height(),pix);
}

3. 游戏房间

3.1 创建GameRoom类

根据上面步骤后,新建GameRoom类
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

3.2 对游戏房间数据结构进行封装
#ifndef GAMEROOM_H
#define GAMEROOM_H

#include <QWidget>
#include<QSound>
enum class SnakeDirect{
    UP=0,
    DOWN,
    LEFT,
    RIGHT

};
class GameRoom : public QWidget
{
    Q_OBJECT
public:
    explicit GameRoom(QWidget *parent = nullptr);
    //重写绘图事件
    void paintEvent(QPaintEvent *event);
    void moveUp(); //向上移动
    void moveDown();//向下移动
    void moveLeft();//向左移动
    void moveRight();//向右移动
    bool checkFail();//判断游戏结束
    void createNewFood();//创建食物
    void setTimeout(int timeout){moveTimeout =timeout;}

private:
    const int KSnakeNodeWidth = 20;  //蛇节点的宽度
    const int KSnakeNodeHeight = 20; //蛇节点的高度
    const int KDefaultTimeout =200;  //蛇的默认移动速度
    QList<QRectF> snakeList; //表示贪吃蛇链表
    QRectF foodRect;  //表示食物节点
    SnakeDirect moveDirect = SnakeDirect::UP; //设置蛇移动方向默认向上
    QTimer *timer; //定时器

    bool isGameStart =false; //表示是否开始游戏
    QSound *sound;
    int moveTimeout =  KDefaultTimeout;

};

#endif // GAMEROOM_H


3.3 初始化游戏房间界面
//设置窗口大小
    this->setFixedSize(1000,800);
    //设置窗口的图标
    this->setWindowIcon(QIcon(":/res/ico.png"));
    //设置窗口标题
    this->setWindowTitle("游戏房间");
3.4 绘制界面窗口
void GameRoom::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);

    QPixmap pix;

    pix.load(":/res/game_room.png");

    painter.drawPixmap(0,0,800,800,pix);

    pix.load(":/res/bg1.png");

    painter.drawPixmap(800,0,200,850,pix);
}
3.5 蛇的移动
//创建上下左右按钮
    QPushButton * up = new QPushButton("↑",this);
    QPushButton * down = new QPushButton("↓",this);
    QPushButton * left = new QPushButton("←",this);
    QPushButton * right = new QPushButton("→",this);

    up->move(880,400);
    down->move(880,480);
    left->move(840,440);
    right->move(920,440);

    up->setFont(font);
    down->setFont(font);
    left->setFont(font);
    right->setFont(font);

    up->setStyleSheet("QPushButton{border:0px}");
    down->setStyleSheet("QPushButton{border:0px}");
    left->setStyleSheet("QPushButton{border:0px}");
    right->setStyleSheet("QPushButton{border:0px}");

    //按钮控制移动方向,不能直接掉头
    connect(up,&QPushButton::clicked,[=](){
        if(moveDirect != SnakeDirect::DOWN)
            moveDirect = SnakeDirect::UP;
    });
    connect(down,&QPushButton::clicked,[=](){
        if(moveDirect != SnakeDirect::UP)
            moveDirect = SnakeDirect::DOWN;
    });

    connect(left,&QPushButton::clicked,[=](){
        if(moveDirect != SnakeDirect::RIGHT)
            moveDirect = SnakeDirect::LEFT;
    });

    connect(right,&QPushButton::clicked,[=](){
        if(moveDirect != SnakeDirect::LEFT)
            moveDirect = SnakeDirect::RIGHT;
    });

void GameRoom::moveUp()
{
    QPointF leftTop; //左上角坐标
    QPointF rightBottom; //右下角坐标
    auto snakeNode = snakeList.front();//头
    int headX = snakeNode.x();
    int headY = snakeNode.y();
    if(headY<0)
    {
        leftTop = QPointF(headX, this->height()- KSnakeNodeHeight);
    }else {
        leftTop=QPointF(headX,headY-KSnakeNodeHeight);
    }
    rightBottom = leftTop + QPointF(KSnakeNodeWidth,KSnakeNodeHeight);
    snakeList.push_front(QRectF(leftTop,rightBottom));
}

void GameRoom::moveDown()
{
    QPointF leftTop; //左上角坐标
    QPointF rightBottom; //右下角坐标
    auto snakeNode = snakeList.front();//头
    int headX = snakeNode.x();
    int headY = snakeNode.y();
    if(headY>this->height())
    {
        leftTop = QPointF(headX,0);
    }else {
        leftTop=snakeNode.bottomLeft();
    }
    rightBottom = leftTop + QPointF(KSnakeNodeWidth,KSnakeNodeHeight);
    snakeList.push_front(QRectF(leftTop,rightBottom));
}

void GameRoom::moveLeft()
{
    QPointF leftTop; //左上角坐标
    QPointF rightBottom; //右下角坐标
    auto snakeNode = snakeList.front();//头
    int headX = snakeNode.x();
    int headY = snakeNode.y();
    if(headX<0)
    {
        leftTop=QPointF(800-KSnakeNodeWidth,headY);
    }else{
        leftTop=QPointF(headX-KSnakeNodeWidth,headY);
    }
    rightBottom = leftTop + QPointF(KSnakeNodeWidth,KSnakeNodeHeight);
    snakeList.push_front(QRectF(leftTop,rightBottom));
}

void GameRoom::moveRight()
{
    QPointF leftTop; //左上角坐标
    QPointF rightBottom; //右下角坐标
    auto snakeNode = snakeList.front();//头
    int headX = snakeNode.x();
    int headY = snakeNode.y();
    if(headX>800-2*KSnakeNodeWidth)
    {
        leftTop=QPointF(0,headY);
    }else{
        leftTop=snakeNode.topRight();
    }
    rightBottom = leftTop + QPointF(KSnakeNodeWidth,KSnakeNodeHeight);
    snakeList.push_front(QRectF(leftTop,rightBottom));
}
3.6 绘制蛇头身体尾巴
//绘制蛇
    //蛇头
    if(moveDirect==SnakeDirect::UP)
    {
        pix.load(":/res/up.png");
    }else if (moveDirect==SnakeDirect::DOWN) {
        pix.load(":/res/down.png");
    }else if(moveDirect==SnakeDirect::LEFT){
        pix.load(":/res/left.png");
    }else{
        pix.load(":/res/right.png");
    }
    auto snakeHead = snakeList.front();
    painter.drawPixmap(snakeHead.x(),snakeHead.y(),snakeHead.width(),snakeHead.height(),pix);

    //蛇身
    pix.load(":/res/Bd.png");
    for(int i = 1; i < snakeList.size()-1; i++)
    {
        auto node = snakeList.at(i);
        painter.drawPixmap(node.x(),node.y(),node.width(),node.height(),pix);
    }

    //蛇尾
    auto snakeTail = snakeList.back();
    painter.drawPixmap(snakeTail.x(),snakeTail.y(),snakeTail.width(),snakeTail.height(),pix);

3.6 绘制食物与分数
//绘制食物节点
    //先进行加载食物
    pix.load(":/res/food.bmp");
    painter.drawPixmap(foodRect.x(),foodRect.y(),foodRect.width(),foodRect.height(),pix);
    //绘制分数
    pix.load(":res/sorce_bg.png");
    painter.drawPixmap(this->width()*0.85,this->height()*0.03,100,50,pix);
    QPen pen;
    pen.setColor(Qt::black);
    painter.setPen(pen);
    QFont font("黑体",22);
    painter.setFont(font);
    painter.drawText(this->width()*0.9,this->height()*0.08,QString("%1").arg(snakeList.size()));
    //往文件中写分数
    int c = snakeList.size();
    QFile file("C:/Users/26256/Desktop/his.txt");
    if(file.open(QIODevice::WriteOnly | QIODevice::Text))
    {
        QTextStream out(&file);
        int num = c;
        out << num;
        file.close();
    }

3.7 判定游戏结束
bool GameRoom::checkFail()
{
    for(int i=0;i < snakeList.size();i++)
    {
        for(int j=i+1;j < snakeList.size();j++)
        {
            if(snakeList.at(i) == snakeList.at(j))
            {
                return true;
            }
        }
    }
    return false;
}
3.8 随机生成食物节点
void GameRoom::createNewFood()
{
    foodRect=QRectF(qrand() %(800/KSnakeNodeWidth)*KSnakeNodeWidth,
                    qrand() %(this->height()/KSnakeNodeHeight)*KSnakeNodeHeight,
                    KSnakeNodeWidth,
                    KSnakeNodeHeight
                    );

}
3.9 创建游戏开始和暂停按钮
//开始游戏   结束游戏

    QPushButton * startButton = new QPushButton("开始",this);
    QPushButton *failButton = new QPushButton("暂停",this);

    startButton->move(860,100);
    failButton->move(860,150);

    startButton->setFont(font2);
    failButton->setFont(font2);

    connect(startButton,&QPushButton::clicked,[=](){
        isGameStart=true;
        timer->start(moveTimeout);
        sound = new QSound(":res/Trepak.wav");
        sound->play();
        sound->setLoops(-1);
    });

    connect(failButton,&QPushButton::clicked,[=](){
        isGameStart=false;
        timer->stop();
        sound->stop();
3.10 实现定时器的超时槽函数
  timer = new QTimer(this);
    connect(timer,&QTimer::timeout,[=]()
    {
        int cont =1;
        if(snakeList.front().intersects(foodRect))
        {
            createNewFood();
            cont++;
            QSound::play(":/res/eatfood.wav");

        }

        while(cont--)
        {
            switch (moveDirect) {

            case SnakeDirect::UP :
                moveUp();
                break;
            case SnakeDirect::DOWN:
                moveDown();
                break;
            case SnakeDirect::LEFT:
                moveLeft();
                break;
            case SnakeDirect::RIGHT:
                moveRight();
                break;

            }
        }
        snakeList.pop_back();
        update();
    });
3.11 设置游戏退出按钮

    //退出游戏按钮

    QPushButton *backButton = new QPushButton("退出",this);
    backButton->move(860,700);
    backButton->setFont(font2);
    QMessageBox * messbox = new QMessageBox(this);
     QPushButton * ok = new QPushButton("ok");
    QPushButton * no = new QPushButton("no");



    messbox->addButton(ok,QMessageBox::AcceptRole);
    messbox->addButton(no,QMessageBox::ResetRole);

    messbox->setText("确定要退出游戏吗?");

    connect(backButton,&QPushButton::clicked,[=](){
        messbox->show();
        messbox->exec();
        QSound::play("clicked.wav");

        GameSelect* select = new GameSelect;
        if(messbox->clickedButton()==ok)
        {
            this->close();
            select->show();
       }else{
            messbox->close();
        }

    });
3.12 获取历史战绩
//创建历史记录按钮
    QPushButton * hisbutton = new QPushButton("历史记录",this);
    //将样式设置到按钮中
    hisbutton->setFont(font);
    //设置按钮在窗口中的位置
    hisbutton->move(400,470);
    connect(hisbutton,&QPushButton::clicked,[=](){
        QWidget * widget = new QWidget();
        widget->setFixedSize(200,80);
        widget->setWindowTitle("历史战绩");
        QTextEdit * edit = new QTextEdit(widget);
        edit->setFixedSize(200,80);
        edit->setFont(font);
        QFile file("C:/Users/26256/Desktop/his.txt");
        file.open(QIODevice::ReadOnly);

        QTextStream in(&file);
        int data = in.readLine().toInt();
        edit->append("得分为:");
        edit->append(QString::number(data));

        widget->show();

    });

四、项目源码获取

1. 网盘链接

百度网盘:https://pan.baidu.com/s/1Vm1aJ6AtyzfPdYSCIC0ygg?pwd=duck
提取码:duck

2. Gitee链接

Gitee链接:Qt贪吃蛇小游戏项目代码


在这里插入图片描述

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

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

相关文章

基于python深度学习的CNN图像识别鲜花-含数据集+pyqt界面

代码下载&#xff1a; https://download.csdn.net/download/qq_34904125/89383615 本代码是基于python pytorch环境安装的。 下载本代码后&#xff0c;有个requirement.txt文本&#xff0c;里面介绍了如何安装环境&#xff0c;环境需要自行配置。 或可直接参考下面博文进行…

定个小目标之刷LeetCode热题(21)

这是道技巧题&#xff0c;利用了 &#xff08;num - 1&#xff09;% n 计算下标的形式来将数组元素与数组索引产生映射关系&#xff0c;代码如下&#xff0c;可以看下注释 class Solution {public List<Integer> findDisappearedNumbers(int[] nums) {int n nums.lengt…

3分钟带手把手带你了解 FL Studio v21.2.3.4004 中文免费版(附中文设置教程)安装指南

3分钟带手把手带你了解 FL Studio v21.2.3.4004 中文免费版(附中文设置教程)安装指南&#xff0c;大家我是兔八哥爱分享&#xff0c;今天你带来的安装FL Studio 21破解版&#xff0c;纯正简体中文支持&#xff01; FL Studio 21 简称FL21&#xff0c;全称Fruity Loops Studio&a…

JDBC常见的几种连接池使用(C3P0、Druid、HikariCP 、DBCP)

前言 数据库连接池负责分配、管理和释放数据库连接&#xff0c;它允许应用程序重复使用一个现有的数据库连接&#xff0c;而不是重新建立一个。连接池技术尽可能多地重用了消耗内存的资源&#xff0c;大大节省了内存。通过使用连接池&#xff0c;将大大提高程序运行效率。常用的…

YOLOv10涨点改进创新MSAM注意力,通道注意力升级,魔改CBAM

目录 1,YOLO v10介绍 1.1 C2fUIB介绍 1.2 PSA介绍 1.3 SCDown 2.自研MSAM 2.1 自研MSAM注意力介绍 3.MSAM如何加入到YOLOv8 3.1 MSAM加入ultralytics/nn/attention/MsAM.py 3.2 修改tasks.py1)首先进行引用定义 3.3 yolov10n-MSAM.yaml 3.4 yolov10n-PSMSAM.yaml 改…

Intel平台,13600KF+3060Ti,虚拟机安装macOS 14(2024年6月)

距离上次装macOS虚拟机已经有一段时间了&#xff0c;macOS系统现在大版本升级的速度也是越来越快了&#xff0c;由于Office只支持最新三个版本的macOS&#xff0c;所以现在保底也得安装macOS 12了&#xff0c;我这次是用macOS 14做实验&#xff0c;13和12的安装方式和macOS 14一…

Java项目之消息队列(手写java模拟实现mq)【七、⽹络通信协议设计、消息队列服务器端实现、客户端实现】✔ ★

⼗⼀. ⽹络通信协议设计 定义 Request / Response /** 表示一个网络通信中的请求对象. 按照自定义协议的格式来展开的*/ public class Request {private int type;private int length;private byte[] payload;public int getType() {return type;}public void setType(int typ…

运算符及表达式+基本语句和函数使用的详细讲解

运算符及表达式 运算符及表达式 在C语言中&#xff0c;运算符是用于执行特定操作的符号&#xff0c;而表达式则是由运算符和操作数组成的式子。 1) 运算符 运算符的目数 单目运算符&#xff1a;只需要一个操作数&#xff0c;如 !&#xff08;逻辑非&#xff09;、&#xf…

10 C++11

10 C11 1、类型推导1.1 auto关键字1.2 auto类型推断本质 2、类型计算2.1 类型计算分类2.2 类型计算的四种规则2.3 返回值类型计算 3、列表初始化4、Lambda表达式4.1 前置知识4.2 Lambda表达式4.3 捕获表 5、右值引用5.1 概念5.2 左值引用和右值引用 6、移动语义 1、类型推导 1…

1992-2023年各省产业结构升级、产业结构高级化数据(含原始数据+计算过程+计算结果)(无缺失)

1992-2023年各省产业结构升级、产业结构高级化数据&#xff08;含原始数据计算过程计算结果&#xff09; 1、时间&#xff1a;1992-2023年 2、来源&#xff1a;国家统计局、统计年鉴 3、指标&#xff1a;国内生产总值、第一产业增加值、第二产业增加值、第三产业增加值、第一…

N32G031 ADC初始化

目录 1. ADC初始化概述 2. ADC初始化详细步骤 2.1 ADC配置 2.2 ADC初始化函数调用 2.3 DMA配置&#xff08;可选&#xff09; 3. 初始化结果验证 4. 注意事项 ADC采样注意事项 1. ADC初始化概述 在N32G031单片机中&#xff0c;ADC的初始化是确保ADC模块能够正常工作的…

上海计算机考研避雷,25考研慎报

上大计算机一直很热 408考研er重来没有让我失望过&#xff0c;现在上大的专业课是11408&#xff0c;按理说&#xff0c;这个专业课的难度是很高的&#xff0c;但是408er给卷出了新高度&#xff0c;大家可以去上大官网看看今年最新的数据&#xff0c;我也帮大家统计了24年最新的…

图像处理:Python使用OpenCV进行图像锐化 (非锐化掩模、拉普拉斯滤波器)

文章目录 非锐化掩模 (Unsharp Masking)拉普拉斯滤波器 (Laplacian Filter)效果对比总结 在图像处理中&#xff0c;锐化操作用于增强图像的边缘和细节&#xff0c;使图像看起来更清晰。常见的图像锐化方法包括非锐化掩模&#xff08;Unsharp Masking&#xff09;和拉普拉斯滤波…

药品销售管理系统带万字文档药店管理系统java项目药店商城网站

文章目录 药品销售管理系统一、项目演示二、项目介绍三、万字项目文档四、部分功能截图五、部分代码展示六、底部获取项目源码带万字文档&#xff08;9.9&#xffe5;带走&#xff09; 药品销售管理系统 一、项目演示 药品销售管理系统 二、项目介绍 系统角色&#xff1a;管理…

【Python】深入了解 AdaBoost:自适应提升算法

我们都找到天使了 说好了 心事不能偷藏着 什么都 一起做 幸福得 没话说 把坏脾气变成了好沟通 我们都找到天使了 约好了 负责对方的快乐 阳光下 的山坡 你素描 的以后 怎么抄袭我脑袋 想的 &#x1f3b5; 薛凯琪《找到天使了》 在机器学习的领域中&#x…

学会这8点小技巧,让你公众号永不断更!

最近在带大家玩公众号 IP 写作&#xff0c;如何才能保持日更&#xff0c;是很多新手小白常问的问题&#xff0c; 这里我给大家总结了8点小技巧&#xff0c;分享给大家&#xff0c;让你的公众号写作&#xff0c;能够永远不断更&#xff01; 1&#xff0c;尽量早点做 &#xff0c…

Linux、Windows安全加固

为了减少系统被黑客入侵&#xff0c;对操作系统的安全加固是网络安全和主机安全必不可少的一部分。 一、Linux安全加固 1.不使用默认的ssh端口&#xff0c;修改默认ssh22端口号 sudo vim /etc/ssh/ssh_config 去掉#注释&#xff0c;修改端口号并保存 2.关闭不必要的系统服务…

对不起了,QQ和微信,我选择用它!

哈喽&#xff0c;各位小伙伴们好&#xff0c;我是给大家带来各类黑科技与前沿资讯的小武。 每当我们需要在电脑和手机之间传输文件、在学习和工作时与朋友/同事传输文件&#xff0c;相信大多都会使用微信或者QQ。 但是在分享一些软件apk等安装包时&#xff0c;微信和QQ会将其…

牛客 第二十届西南科技大学ACM程序设计竞赛(同步赛):祖玛

题目描述 wzy 在玩一种很新的祖玛。 给定一个仅包含 小写字母 的字符串 sss , sss 由 mmm 个不同的小写字母组成&#xff0c;每个字母代表一种小球&#xff0c;在消去时会获得 相应 的分数&#xff1a; 两个及以上 相同的小球相碰就会消失&#xff08;在发射小球前因为无相碰&…

PyTorch计算机视觉入门:测试模型与评估,对单帧图片进行推理

在完成模型的训练之后&#xff0c;对模型进行测试与评估是至关重要的一步&#xff0c;它能帮助我们理解模型在未知数据上的泛化能力。本篇指南将带您了解如何使用PyTorch进行模型测试&#xff0c;并对测试结果进行分析。我们将基于之前训练好的模型&#xff0c;演示如何加载数据…