Qt——项目:翻转金币游戏

news2024/12/26 11:55:26

目录

一.示例演示

二.制作思路

(一).准备资源及总体框架

(二).开始窗口

(三).选择关卡窗口

(四).游戏窗口

(五).优化

三.实现代码

(一).自制按钮类

(二).开始窗口

(三).选择关卡窗口

(四).金币类

(五).初始化金币数据类

(六).游戏窗口


一.示例演示

 

二.制作思路

(一).准备资源及总体框架

创建项目后,将资源加载通过创建Qt设计师界面类加载进项目。

(资源已上传个人仓库,有需要请自取:Qt/12.23翻转金币/res · 纽盖特/git all - 码云 - 开源中国 (gitee.com))

大致上,我们需要一个开始游戏的窗口选择关卡的窗口玩游戏的窗口,共三个窗口。 

(二).开始窗口

这个窗口需要使用菜单栏,因此可以用QMainWindow类

此外要设置背景图片,可以使用绘图事件paintEvent完成。

窗口标题及图片直接在构造函数完成,使用setWindowTitle及setWindowIcon完成。

按钮要设置成点击后会向下弹并返回,可以专门定义一个按钮类,使用QPropertyAnimation特效类编写下降和上升的函数。

关卡窗口完成后,使用connect通过信号和槽完成点击按钮就关闭本窗口打开关卡窗口的操作。

(三).选择关卡窗口

 与开始窗口一样,完成背景、标题、菜单栏的搭建。

难点在于关卡按钮和BACK按钮。

关卡按钮使用自制按钮类即可,但需要设置底层图片

该按钮通过QLabel标签类完成关卡号的书写。但这还不够,如果此时connect后点击按钮不会有任何反应,因为此时标签在按钮之上,鼠标相当于直接点在标签上。

需要使用鼠标穿透:lab->setAttribute(Qt::WA_TransparentForMouseEvents); 

使用connect将关卡按钮与第三次游戏窗口连接。

BACK按钮同样使用自制按钮类,但此时不同的是点击后按钮要换图片

对此,我们可以在自制按钮类中定义鼠标事件,点击事件mousePressEvent()内部将图片切换成第二个,释放事件mouseReleaseEvent()内部将图片切换成第一个。

之后将BACK按钮与开始窗口connect连接即可。

(四).游戏窗口

本层的背景、菜单栏、标题搭建与之前一样。

重点是翻转金币和成功动画的跳出。

首先要进一步优化本层BACK按钮,在第二层BACK按钮基础上在窗口构造函数中connect连接BACK按钮与lambda函数,lambda函数内部通过消息对话框QMessageBox完成是否退出的询问。

翻转金币的过程要先定义一个金币类,继承自QPushButton按钮类。内部要实现两个翻转函数,分别是翻成金币和银币,具体翻转过程通过金币类内部定义两个QTimer定时器,当需要翻转时发送start函数,使用connect让lambda函数接收,函数内部根据QTimer定时翻转一小部分,直到全部翻完,stop相关QTimer。

判定成功通过在金币类中定义bool类型成员,翻成金币为true,银币为false。遍历一遍全部是true时说明游戏成功。 

初始化游戏硬币颜色可以再定义一个数据类(dataofcoin.h中),这里面定义一个QMap类,first是记录的层数,second是二维数组,使用0和1分别代表银币和金币。当游戏窗口初始化时,通过调用数据类,根据窗口是哪一关(游戏窗口类有一个成员,当关卡层点击关卡后,该成员会记录这是第几关),调用对应二维数组,完成硬币颜色初始化。

游戏成功后,需要锁定硬币,不能再通过点击硬币翻转同时跳出成功动画。

锁定硬币通过在自制按钮类中定义一个bool成员,当检查游戏成功时设置成true。同时按钮类的鼠标事件判断该成员如果为true就直接退出事件,即点击无效。

跳出成功动画是当检测到成功后,先加载图片到游戏窗口之外(需要注意在构造函数外控件需要调用show函数才能显示,即便是构造函数内的lambda函数内也一样),再通过特效类QPropertyAnimation完成图片的下降。

(五).优化

优化主要有两个:完成音效和完成窗口移动。

