qt 实现翻金币游戏

2023-11-09

游戏玩法介绍:

游戏设置关卡二十关,通过选关界面可以选择进入到对应的关卡中。 进入对应关卡之后,点击任意金币,可以使该硬币以及周边(上,下,左, 右)金边翻转。如果硬币都翻转为金币,则游戏胜利。

游戏界面设置:

开始界面:
在这里插入图片描述
开始场景中需要自定义一个按钮,点击开始按钮可以实现一个动图弹跳的显示效果。
同时弹出选关窗口,关闭当前窗口。
对于我这个新手来说,这一部分实现的难点是按钮的弹跳效果的实现。

对应代码:

#include "mainScene.h"
#include "mybutton.h"
#include <QPainter>
#include <QPixmap>
#include <QDebug>
#include <QTimer>
#include <QSound>

MainScene::MainScene(QWidget *parent)
    : QMainWindow(parent)
{
    this->setFixedSize(320, 588);
    menu_bar = this->menuBar();
    startMenu = new QMenu("开始");
    menu_bar->addMenu(startMenu);
    exitAction = new QAction("退出");
    startMenu->addAction(exitAction);
    this->setWindowIcon(QPixmap(":/res/image/Coin0001.png"));
    this->setWindowTitle("翻金币");

    MyButton * btn = new MyButton(":/res/image/MenuSceneStartButton.png");
    btn->setParent(this);
    btn->move(this->width()*0.5-btn->width()*0.5, this->height()*0.7);
    secondScene = new selectScene();
    connect(exitAction, &QAction::triggered, [=](){
        this->close();
    });

    connect(btn, &MyButton::clicked, [=](){
        QSound::play(":/res/voice/TapButtonSound.wav");
        btn->sink();
        btn->rise();
        QTimer::singleShot(300, this, [=](){
            this->hide();
            secondScene->show();
            secondScene->setGeometry(this->geometry());
        });
    });

    connect(secondScene, &selectScene::backSignanl, [=](){
        QSound::play(":/res/voice/TapButtonSound.wav");
        QTimer::singleShot(300, this, [=](){
            this->show();
            setGeometry(secondScene->geometry());
            secondScene->hide();
        });
    });
}

MainScene::~MainScene()
{
}

void MainScene::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    QPixmap pix;
    pix.load(":/res/image/MenuSceneBg.png");
    painter.drawPixmap(0, 0, this->width(), this->height(), pix);

    pix.load(":/res/image/Title.png");
    pix = pix.scaled(pix.width()*0.5, pix.height()*0.5);
    painter.drawPixmap(30, 30, pix);

}

在初始界面需要构建一个自定义按钮,用于开始按钮,关卡按钮和返回按钮。
开始按钮需要增加弹跳效果,按钮类中使用QPropertyAnimation增加动态效果。
返回按钮则需要点击时切换图片状态,通过重写按钮按下,释放时间实现。

代码实现:

#include "mybutton.h"
#include <QPainter>
#include <QtDebug>
#include <QPropertyAnimation>
#include <QMouseEvent>

MyButton::MyButton(QString orignIcon, QString switchIcon)
{
    this->myOrignIcon = orignIcon;
    this->mySwitchIcon = switchIcon;
    QPixmap *pix = new QPixmap();
    bool res = pix->load(myOrignIcon);
    if(!res)
    {
        qDebug() << QString("路径错误%1").arg(orignIcon) << endl;
    }
    this->setFixedSize(pix->width(), pix->height());
    this->setStyleSheet("QPushButton{border:0px}");
    this->setIcon(QIcon(orignIcon));
    this->setIconSize(QSize(pix->width(), pix->height()));
}

void MyButton::rise()
{
    QPropertyAnimation *animation = new QPropertyAnimation(this, "geometry");
    animation->setDuration(200);
    animation->setStartValue(QRect(QRect(this->x(), this->y()+10, this->width(),this->height())));
    animation->setEndValue(QRect(QRect(this->x(), this->y(), this->width(),this->height())));
    animation->setEasingCurve(QEasingCurve::OutBounce);
    animation->start();
}