音效通过使用QSound类,加载音效路径后调用play函数完成。

窗口移动优化的意思是:假如此时在第二层,如果移动窗口,那么当返回 第一层后窗口就自动回到之前的位置而不是在我们移动后的位置。

 优化方式就是在每一层切回的connect槽函数中先同步切回前上一层窗口的位置,本层窗口打开时直接就是该位置了。具体是通过setGeometry()窗口成员函数完成。

三.实现代码

(一).自制按钮类

//mybutton.h
#ifndef MYBUTTON_H
#define MYBUTTON_H

#include <QMainWindow>
#include<QPushButton>
#include<QEvent>

class myButton : public QPushButton
{
    Q_OBJECT
public:
    explicit myButton(QString firstPath, QString secondPath = "");

    void putDown();
    void putUp();

    void mousePressEvent(QMouseEvent* ev);
    void mouseReleaseEvent(QMouseEvent* ev);

signals:
    void returnToStart();
    void returnToSelect();
private:
    QString normalPath;
    QString pressPath;
};

#endif // MYBUTTON_H
//mybutton.cpp
#include "mybutton.h"
#include<QPixmap>
#include<QIcon>
#include<QPropertyAnimation>
#include<QSound>

myButton::myButton(QString firstPath, QString secondPath)
{
    normalPath = firstPath;
    pressPath = secondPath;
    QPixmap pix;//按钮图片
    pix.load(firstPath);
    this->setFixedSize(pix.width(), pix.height());//设置按钮大小
    this->setStyleSheet("QPushButton{border:Opx}");//解除图片规则限制
    this->setIcon(pix);
    this->setIconSize(QSize(pix.width(), pix.height()));//设置按钮图片大小

}

void myButton::mousePressEvent(QMouseEvent* ev){
    if(pressPath != ""){
        QSound* sound = new QSound(":/res/TapButtonSound.wav", this);
        sound->play();
        QPixmap pix;
        pix.load(":/res/BackButtonSelected.png");
        this->setIcon(pix);
    }
    return QPushButton::mousePressEvent(ev);
}
void myButton::mouseReleaseEvent(QMouseEvent* ev){
    if(pressPath != ""){
        QPixmap pix;
        pix.load(":/res/BackButton.png");
        this->setIcon(pix);
        //emit returnToSelect();//发出返回信号
    }
    return QPushButton::mouseReleaseEvent(ev);
}

void myButton::putDown(){
    //设置特效
    QPropertyAnimation* pro = new QPropertyAnimation(this, "geometry");
    pro->setDuration(500);//设置特效时间
    //设置特效开始与结束
    pro->setStartValue(QRect(x(), y(), width(), height()));
    pro->setEndValue(QRect(x(), y() + 10, width(), height()));
    //设置特效弹跳效果
    pro->setEasingCurve(QEasingCurve::OutBounce);
    pro->start();
}
void myButton::putUp(){
    //设置特效
    QPropertyAnimation* pro = new QPropertyAnimation(this, "geometry");
    pro->setDuration(500);//设置特效时间
    //设置特效开始与结束
    pro->setStartValue(QRect(x(), y() + 10, width(), height()));
    pro->setEndValue(QRect(x(), y(), width(), height()));
    //设置特效弹跳效果
    pro->setEasingCurve(QEasingCurve::OutBounce);
    pro->start();
}

(二).开始窗口

//startwindow.h
#ifndef STARTWINDOW_H
#define STARTWINDOW_H
#include"mybutton.h"
#include"selectwindow.h"

#include <QMainWindow>
#include<QEvent>
QT_BEGIN_NAMESPACE
namespace Ui { class startWindow; }
QT_END_NAMESPACE

class startWindow : public QMainWindow
{
    Q_OBJECT

public:
    startWindow(QWidget *parent = nullptr);
    ~startWindow();

    void paintEvent(QPaintEvent*);
private:
    Ui::startWindow *ui;
};
#endif // STARTWINDOW_H
//selectwindow.cpp
#include "selectwindow.h"

#include<QIcon>
#include<QPixmap>
#include<QPainter>
#include<QMenuBar>
#include<QDebug>
#include<QLabel>
#include<QTimer>

selectWindow::selectWindow(QMainWindow *parent) : QMainWindow(parent)
{
    setFixedSize(360, 620);
    setWindowIcon(QIcon(":/res/Coin0001.png"));
    setWindowTitle("Coin Filp");

    //创建菜单
    QMenuBar* bar = new QMenuBar(this);
    setMenuBar(bar);
    QMenu* start = bar->addMenu("开始");
    QAction* quit = start->addAction("结束");
    connect(quit, &QAction::triggered, [=]{
        close();
    });

    //创建关卡选择
    for(int i = 0; i < 9; i++){
        //每一关按钮
        myButton* but = new myButton(":/res/LevelIcon.png");
        but->setParent(this);
        but->move(50 + i % 3 * 100, 180 + i / 3 * 100);
        //按钮上的标号
        QLabel* lab = new QLabel(this);
        lab->setText(QString().number(i + 1));
        lab->setFixedSize(but->width(), but->height());
        lab->move(50 + i % 3 * 100, 180 + i / 3 * 100);
        lab->setAlignment(Qt::AlignHCenter | Qt::AlignVCenter);//设置水平垂直居中
        QFont font;//字体设置
        font.setBold(true);
        font.setFamily("YouYuan");
        font.setPointSize(10);
        lab->setFont(font);
        //按钮穿透
        lab->setAttribute(Qt::WA_TransparentForMouseEvents);

        //建立关卡按钮连接
        connect(but, &QPushButton::clicked, [=]{
            QTimer::singleShot(500, this, [=]{
                gameWindow* game = new gameWindow(i + 1);
                game->setGeometry(geometry());
                game->show();
                this->hide();

                //游戏界面如果按下返回按钮
                connect(game, &gameWindow::returnToSelect, [=]{
                    this->setGeometry(game->geometry());//防止窗口位置与上一层不同
                    this->show();
                    delete game;
                });
            });
        });


    }

    //返回按钮
    myButton* ret = new myButton(":/res/BackButton.png", ":/res/BackButtonSelected.png");
    ret->setParent(this);
    ret->move(width() - ret->width(), height() - ret->height());

    connect(ret, &QPushButton::clicked, [=]{
        emit returnToStart();
    });

}

void selectWindow::paintEvent(QPaintEvent*){
    QPixmap pix;
    bool judge = pix.load(":/res/OtherSceneBg.png");
    if(judge == false) qDebug() << "Load Error";
    QPainter p(this);
    p.drawPixmap(0, 0, width(), height(), pix);
    pix.load(":/res/Title.png");
    p.drawPixmap(width() * 0.5 - pix.width() * 0.5, 30, pix);

}

(三).选择关卡窗口

//selectwindow.h
#ifndef SELECTWINDOW_H
#define SELECTWINDOW_H
#include"mybutton.h"
#include"gamewindow.h"

#include <QMainWindow>

class selectWindow : public QMainWindow
{
    Q_OBJECT
public:
    explicit selectWindow(QMainWindow *parent = nullptr);
    void  paintEvent(QPaintEvent*);

signals:
    void returnToStart();

};
#endif // SELECTWINDOW_H
//selectwindow.cpp
#include "selectwindow.h"

#include<QIcon>
#include<QPixmap>
#include<QPainter>
#include<QMenuBar>
#include<QDebug>
#include<QLabel>
#include<QTimer>