void MyButton::sink()
{
    QPropertyAnimation *animation = new QPropertyAnimation(this, "geometry");
    animation->setDuration(200);
    animation->setStartValue(QRect(this->x(), this->y(), this->width(),this->height()));
    animation->setEndValue(QRect(this->x(), this->y()+10, this->width(),this->height()));
    animation->setEasingCurve(QEasingCurve::OutBounce);
    animation->start();
}

void MyButton::mousePressEvent(QMouseEvent *e)
{
    if(mySwitchIcon != "")
    {
        QPixmap *pix = new QPixmap;
        bool res = pix->load(mySwitchIcon);
        if(!res)
        {
            qDebug() << QString("路径错误%1").arg(mySwitchIcon) << endl;
        }
        this->setFixedSize(pix->width(), pix->height());
        this->setStyleSheet("QPushButton{border:0px}");
        this->setIcon(QIcon(mySwitchIcon));
        this->setIconSize(QSize(pix->width(), pix->height()));
    }
    QPushButton::mousePressEvent(e);
}
void MyButton::mouseReleaseEvent(QMouseEvent *e)
{
    if(myOrignIcon != "")
    {
        QPixmap *pix = new QPixmap;
        bool res = pix->load(myOrignIcon);
        if(!res)
        {
            qDebug() << QString("路径错误%1").arg(myOrignIcon) << endl;
        }
        this->setFixedSize(pix->width(), pix->height());
        this->setStyleSheet("QPushButton{border:0px}");
        this->setIcon(QIcon(myOrignIcon));
        this->setIconSize(QSize(pix->width(), pix->height()));
    }
    QPushButton::mouseReleaseEvent(e);
}

选关界面:
在这里插入图片描述
选关场景的页面设计是比较简单的,使用自定义按钮进行排列。
对应选关按钮需要创建一个游戏场景对象。需要注意的是,在关闭对应关卡的同时也要将创建的游戏场景对象进行删除。

代码实现:

#include "selectscene.h"
#include <QDebug>
#include <QTimer>
#include <QSound>

selectScene::selectScene(QWidget *parent) : QMainWindow(parent)
{
    this->setFixedSize(320, 588);
    QMenuBar *menu_bar = this->menuBar();
    QMenu *start_menu = menu_bar->addMenu("开始");
    QAction *exit_action = start_menu->addAction("退出");
    this->setWindowIcon(QPixmap(":/res/image/Coin0001.png"));
    this->setWindowTitle("翻金币");
    backButton = new MyButton(":/res/image/BackButton.png", ":/res/image/BackButtonSelected.png");
    backButton->setParent(this);
    backButton->move(this->width() - backButton->width(), this->height() - backButton->height());
    playScene = nullptr;
    //增加选关按钮
    for(int i=0; i<20; i++)
    {
        selectButton[i] = new MyButton(":/res/image/LevelIcon.png");
        selectButton[i]->setParent(this);
        selectButton[i]->move(25+(i%4)*70, 160+(i/4)*70);
        numLabel[i] = new QLabel(QString::number(i+1), this);
        numLabel[i]->move(25+(i%4)*70, 160+(i/4)*70);
        numLabel[i]->setFixedSize(selectButton[i]->width(), selectButton[i]->height());
        numLabel[i]->setAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
        numLabel[i]->setAttribute(Qt::WA_TransparentForMouseEvents);

        connect(selectButton[i], &MyButton::clicked, [=](){
            QSound::play(":/res/voice/TapButtonSound.wav");
            playScene = new PlayScene(i+1);
            playScene->show();
            playScene->setGeometry(geometry());
            this->hide();
            connect(playScene, &PlayScene::backSignanl, [=](){
                QTimer::singleShot(300, this, [=](){
                playScene->hide();
                this->show();
                setGeometry(playScene->geometry());
                delete playScene;
                playScene = nullptr;
                 });
            });
        });
    }

    connect(exit_action, &QAction::triggered, [=](){
        this->close();
    });

    connect(backButton, &QPushButton::pressed, [=](){
        QSound::play(":/res/voice/BackButtonSound.wav");
        emit backSignanl();
    });
}

void selectScene::paintEvent(QPaintEvent *e)
{
    QPainter painter(this);
    QPixmap pix;
    pix.load(":/res/image/OtherSceneBg.png");
    painter.drawPixmap(0, 0, this->width(), this->height(), pix);
    pix.load(":/res/image/Title.png");
    painter.drawPixmap((this->width() - pix.width())*0.5, 30, pix);
}