selectWindow::selectWindow(QMainWindow *parent) : QMainWindow(parent)
{
    setFixedSize(360, 620);
    setWindowIcon(QIcon(":/res/Coin0001.png"));
    setWindowTitle("Coin Filp");

    //创建菜单
    QMenuBar* bar = new QMenuBar(this);
    setMenuBar(bar);
    QMenu* start = bar->addMenu("开始");
    QAction* quit = start->addAction("结束");
    connect(quit, &QAction::triggered, [=]{
        close();
    });

    //创建关卡选择
    for(int i = 0; i < 9; i++){
        //每一关按钮
        myButton* but = new myButton(":/res/LevelIcon.png");
        but->setParent(this);
        but->move(50 + i % 3 * 100, 180 + i / 3 * 100);
        //按钮上的标号
        QLabel* lab = new QLabel(this);
        lab->setText(QString().number(i + 1));
        lab->setFixedSize(but->width(), but->height());
        lab->move(50 + i % 3 * 100, 180 + i / 3 * 100);
        lab->setAlignment(Qt::AlignHCenter | Qt::AlignVCenter);//设置水平垂直居中
        QFont font;//字体设置
        font.setBold(true);
        font.setFamily("YouYuan");
        font.setPointSize(10);
        lab->setFont(font);
        //按钮穿透
        lab->setAttribute(Qt::WA_TransparentForMouseEvents);

        //建立关卡按钮连接
        connect(but, &QPushButton::clicked, [=]{
            QTimer::singleShot(500, this, [=]{
                gameWindow* game = new gameWindow(i + 1);
                game->setGeometry(geometry());
                game->show();
                this->hide();

                //游戏界面如果按下返回按钮
                connect(game, &gameWindow::returnToSelect, [=]{
                    this->setGeometry(game->geometry());//防止窗口位置与上一层不同
                    this->show();
                    delete game;
                });
            });
        });


    }

    //返回按钮
    myButton* ret = new myButton(":/res/BackButton.png", ":/res/BackButtonSelected.png");
    ret->setParent(this);
    ret->move(width() - ret->width(), height() - ret->height());

    connect(ret, &QPushButton::clicked, [=]{
        emit returnToStart();
    });

}

void selectWindow::paintEvent(QPaintEvent*){
    QPixmap pix;
    bool judge = pix.load(":/res/OtherSceneBg.png");
    if(judge == false) qDebug() << "Load Error";
    QPainter p(this);
    p.drawPixmap(0, 0, width(), height(), pix);
    pix.load(":/res/Title.png");
    p.drawPixmap(width() * 0.5 - pix.width() * 0.5, 30, pix);

}

(四).金币类

//coin.h
#ifndef CION_H
#define CION_H
#include <QWidget>
#include<QPushButton>
#include<QTimer>
#include<QPixmap>

class Coin : public QPushButton
{
    Q_OBJECT
public:
    Coin(int i, int j);
    void Filp();

    QTimer* time1;
    QTimer* time2;
    int subX;
    int subY;
    int min = 1;
    int max = 8;
    bool goldFace;
    bool filpNow = false;
    bool isWin = false;
signals:

};
#endif // CION_H
//coin.cpp
#include "coin.h"

#include<QTimer>
#include<QDebug>

Coin::Coin(int i, int j)
    :subX(i)
    ,subY(j)
    ,time1(new QTimer(this))
    ,time2(new QTimer(this))
{
    connect(time1, &QTimer::timeout, [=]{
        QPixmap pix;
        pix.load(QString(":/res/Coin000%1.png").arg(min++));
        setIconSize(QSize(pix.width(), pix.height()));
        setIcon(pix);
        if(min > max){
            min = 1;
            filpNow = false;
            time1->stop();
        }
    });
    connect(time2, &QTimer::timeout, [=]{
        QPixmap pix;
        pix.load(QString(":/res/Coin000%1.png").arg(max--));
        setIconSize(QSize(pix.width(), pix.height()));
        setIcon(pix);
        if(max < min){
            max = 8;
            filpNow = false;
            time2->stop();
        }
    });
}

void Coin::Filp(){
    if(filpNow == false && isWin == false){
        filpNow = true;
        if(goldFace){//翻成银币
            goldFace = false;
            time1->start(30);
        }
        else{//翻成金币
            goldFace = true;
            time2->start(30);
        }

    }
    else
    {
        return;
    }
}

(五).初始化金币数据类

//dataofcoin.h
#ifndef DATAOFCOIN_H
#define DATAOFCOIN_H
#include <QObject>
#include<QMap>
#include<QVector>

class Data : public QObject
{
    Q_OBJECT
public:
    explicit Data(QObject *parent = nullptr);

    QMap<int, QVector<QVector<int>>> dataMap;//记载每一关初始金币
signals:

};
#endif // DATAOFCOIN_H
//dataofcoin.cpp
#include "dataofcoin.h"

Data::Data(QObject *parent) : QObject(parent)
{
    //第一关
    QVector<QVector<int>> array = {{1, 1, 1, 1},
                                   {1, 1, 0, 1},
                                   {1, 0, 0, 0},
                                   {1, 1, 0, 1}};
    dataMap.insert(1, array);
    //第二关
    array = {{1, 0, 1, 1},
             {0, 0, 1, 1},
             {1, 1, 0, 0},
             {1, 1, 0, 1}};
    dataMap.insert(2, array);
    //第三关
    array = {{0, 0, 0, 0},
             {0, 1, 1, 0},
             {0, 1, 1, 0},
             {0, 0, 0, 0}};
    dataMap.insert(3, array);
    //第四关
    array = {{0, 1, 1, 0},
             {1, 1, 1, 1},
             {0, 0, 0, 0},
             {0, 0, 0, 0}};
    dataMap.insert(4, array);
    //第五关
    array = {{1, 0, 0, 1},
             {1, 0, 0, 1},
             {1, 0, 0, 1},
             {1, 0, 0, 1}};
    dataMap.insert(5, array);
    //第六关
    array = {{0, 0, 1, 0},
             {1, 1, 0, 0},
             {0, 0, 1, 1},
             {0, 1, 0, 0}};
    dataMap.insert(6, array);
    //第七关
    array = {{0, 1, 1, 0},
             {1, 0, 0, 1},
             {1, 0, 0, 1},
             {0, 1, 1, 0}};
    dataMap.insert(7, array);
    //第八关
    array = {{0, 0, 1, 0},
             {0, 0, 0, 1},
             {0, 1, 0, 0},
             {0, 0, 0, 0}};
    dataMap.insert(8, array);
    //第九关
    array = {{0, 0, 0, 0},
             {0, 0, 0, 0},
             {0, 0, 0, 0},
             {0, 0, 0, 0}};
    dataMap.insert(9, array);
}

(六).游戏窗口

//gamewindow.h
#ifndef GAMEWINDOW_H
#define GAMEWINDOW_H
#include"mybutton.h"
#include"coin.h"
#include"dataofcoin.h"

#include <QMainWindow>
#include<QPaintEvent>
#include<QVector>
#include<QPropertyAnimation>

class gameWindow : public QMainWindow
{
    Q_OBJECT
public:
    explicit gameWindow(int level);
    void paintEvent(QPaintEvent*);

signals:
    void returnToSelect();
private:
    void judgeWin();
    int gameLevel;
    bool isWinForButton = false;
    QVector<QVector<Coin*>> arrCoin;


};


#endif // GAMEWINDOW_H
//gamewindow.cpp
#include "gamewindow.h"
#include<QMenuBar>
#include<QPainter>
#include<QIcon>
#include<QPixmap>
#include<QDebug>
#include<QLabel>
#include<QFont>
#include<QMessageBox>
#include<QSound>