游戏界面:
第一关为例

在这里插入图片描述

页面设计同样比较简单,排列金币按钮阵列形式摆放。灰色背景是由QLabel生成的。
功能实现部分,首先需要新定义一个金币类的按钮,点击金币之后可以实现一个(金转银/银转金)翻转效果。通过标志+定时器切换图片实现翻转。
当金币按钮翻转时,禁用掉按钮,防止按钮翻转未完成时进行多次翻转,通过定义标志,重写按钮按下事件就可以实现。
如果游戏胜利,同样需要禁用按钮的功能,通过定义新标志实现。

自定义按钮类的代码实现:

#include "coinbutton.h"
#include <QPainter>
#include <QDebug>

CoinButton::CoinButton(QString img, QWidget *parent)
    :QPushButton(parent)
{
    myIcon = img;
    QPixmap pix;
    bool res = pix.load(myIcon);
    if(!res)
    {
        qDebug() << QString("路径错误:%1").arg(myIcon) << endl;
        return;
    }

    this->setFixedSize(pix.width(), pix.height());
    this->setStyleSheet("QPushButton{border:0px}");
    this->setIcon(QIcon(pix));
    this->setIconSize(QSize(pix.width(), pix.height()));
    timer = new QTimer;
    connect(timer, &QTimer::timeout, [=](){
        QPixmap pix;
        QString img;
        if(position.flag){
            img = ":/res/image/Coin000"+QString::number(currentValue++)+".png";
        }
        else{
            img = ":/res/image/Coin000"+QString::number(currentValue--)+".png";
        }

        bool res = pix.load(img);
        if(!res)
        {
            qDebug() << QString("加载图片1%失败").arg(img) << img << endl;
            return ;
        }

        this->setFixedSize(pix.width(), pix.height());
        this->setStyleSheet("QPushButton{border:0px}");
        this->setIcon(QIcon(pix));
        this->setIconSize(QSize(pix.width(), pix.height()));

        if(currentValue < MINVALUE ||  currentValue > MAXVALUE)
        {
            position.flag = !position.flag;
            timer->stop();
            isAnimation = false;
        }
    });
}

void CoinButton::mousePressEvent(QMouseEvent *e)
{
    if(isAnimation || isEnd)
        return;
    else
        QPushButton::mousePressEvent(e);
}

void CoinButton::stateChanged()
{
    timer->start(30);
    isAnimation = true;
    if(position.flag)
    {
        currentValue = MINVALUE;
    }
    else
    {
        currentValue = MAXVALUE;
    }
    isGold = !isGold;
}

在主游戏界面内,由于不同的关卡内,金币银币翻转布局初始界面是不同的,金币银币的状态设置由另一个专门存储金币状态的数据文件进行保存的。
每一关卡的数据都保存在一个二维4*4数组中,游戏所需要的数据 由20个这样的数据保存,在初始关卡时根据关卡调出对应数组的数据并进行初始化金币。所以数据文件中保存数据 类型为 QMap<int, QVector< QVector>>。

根据游戏的规则,需要重新定义一个按钮数组,用于标记按钮坐标位置,当一个金币翻转,用来判断周围的金币是否可以同时进行翻转。金币翻转的状态(金币?银币)由状态标志判断和更新保存。在完成一次翻转之后判断游戏是否胜利同样由标志位判断。
还有其他的特效小细节设置,由于比较简单,并不进行总结了。

代码实现如下:

#include "playscene.h"
#include <QPainter>
#include <QDebug>
#include <QTimer>
#include <QTime>
#include <QLabel>
#include <QSound>
#include <QPropertyAnimation>