gameWindow::gameWindow(int level)
    :QMainWindow()
    ,gameLevel(level)
{
        setFixedSize(360, 620);
        setWindowIcon(QIcon(":/res/Coin0001.png"));
        setWindowTitle("Coin Filp");

        //创建菜单
        QMenuBar* bar = new QMenuBar(this);
        setMenuBar(bar);
        QMenu* start = bar->addMenu("开始");
        QAction* quit = start->addAction("结束");
        connect(quit, &QAction::triggered, [=]{
            close();
        });

        //返回按钮
        myButton* ret = new myButton(":/res/BackButton.png", ":/res/BackButtonSelected.png");
        ret->setParent(this);
        ret->move(width() - ret->width(), height() - ret->height());

        connect(ret, &QPushButton::clicked, [=]{
            //如果完成游戏或者消息对话框选择yes就emit信号函数给关卡层完成游戏层关闭
            if(isWinForButton ||
                    QMessageBox::Yes == QMessageBox::question(this, "warning",\
                              "确定回到选择界面么?",QMessageBox::Yes | QMessageBox::No)){
                    emit returnToSelect();//发送信号函数
        }

        });

        //关卡等级标签
        QLabel* lab = new QLabel(this);
        QFont font;
        font.setFamily("YouYuan");
        font.setPointSize(20);
        font.setBold(true);
        lab->setFont(font);
        lab->setText(QString("Level: %1").arg(gameLevel));
        lab->setFixedSize(ret->width() * 3, ret->height() * 2);
        lab->move(20, height() - lab->height());

        //创建金币矩阵
        Data data;
        for(int i = 0; i < 4; i++){
            arrCoin.push_back(QVector<Coin*>(4));
        }

        for(int i = 0; i < 4; i++){
            for(int j = 0; j < 4; j++){
                //创建背景
                QPixmap pix;
                pix.load(":/res/BoardNode.png");
                QLabel* lab = new QLabel(this);
                lab->setGeometry(0, 0, pix.width(), pix.height());
                lab->setPixmap(pix);
                lab->move(67 + j % 4 * pix.width() * 1.2, 200 + i % 4 * pix.height() * 1.2);

                //创建硬币
                QPixmap pixCoin;
                Coin* coin = new Coin(i, j);
                coin->setParent(this);
                arrCoin[i][j] = coin;
                if(data.dataMap[gameLevel][i][j] == 1){//建金币
                    pixCoin.load(":/res/Coin0001.png");
                    coin->goldFace = true;
                }
                else{//建银币
                    pixCoin.load(":/res/Coin0008.png");
                    coin->goldFace = false;
                }
                //设置币的位置
                coin->setFixedSize(pixCoin.width(), pixCoin.height());
                coin->setStyleSheet("QPushButton{border:Opx}");
                coin->setIcon(pixCoin);
                coin->setIconSize(QSize(pixCoin.width(), pixCoin.height()));
                coin->move(70 + j % 4 * pix.width() * 1.2, 203 + i % 4 * pix.height() * 1.2);

                connect(coin, &QPushButton::clicked, [=]{//硬币翻转
                    QSound* sound = new QSound(":/res/ConFlipSound.wav", this);
                    sound->play();
                    coin->Filp();
                    QTimer::singleShot(200, this, [=]{//延时翻转其他硬币
                        //翻转其他硬币
                        if(i < 3){//下
                            arrCoin[i + 1][j]->Filp();
                        }
                        if(i > 0){
                            arrCoin[i - 1][j]->Filp();
                        }
                        if(j < 3){//右
                            arrCoin[i][j + 1]->Filp();
                        }
                        if(j > 0){
                            arrCoin[i][j - 1]->Filp();
                        }

                        //判断是否胜利
                        judgeWin();
                    });
                });

            }
        }


}

void gameWindow::judgeWin(){
    for(auto& vec : arrCoin){
        for(auto& coin : vec){
            if(coin->goldFace == false) return;
        }
    }
    //此时已经胜利
    QTimer::singleShot(200, this, [=]{
        //播放成功音乐
        QSound* sound = new QSound(":/res/LevelWinSound.wav", this);
        sound->play();
    });
    for(auto& vec : arrCoin){
        for(auto& coin : vec){
            coin->isWin = true;
        }
    }
    isWinForButton = true;
    QPixmap pixWin;//加载成功图片
    pixWin.load(":/res/LevelCompletedDialogBg.png");
    QLabel* labWin = new QLabel(this);
    labWin->setFixedSize(pixWin.width(), pixWin.height());
    labWin->setPixmap(pixWin);
    labWin->setGeometry(0, 0, pixWin.width(), pixWin.height());
    labWin->move(width() * 0.5 - pixWin.width() * 0.5, -pixWin.height());
    labWin->show();//使用show才能展示
    //完成特效
    QPropertyAnimation* pro = new QPropertyAnimation(labWin, "geometry");
    pro->setDuration(1000);
    pro->setStartValue(QRect(labWin->x(), labWin->y(),\
                             labWin->width(), labWin->height()));
    pro->setEndValue(QRect(labWin->x(), 90,\
                             labWin->width(), labWin->height()));
    pro->setEasingCurve(QEasingCurve::OutBounce);
    pro->start();
}

void gameWindow::paintEvent(QPaintEvent*){//绘图事件,创建背景
    QPixmap pix;
    pix.load(":/res/OtherSceneBg.png");
    QPainter p(this);
    p.drawPixmap(0, 0, width(), height(), pix);
    //添加标题图片
    pix.load(":/res/Title.png");
    pix = pix.scaled(pix.width() * 0.5, pix.height() * 0.5);//图片缩放
    p.drawPixmap(0, 30, pix);
}

 

作为一个真正的程序员,首先应该尊重编程,热爱你所写下的程序,他是你的伙伴,而不是工具——未名 


如有错误,敬请斧正

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

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

相关文章

电脑系统格式化需不需要重装系统

​有小伙伴反应系统中毒无法彻底杀毒&#xff0c;不知道格式化需不需要重装系统吗那么下面小编给大家说说并且带来格式化重装系统步骤图解。 工具/原料&#xff1a; 系统版本&#xff1a;windows10系统 品牌型号&#xff1a;惠普战66五代 软件版本&#xff1a; 方法/步骤&…

【LeetCode】1802. 有界数组中指定下标处的最大值

1802. 有界数组中指定下标处的最大值 题目描述 给你三个正整数 n、index 和 maxSum 。你需要构造一个同时满足下述所有条件的数组 nums&#xff08;下标 从 0 开始 计数&#xff09;&#xff1a; nums.length nnums[i] 是 正整数 &#xff0c;其中 0 < i < nabs(nums…

怎么做form表单校验

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式表单校验1、input框生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的…

小程序从启动到发版

记录一下从拿到项目启动到发版的流程。 每个uniapp项目&#xff0c;管理员都会给你下发权限&#xff0c;用微信扫一扫登录 小程序官网 你可以在手机上看到你所有的权限账号&#xff0c;选择当前项目登录&#xff08;没有就是没下发你权限&#xff0c;找他去&#xff09; 开…

知道了这些vim编辑器使用小技巧可以让你写代码的速度直接飞起

文章目录一、前言二、Vim 编辑器的简单介绍2.1 命令模式2.2 输入模式2.3 底部命令模式2.4 三种模式的切换三、Vim 编辑器常用操作3.1 Vim 最基本的操作3.2 Vim 的光标移动操作3.3 多窗口同时打开多个文件四、一些其他的 Vim 小技巧一、前言 相信学习过Linux的朋友们对于Vim编辑…

pmp证书含金量怎么样?

含金量的问题&#xff0c;其实经过了这一系列的学习&#xff0c;这个证书对于学员们来说&#xff0c;只是一个证明自己有这个能力的证件而已&#xff0c;就算没有这个证件&#xff0c;他所学习的知识就不在自己的脑中了吗&#xff1f;必然是不可能的&#xff01; 这其实就是一…

excel函数应用:如何用数位函数分段提取身份证信息 下篇

在上篇内容中我们说到了用excel提取身份证号码中的户籍地址、出生日期、年龄、生肖、星座等内容&#xff0c;今天我们书接上回&#xff0c;继续带大家学习excel提取身份证信息的其他操作&#xff01;4、生日提醒生日提醒的问题&#xff0c;作者觉得要分两部分来说。&#xff08…

Reids的BigKey和HotKey

1.什么是BigKey和HotKey 1.1.Big Key Redis big key problem&#xff0c;实际上不是大Key问题&#xff0c;而是Key对应的value过大&#xff0c;因此严格来说是Big Value问题&#xff0c;Redis value is too large (key value is too large)。 到底多大的value会导致big key问…

各行业执法图传系统建设建议(华脉智联内参二)

各行业执法图传系统建设建议 让执法透明&#xff0c;不断提高执法工作效能 题记&#xff1a;为实现执法过程中的证据固定与执法场景记录&#xff0c;采用照相机、录音笔或固定监控等传统手段进行取证一直是最本源的需求。随着时代的变迁&#xff0c;传统的手段取证已无法满足完…

知识图谱构建:py2neo案例100个知识点应用

连接到 Neo4j 数据库执行一条简单的 Cypher 查询从查询结果中提取节点和关系插入一个新节点并与另一个节点建立关系根据标签查找节点根据属性查找节点根据关系查找节点在事务中执行多条查询使用索引查找节点使用约束确保唯一性删除节点和关系使用 py2neo.ogm 在 Python 中创建对…