PlayScene::PlayScene(int level, QWidget *parent) : QMainWindow(parent)
{
    myLevel = level;
    this->setFixedSize(320, 588);
    this->setWindowIcon(QPixmap(":/res/image/Coin0001.png"));
    QString title = QString("第%1关").arg(myLevel);
    this->setWindowTitle(title);
    backButton = new MyButton(":/res/image/BackButton.png", ":/res/image/BackButtonSelected.png");
    backButton->setParent(this);
    backButton->move(this->width() - backButton->width(), this->height() - backButton->height());
    QLabel *winLabel = new QLabel(this);
    QPixmap successPix;
    successPix.load(":/res/image/LevelCompletedDialogBg.png");
    winLabel->setPixmap(successPix);
    winLabel->setGeometry(0.5*(this->width()-successPix.width()), 0-successPix.height(),successPix.width(), successPix.height());
    DataConfig gameData;

    for(int i=0; i<4; i++)
    {
        for(int j=0; j<4; j++)
        {
           myData[i][j] = gameData.mData[myLevel][i][j];
        }
    }

    connect(backButton, &QPushButton::pressed, [=](){
        QSound::play(":/res/voice/BackButtonSound.wav");
        emit backSignanl();
    });

    QPixmap pix;
    pix.load(":/res/image/BoardNode.png");
    isWin = true;

    for(int i=0; i<4; i++)
    {
        for(int j=0; j<4; j++)
        {
            QLabel *levelLabel = new QLabel(this);
            levelLabel->setFixedSize(pix.width(), pix.height());
            levelLabel->setPixmap(pix);
            levelLabel->move(57 + i*50, 200 + 50 *j);
            QString image;
            if (myData[i][j])
                image = ":/res/image/Coin0001.png";
            else
                image = ":/res/image/Coin0008.png";
            CoinButton *coinButton = new CoinButton(image, this);
            myCoin[i][j] = coinButton;
            coinButton->move(59 + i*50, 204 + 50 *j);
            coinButton->position.flag = (myData[i][j] == 1)?true:false;
            coinButton->isGold = (myData[i][j] == 1)?true:false;
            coinButton->isEnd = false;
            coinButton->position.posX = i;
            coinButton->position.posY = j;
            connect(coinButton, &CoinButton::clicked,[=](){
                QSound::play(":/res/voice/ConFlipSound.wav");
                for(int i=0; i<4; i++)
                {
                    for(int j=0; j<4; j++)
                    {
                        myCoin[i][j]->isEnd = true;
                    }
                }

                coinButton->stateChanged();
                QTimer::singleShot(300,[=](){
                    if(coinButton->position.posX+1 < 4)
                    {
                        myCoin[i+1][j]->stateChanged();
                    }

                    if(coinButton->position.posX-1 >= 0)
                    {
                        myCoin[i-1][j]->stateChanged();
                    }

                    if(coinButton->position.posY+1 < 4)
                    {
                        myCoin[i][j+1]->stateChanged();
                    }

                    if(coinButton->position.posY-1 >= 0)
                    {
                        myCoin[i][j-1]->stateChanged();
                    }

                    isWin = true;
                    for(int i=0; i<4; i++)
                    {
                        for(int j=0; j<4; j++)
                        {
                            if(!myCoin[i][j]->isGold)
                            {
                                isWin = false;
                            }
                        }
                    }

                    if(!isWin)
                    {
                        for(int i=0; i<4; i++)
                        {
                            for(int j=0; j<4; j++)
                            {
                                myCoin[i][j]->isEnd = false;
                            }
                        }
                    }
                    else{
                        QSound::play(":/res/voice/LevelWinSound.wav");
                        QPropertyAnimation *animation = new QPropertyAnimation(winLabel, "geometry");
                        animation->setDuration(500);
                        animation->setStartValue(QRect(0.5*(this->width()-successPix.width()), 0-successPix.height(),successPix.width(), successPix.height()));
                        animation->setEndValue(QRect(0.5*(this->width()-successPix.width()), successPix.height()+20,successPix.width(), successPix.height()));
                        animation->setEasingCurve(QEasingCurve::OutBounce);
                        animation->start();
                    }
                });
            });
        }
    }

    showLabel = new QLabel(this);
    QFont font("Helvetica [Cronyx]", 20, QFont::Bold);
    showLabel->setFont(font);
    showLabel->setText(QString("level:%1").arg(myLevel));
    showLabel->setGeometry(0, this->height()-50, this->width(), 50);
    showLabel->setAttribute(Qt::WA_TransparentForMouseEvents);
}

 void PlayScene::paintEvent(QPaintEvent* e)
 {
     QPainter painter(this);
     QPixmap pix;
     pix.load(":/res/image/PlayLevelSceneBg.png");
     painter.drawPixmap(0, 0, this->width(), this->height(), pix);
     pix.load(":/res/image/Title.png");
     painter.drawPixmap((this->width() - pix.width())*0.5, 30, pix);
 }