访问学者申请要求及各国情况

访问学者申请要求及各国情况&#xff0c;下面就随知识人网小编一起来看一看。一、访问学者申请要求1、自身条件&#xff1a;访问学者主要是参看申请人当前的工作背景&#xff0c;专业背景以及科研背景等。在职群体申请访学需要具备本科学历和学位。此外&#xff0c;最重要的就是…

2023年,开挖电商这座金矿,有飞项这个协同工具就够了

2023年电商潜力怎样&#xff1f;据Morgan Stanley 研究&#xff0c;全球电商渗透还未见顶&#xff0c;物流发展、移动设备普及和市场拓展等因素仍然有利于电商发展&#xff0c;长期来看仍有增长空间&#xff0c;当前3.3万亿美元的电商市场规模有望在2026年增长到5.4万亿。 如何…

测试的准入准出

测试的准入准出 测试的准入住处是指什么情况下可以开始当前版本的测试工作&#xff0c;什么情况下可以结束当前版本的测试工作。不同项目、不同公司的测试准入准出标准都会有所不同。下面介绍一些通用的测试准入准出标准。 测试准入标准如下&#xff1a; (1)开发编码结束&#…

webpack概念

webpack概念webpackwebpack-概念webpack-使用准备webpack-基础使用webpack-更新打包webpack-配置修改webpack-打包流程图webpack 使用ES6模块化默认导出和导入 // 默认导出 export default {a: 10,b: 20 }// 默认导入 import Obj from js文件路径按需导出和导入 // 按需导出…

【每日一题】【LeetCode】【第三天】删除有序数组中的重复项

删除有序数组中重复项的解决之路 这个标签是简单&#xff0c;所以比较好过。 题干描述 根据题目描述&#xff0c;重点在于原地删除&#xff0c;也就是空间复杂度为O(1)。 测试案例&#xff08;部分&#xff09; 第一次 根据题目描述&#xff0c;重点在于原地删除。 class…

解决Linux【-bash: fork: retry: 没有子进程】

解决Linux【-bash: fork: retry: 没有子进程】问题发现问题解决设置Linux最大用户线程数设置单个用户可用最大进程数问题发现 日常工作中&#xff0c;服务器连不上&#xff0c;好在昨天登陆的服务器用户没有下线&#xff0c;然后执行任何命令时返回- bash: fork: retry: 没有子…

React(coderwhy)- 03(高阶组件+动画)

1.React性能优化SCU React更新机制 React的更新流程 ◼ React在props或state发生改变时&#xff0c;会调用React的render方法&#xff0c;会创建一颗不同的树。 ◼ React需要基于这两颗不同的树之间的差别来判断如何有效的更新UI&#xff1a;  如果一棵树参考另外一棵树进行完…

可观测产品的最佳实践,涵盖端到端的可观测解决方案丨阿里云用户组深圳站

2022 年 9 月 28 日&#xff0c;阿里云在深圳举办了第 11 场阿里云用户组&#xff08;AUG&#xff09;活动&#xff0c;活动主题“可观测性实践”吸引了众多技术从业者及企业管理者来到现场。通过本次活动&#xff0c;参会企业了解到三块内容&#xff1a;1. Java 应用最佳实验&…

小蓝本 第一本 《因式分解技巧》 第八章 多项式的一次因式 笔记 (第八天)

小蓝本 第一本 《因式分解技巧》 第八章 多项式的一次因式 笔记 &#xff08;第八天&#xff09;前言余数定理有理根求法第一步第二步(可能有理根多的情况下&#xff0c;可以用)第三步快速识别特殊有理根情况1情况2求解注意习题8题目题解改错前言 坚持的第8天&#xff0c;因为…

北大陈斌Python算法笔记(一)

前言 &#x1f340;作者简介&#xff1a;被吉师散养、喜欢前端、学过后端、练过CTF、玩过DOS、不喜欢java的不知名学生。 &#x1f341;个人主页&#xff1a;红中 &#x1f342;不就是蓝桥杯嘛&#xff0c;干他&#xff01;&#xff01;我堂堂 线性结构 线性结构是一种有序数…