全部代码以及相关音频和图片资源有需要的,后期会进行上传。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

qt 实现翻金币游戏 的相关文章

  • 如何捕获未发送到 stdout 的命令行文本?

    我在项目中使用 LAME 命令行 mp3 编码器 我希望能够看到某人正在使用什么版本 如果我只执行 LAME exe 而不带参数 我会得到 例如 C LAME gt LAME exe LAME 32 bits version 3 98 2
  • 代码 GetAsyncKeyState(VK_SHIFT) & 0x8000 中的这些数字是什么?它们是必不可少的吗?

    我试图在按下按键的简单动作中找到这些数字及其含义的任何逻辑解释 GetAsyncKeyState VK SHIFT 0x8000 可以使用哪些其他值来代替0x8000它们与按键有什么关系 GetAsyncKeyState 根据文档返回 如果
  • 在c#中执行Redis控制台命令

    我需要从 Redis 控制台获取 客户端列表 输出以在我的 C 应用程序中使用 有没有办法使用 ConnectionMultiplexer 执行该命令 或者是否有内置方法可以查找该信息 CLIENT LIST是 服务器 命令 而不是 数据库
  • ComboBox DataBinding 导致 ArgumentException

    我的几个类对象 class Person public string Name get set public string Sex get set public int Age get set public override string
  • 如何判断计算机是否已重新启动?

    我曾经使用过一个命令行 SMTP 邮件程序 作为试用版的限制 它允许您在每个 Windows 会话中最多接收 10 封电子邮件 如果您重新启动计算机 您可能还会收到 10 个以上 我认为这种共享软件破坏非常巧妙 我想在我的应用程序中复制它
  • JNI 将 Char* 2D 数组传递给 JAVA 代码

    我想从 C 代码通过 JNI 层传递以下指针数组 char result MAXTEST MAXRESPONSE 12 12 8 3 29 70 5 2 42 42 在java代码中我写了以下声明 public static native
  • 为什么在 WebApi 上下文中在 using 块中使用 HttpClient 是错误的?

    那么 问题是为什么在 using 块中使用 HttpClient 是错误的 但在 WebApi 上下文中呢 我一直在读这篇文章不要阻止异步代码 https blog stephencleary com 2012 07 dont block
  • unordered_map 中字符串的 C++ 哈希函数

    看起来 C 标准库中没有字符串的哈希函数 这是真的 在任何 c 编译器上使用字符串作为 unordered map 中的键的工作示例是什么 C STL提供模板专业化 http en cppreference com w cpp string
  • File.AppendText 尝试写入错误的位置

    我有一个 C 控制台应用程序 它作为 Windows 任务计划程序中的计划任务运行 此控制台应用程序写入日志文件 该日志文件在调试模式下运行时会创建并写入应用程序文件夹本身内的文件 但是 当它在任务计划程序中运行时 它会抛出一个错误 指出访
  • 告诉 Nancy 将枚举序列化为字符串

    Nancy 默认情况下在生成 JSON 响应时将枚举序列化为整数 我需要将枚举序列化为字符串 有一种方法可以通过创建来自定义 Nancy 的 JSON 序列化JavaScript 原始转换器 https github com NancyFx
  • 在视口中查找 WPF 控件

    Updated 这可能是一个简单或复杂的问题 但在 wpf 中 我有一个列表框 我用一个填充数据模板从列表中 有没有办法找出特定的数据模板项位于视口中 即我已滚动到其位置并且可以查看 目前我连接到了 listbox ScrollChange
  • 检测到严重错误 c0000374 - C++ dll 将已分配内存的指针返回到 C#

    我有一个 c dll 它为我的主 c 应用程序提供一些功能 在这里 我尝试读取一个文件 将其加载到内存 然后返回一些信息 例如加载数据的指针和内存块的计数到 c Dll 成功将文件读取到内存 但在返回主应用程序时 程序由于堆损坏而崩溃 检测
  • WebBrowser.Print() 等待完成。 。网

    我在 VB NET 中使用 WebBrowser 控件并调用 Print 方法 我正在使用 PDF 打印机进行打印 当调用 Print 时 它不会立即启动 它会等到完成整个子或块的运行代码 我需要确保我正在打印的文件也完整并继续处理该文件
  • OpenGL:仅获取模板缓冲区而没有深度缓冲区?

    我想获取一个模板缓冲区 但如果可能的话 不要承受附加深度缓冲区的开销 因为我不会使用它 我发现的大多数资源表明 虽然模板缓冲区是可选的 例如 排除它以利于获得更高的深度缓冲区精度 但我还没有看到任何请求并成功获取仅 8 位模板缓冲区的代码
  • 实体框架中的“it”是什么

    如果以前有人问过这个问题 请原谅我 但我的任何搜索中都没有出现 它 我有两个数据库表 Person 和 Employee 对每个类型的表进行建模 例如 Employee is a Person 在我的 edmx 设计器中 我定义了一个实体
  • 在 Windows Phone silverlight 8.1 上接收 WNS 推送通知

    我有 Windows Phone 8 1 silverlight 应用程序 我想使用新框架 WNS 接收通知 我在 package appxmanifest 中有
  • 可访问性不一致:参数类型的可访问性低于方法

    我试图在两个表单之间传递一个对象 基本上是对当前登录用户的引用 目前 我在登录表单中有一些类似的内容 private ACTInterface oActInterface public void button1 Click object s
  • 为boost python编译的.so找不到模块

    我正在尝试将 C 代码包装到 python 中 只需一个类即可导出两个函数 我编译为map so 当我尝试时import map得到像噪音一样的错误 Traceback most recent call last File
  • 如何减少具有多个单元的 PdfPTable 的内存消耗

    我正在使用 ITextSharp 创建一个 PDF 它由单个 PdfTable 组成 不幸的是 对于特定的数据集 由于创建了大量 PdfPCell 我遇到了内存不足异常 我已经分析了内存使用情况 我有近百万个单元格的 1 2 在这种情况下有
  • 灵气序列解析问题

    我在使用 Spirit Qi 2 4 编写解析器时遇到一些问题 我有一系列键值对以以下格式解析

随机推荐

  • CSS中如何实现一个自适应正方形(宽高相等)的元素?

    聚沙成塔 每天进步一点点 专栏简介 利用 padding 百分比 2 利用 before 伪元素 写在最后 专栏简介 前端入门之旅 探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅
  • cocos2dx中的内存加载PLIST

    今天 加载图片时有问题 myButtonPList loadTextures jineng 02103 png jineng 02103 light png jineng 03101 png UI TEX TYPE PLIST myButt
  • 时间趋势可视化-柱形图

    第1关 大胃王 比赛数据柱形图绘制 绘制柱形图的基本步骤 本关任务 根据实训提供的 大胃王 比赛数据绘制柱形图 熟悉柱形图绘制的基本步骤 coding utf 8 import pandas as pd from matplotlib im
  • 利用CIBERSORT免疫细胞类群分析详细教程

    利用CIBERSORT免疫细胞类群分析详细教程 现在最火的组学技术是什么 无疑便是单细胞测序了 通过单细胞测序 科研人员可以获得比原来更为精细的细胞图谱 但是单细胞测序诸多限制条件 也是不能让大家很好地利用这项技术解决自己的科学问题 除了较
  • 【Qt】通过QtCreator源码学习Qt(十二):Q_D和Q_Q指针(简称“d指针”)详解

    1 Q D和Q Q指针 简称 d指针 简介 参考博客 https www devbean net 2016 11 qt creator source study 07 https blog csdn net rabinsong articl
  • SpringBoot项目中统计所有Controller中的方法

    对接口方法进行抽象 Data public class ControllerMethodItem public String controllerName public String methodName public String req
  • vscode中preLaunchTask“g++”已终止,退出代码为1的解决方案

    问题背景 楼主原来做的项目 电脑中装了MinGW64 还有MinGW的32位版在用vscode时发现出现了 preLaunchTask g 已终止 退出代码为1的问题 找了好久 解决了问题 launch json 注释的位置 这里修改GDB
  • Vue中实现放大镜效果

    先来看一下我们需要实现的效果是怎样的 这里我们没有使用原生的 js 方法去实现 而是使用的 Vue3 官方推荐的一个工具库 vueuse cor 中的 useMouseInElement 方法来实现放大镜的效果 首先来看一下 useMous
  • 如何安装和配置树莓派

    如何安装和配置树莓派 如果你有一块树莓派的板子 还有一个没安装系统的SD卡 怎么能把系统装上 配置好跑起来 这篇文章主要就讲这个事 这是一块Raspberry Pi Zero W板 以及一个空SD卡 当然 我们需要一个SD卡读卡器 还需要一
  • Flink Native Kubernetes (一)

    目录 文章目录 目录 概述 Linux 集群描述 版本 部署K8S环境 配置Yum 安装docker 安装Rancher 安装K8s 工作集群 添加KubeCtl命令上下文 运行FlinkDemo FlinkSession关于K8s的基础环
  • 三:Sensor SLPI层代码分析---

    三 Sensor SLPI层代码分析 在学习SLPI侧代码前我们先了解下SEE的registry config registry 放在 persist sensors registry registry中 它是通过config生成的 是给S
  • 循环遍历本地的图片使用BASE64编码,并在ajax也遍历图片

    前端调用ajax到后端去图片的方法 并返回 public void search HttpServletRequest request HttpServletResponse response throws Exception String
  • 【毕业设计】基于stm32的智能扫地机器人设计与实现 - 单片机 物联网

    文章目录 0 简介 1 课题背景 2 硬件系统总体框架 2 1 电机驱动 2 2 红外线传感器 2 3 超声波传感器 2 4 MPU6050 2 5 ATK ESP8266 WI FI 模块 2 6 电源管理模块 3 软件系统设计 3 1
  • 前端知识点

    写在前面 CSDN话题挑战赛第1期 活动详情地址 CSDN 参赛话题 前端面试宝典 话题描述 欢迎各位加入话题创作得小伙伴 如果我没有猜错得话 我觉得你是应该同我一样是一位前端人 如今前端在IT事业中的占比越来越重 已经成为不可缺少的部分
  • 2019年DNS服务器速度排行榜

    第一名 DNSPod 不得不说腾讯自从收购了DNSPod后 无论是服务还是速度都有显著的提升 无论是访问速度还是解析速度都在国内是处于龙头大哥的地位 昔日的老大114的地位已经不保 作为腾讯旗下的公司 在游戏解析这一块来说 技术自然是领先于
  • 排序算法详解(堆,归并,快速排序最简及理解写法)

    十大排序算法和复杂度 常见排序的详解 只讲解真实场景中常用的 简单的就不分析了大家稍微看一下就行 快速排序 快排的思想主要就是每次把一个位置放好后 可以把数组分成两半 递归处理子问题即可 空间复杂度OlogN 分析 每次都分成两半处理子问题
  • IDEA报错程序包xxx不存在,但Depandencies依赖里明明有

    IDEA报错程序包xxx不存在 但依赖里明明有 看一下这个项目的pom xml 我这边引用的是公共依赖 应该是运行的时候依赖没有引用过来 搞了半天 网上搜了很多没搜到 后来我把 settings gt Runner 设置调了一下 就没有问题
  • CUDA之Warp Shuffle详解

    之前我们有介绍shared Memory对于提高性能的好处 在CC3 0以上 支持了shuffle指令 允许thread直接读其他thread的寄存器值 只要两个thread在 同一个warp中 这种比通过shared Memory进行th
  • Zabbix 学习(六) 自动发现功能与主动监控的实现

    一 自动发现 当被监控的设备非常多的时候 手工添加将会变得非常不方便 可以使用自动发现功能 实现添加主机 添加到主机组 链接模板 自动发现流程 创建自动发现规则 创建动作 当主机被发现之后 执行什么操作 通过动作 添加主机 将模板应用到发现
  • qt 实现翻金币游戏

    游戏玩法介绍 游戏设置关卡二十关 通过选关界面可以选择进入到对应的关卡中 进入对应关卡之后 点击任意金币 可以使该硬币以及周边 上 下 左 右 金边翻转 如果硬币都翻转为金币 则游戏胜利 游戏界面设置 开始界面 开始场景中需要自定义一个按钮