数码暴龙机(电波暴龙机)彩色复刻版!!| 使用Python、PySide6、pixilart自制windows桌面宠物

news2024/9/19 14:10:33

一、前言

数码暴龙机(电波暴龙机)是万代公司发售的一系列与《数码兽》系列相关的液晶玩具商品。这些产品融合了养成和对战元素,为玩家提供了一种虚拟养成和战斗的娱乐体验。也是很多人的童年回忆。最近在B站刷到讲解暴龙通关的教程和视频,感觉暴龙机程序制作还是非常用心和精良的,在32*32黑白的点阵中,居然可以做出那么完整的动画。

最近正在学习PySide6桌面程序开发,继而萌生了用Python做一款桌面版数码暴龙机(电波暴龙机)的想法,经过几周的研究和探索,最后使用pixilart画像素画、使用PySide制作桌面宠物,使用Python代码控制点阵显示逻辑,终于完成了数码暴龙机(电波暴龙机)windows桌面彩色复刻版。接下来详细分享一下制作过程。

二、数码暴龙机(电波暴龙机)彩色复刻版成果展示

2.1 数码暴龙机(电波暴龙机)彩色复刻版展示

在这里插入图片描述

2.2 数码暴龙机(电波暴龙机)战斗动画展示

在这里插入图片描述

2.3 数码暴龙机(电波暴龙机)机身拖拽及右键弹出菜单展示

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

2.4 数码暴龙机(电波暴龙机)系统托盘展示

托盘截图:
托盘截图
菜单截图:
在这里插入图片描述

三、学习和研究过程分享

3.1 寻找数码暴龙机(电波暴龙机)素材

要完成复刻,首先要找到原版,通过网页搜索,发现初代电波暴龙机的图片和视频比较多,那就先尝试一下做初代的吧。
在浏览众多暴龙机相关网站后,最终选择了这个网址【游戏咖啡馆】来当一次被选召的孩子!初代电波暴龙机玩法简介的视频的进行复刻,这个视频讲的很详细,视频清晰可以很方便博主截图后进行研究,以下是该视频的截图。

在这里插入图片描述


在这里插入图片描述


3.2 获取数码暴龙机(电波暴龙机)黑色点阵图片并用pixilart进行彩色重绘

Pixilart是一款高颜值、简单易用的在线像素画绘制工具。Pixilart提供了一个直观的平台,使用者无需深厚的设计背景即可轻松创建像素艺术。它的界面简洁,功能齐全,从制图到下载一气呵成,实现了即开即用,极大地方便了用户。①在线使用:Pixilart作为一个在线工具,无需下载安装任何软件,用户只需通过网络浏览器即可访问和使用,极大地提高了使用的便利性;②无需注册:与其他一些设计工具不同,Pixilart无需用户注册即可直接使用,省去了繁琐的账号创建过程,使得用户体验更为流畅。

找到初代电波暴龙机视频后,接下来就到选取准备复刻的数码暴龙机(电波暴龙机)画面,经过挑选,博主选定了视频中阿古兽站立、步行、战斗、胜利四个画面进行复刻。然后使用浏览器的截图功能把这四个画面的每一帧不同的图片进行截图和保存。最后使用pixilart进行彩色重绘,保存为32*32的位图文件(这里博主专门数了一下视频里的液晶屏幕点阵,还真是32*32),方便后续Python程序进行调用。

3.2.1 用Pixilart重绘动画帧

1)用Pixilart重绘阿古兽站立动画,如下图:

在这里插入图片描述
用Pixilart彩色桶工具进行上色,如下图:

在这里插入图片描述
画好第一张图的时候,博主还是很震撼的,原来的设计师真是厉害,可以把动画里的角色用点阵还原的那么生动,没有任何多余的像素点,多一个或者少一个都会让人觉得不舒服,实在佩服。


2)用Pixilart重绘阿古兽步行动画,如下图:

在这里插入图片描述


3)用Pixilart重绘战斗画面,这里战斗画面的帧数就比较多了,估计有几十帧,博主花了好长时间才一帧一帧绘制好,真心累o(╥﹏╥)o,过程如下图:

战斗遇敌画面:

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


PS:这里还专门上网找了下图这个数码兽叫啥,叫基刹兽,不然无法完成上色,博主果然很专业,哈哈。
在这里插入图片描述
战斗血量画面:
在这里插入图片描述


战斗爆炸画面,颜色是拍脑袋选的,感觉还可以:

在这里插入图片描述


4)用Pixilart重绘胜利画面,如下图:

在这里插入图片描述


把这四个画面都重新画好后就可以进入下一步了,开始用PySide6来开发用于显示这几个动画的Python程序,让他们真正的动起来。

四、设计和研发过程分享

4.1桌面宠物程序框架设计

由于以前没写过桌面宠物的代码,所以还是在网上找资源来修改比较省事,经过搜索在CSDN找到一个比较合适“魔改”的资源。有兴趣可以点击这个链接详细阅读->桌面宠物 ① 通过python制作属于自己的桌面宠物。

参考的资源是使用PyQt5来做的,而博主是基于PySide6来开发的,所以需要对原代码进行一定的修改,并加入数码暴龙机(电波暴龙机)的显示逻辑,最后通过一顿魔改操作后形成了自己的桌面宠物程序框架,主要包括机身显示、鼠标拖拽、动画显示、右键控制菜单、显示托盘控制菜单五个部分,如下图:

程序框架
UI
1.暴龙机机身显示
1.1暴龙机机身
1.2暴龙机液晶屏幕
1.3暴龙机按钮
2.暴龙机机身鼠标拖拽
逻辑控制
3.暴龙机屏幕动画显示
3.1站立动画
3.2行走动画
3.3战斗动画
3.4胜利动画
4.暴龙机右键弹出菜单
4.1显示/隐藏
4.2退出
5.暴龙机系统托盘

4.2用PySide6实现暴龙机显示

要复刻桌面版暴龙机,首先要实现机身的显示,我们可以找到一张暴龙机的机身透明PNG图片,然后通过PySide6的QWidget()、QPixmap()等组件显示即可。主要需要注意的是设置窗口的透明以及图片对齐。

class DigitalPet(QWidget)新建一个DigitalPet类(窗体)并继承QWidget类(窗体),用于承载各类组件,并分别调用以下几个方法完成程序初始化。
self.init() 初始化窗体;
self.init_notification_area()初始化托盘;
self.init_mask() 初始化遮罩(机身);
self.init_digital_pet_image() 初始化动画显示控件(液晶屏幕);
self.init_digital_pet_action() 初始化动画任务(屏幕图像变化逻辑)。

主要代码:

class DigitalPet(QWidget):
    def __init__(self, parent=None, **kwargs):
        super(DigitalPet, self).__init__(parent)

        # 控制面板相关区域
        self.notification_area_menu = QMenu(self)  # 新建一个菜单项控件
        self.notification_area_icon = QSystemTrayIcon(self)  # 设置系统托盘中的图标

        # 遮罩区域
        self.mask = QLabel(self) # 新建遮罩背景
        self.btn_a = QPushButton(self)  # 新建遮罩按钮
        self.is_follow_mouse = None
        self.mouse_drag_pos = None

        # 显示动画区域
        self.image = QLabel(self)  # 新建QLabel对象,用于显示动画
        self.image_list = []  # 用于存放所有动画文件地址的动画文件地址列表
        self.movie_list = []  # 用于存放所有动画的对象的动画对象列表
        self.cur_movie = QMovie()  # 新建当前的动画的QMovie对象
        self.cur_movie_accumulate_frame = 0  # 记录当前动画累计播放的帧数,用于监控动画结束
        self.cur_movie_frequency = 1  # 记录当前动画需要循环的次数
        self.image_opacity = 1  # 透明度,用于设置显示和隐藏

        # 动画控制系统相关
        self.state_list = ["stand", "run"]  # 动画状态列表
        self.cur_state = "stand"  # 当前状态
        self.task_queue = Queue(maxsize=100)  # 显示动画任务队列
        self.timer = QTimer()  # 时钟

        # 初始化
        self.init()  # 窗体初始化
        self.init_notification_area()  # 托盘初始化
        self.init_mask()  # 遮罩初始化
        self.init_digital_pet_image()  # 动画显示控件初始化
        self.init_digital_pet_action()  # 动画任务(逻辑)初始化
4.2.1 def init(self)

def init(self)方法用于初始化窗体,并做一些窗体的设置,包括设置窗口无标题栏且固定在最前面,设置无边框窗口,设置窗口总显示在最上面,设置窗口透明,设置窗体空间不透明等。

透明背景截图:
在这里插入图片描述
主要代码:

# 窗体初始化
    def init(self):
        # 初始化
        # 设置窗口属性:窗口无标题栏且固定在最前面
        # FrameWindowHint:无边框窗口
        # WindowStaysOnTopHint: 窗口总显示在最上面
        # SubWindow: 新窗口部件是一个子窗口,而无论窗口部件是否有父窗口部件
        self.setWindowFlags(Qt.FramelessWindowHint | Qt.WindowStaysOnTopHint | Qt.SubWindow)
        # setAutoFillBackground(True)表示的是自动填充背景,False为透明背景
        # self.setAutoFillBackground(False)
        # 窗口透明,窗体空间不透明
        self.setAttribute(Qt.WA_TranslucentBackground, True)
        self.resize(300, 300)
        # 重绘组件、刷新
        self.repaint()
4.2.2 def init_notification_area(self)

def init_notification_area(self)方法用于初始化系统托盘,并在托盘中加入隐藏/显示、退出菜单。

托盘截图:
托盘截图
菜单截图:
在这里插入图片描述
主要代码:

# 托盘化设置初始化
    def init_notification_area(self):
        # 导入准备在托盘化显示上使用的图标
        icons = os.path.join('cong.png')
        # 菜单项显示,点击后调用showing函数
        show_action = QAction(u'隐藏/显示', self, triggered=self.show_digital_pet)
        # 设置右键显示最小化的菜单项,菜单项退出,点击后调用quit函数
        quit_action = QAction('退出', self, triggered=self.quit)
        # 设置这个点击选项的图片
        quit_action.setIcon(QIcon(icons))

        # 在菜单栏添加一个无子菜单的菜单项‘隐藏/显示’
        self.notification_area_menu.addAction(show_action)
        # 在菜单栏添加一个无子菜单的菜单项‘退出’
        self.notification_area_menu.addAction(quit_action)

        # 设置托盘图标
        self.notification_area_icon.setIcon(QIcon(icons))
        # 设置托盘菜单
        self.notification_area_icon.setContextMenu(self.notification_area_menu)
        # 展示自定义托盘
        self.notification_area_icon.show()
4.2.3 def init_mask(self)

def init_mask(self)方法用于初始化遮罩(暴龙机机身),使用QPixmap(“mask/D1_2.png”).scaled(QSize(240, 240))加载并缩放暴龙机机身,使用self.btn_a.clicked.connect(self.fight_action)绑定暴龙机按钮事项。

按钮和遮罩截图:
在这里插入图片描述
主要代码:


    def init_mask(self):
        # 初始化遮罩
        qpm = QPixmap("mask/D1_2.png").scaled(QSize(240, 240))
        self.mask.setPixmap(qpm)
        # 初始化按钮
        btn_a_qpb = QPixmap("mask/button_A.png")
        self.btn_a.setFixedSize(71, 54)
        self.btn_a.setIcon(QIcon(btn_a_qpb))
        self.btn_a.setIconSize(QSize(60, 40))
        self.btn_a.setFlat(True)
        self.btn_a.move(165, 65)
        self.btn_a.clicked.connect(self.fight_action)
4.2.4 def init_digital_pet_image(self)

self.init_digital_pet_image() 初始化动画显示控件(液晶屏幕),该方法通过os.listdir(“image/”)遍历image文件夹下的所有图片,然后使用Python的GIF图片显示QMovie对象把GIF图片转换成Python的QMovie对象,最后统一添加到movie_list列表中,用于后续使用这些QMovie对象进行动画播放。

image文件夹中的GIF图片文件截图:
在这里插入图片描述

主要代码:

# 动画显示控件初始化
    def init_digital_pet_image(self):

        # 遍历image文件夹将所有动图存入图片列表
        for file_name in os.listdir("image/"):
            self.image_list.append("image/" + file_name)
            print(file_name, end="|")
        # QMovie是一个可以存放动态视频的类,一般是配合QLabel使用的,可以用来存放GIF动态图
        # 根据图片列表存储的文件路径,生产对应的QMovie对象,并存入movie_list
        for i in range(0, len(self.image_list)):
            self.movie_list.append(QMovie(self.image_list[i]))
4.2.5 def init_digital_pet_action(self)

self.init_digital_pet_action() 初始化动画任务(屏幕图像变化逻辑),该方法使用Python的先进先出队列Queue对象,控制task_queue队列里QMovie对象进出,在合适的时间显示不同的GIF动画,实现暴龙机动画的播放。

主要代码:

# 动画任务(逻辑)初始化
    def init_digital_pet_action(self):
        # 使用第一张图片作为初始movie
        first_gif_movie = GifMovie(name="stand", movie=self.movie_list[9], frequency=3)
        # 设置动图实际显示大小
        self.cur_movie = first_gif_movie.movie
        self.cur_movie.setCacheMode(QMovie.CacheAll)
        self.cur_movie.setScaledSize(QSize(64, 64))
        # 设置image对象,并启动gif播放
        self.image.move(89, 88)
        self.change_action(first_gif_movie)
        # 展示
        self.show()
        
    # 根据动画队列,开始动画显示任务
    def start_task(self):
        # 判断当前动画队列是否为空
        if self.task_queue.empty() is not True:
            # 取出队列对象并删除队列中的该对象删除
            cur_gif_movie = self.task_queue.get()
            # 调用change_action方法更新动画
            self.change_action(cur_gif_movie)
        else:
            cur_state = random.choice(self.state_list)
            if cur_state == "stand":
                self.stand_action()
            if cur_state == "run":
                self.run_action()

            # 取出队列对象并删除队列中的该对象删除
            cur_gif_movie = self.task_queue.get()
            # 调用change_action方法更新动画
            self.change_action(cur_gif_movie)

# 更新动画
    def change_action(self, gif_movie):
        # 根据获取的队列元素,更新cur_movie和cur_movie_frequency的值
        print("action:", gif_movie.name, end=" ")
        self.cur_state = gif_movie.name
        self.cur_movie = gif_movie.movie
        self.cur_movie_frequency = gif_movie.frequency
        # 更新label组件
        self.image.setMovie(self.cur_movie)
        # 重置cur_movie_accumulate_frame为0
        self.cur_movie_accumulate_frame = 0
        # 动画帧变化信号绑定stop_frame方法
        self.cur_movie.frameChanged.connect(self.stop_frame, Qt.UniqueConnection)
        # 动画状态变化信号绑定check_movie_state方法
        self.cur_movie.stateChanged.connect(self.check_movie_state, Qt.UniqueConnection)
        # 启动动画
        self.cur_movie.start()
        
# 自定义动画类
# name 动画名称
# movie 动画对象
# frequency 动画重复次数
class GifMovie:
    def __init__(self, name, movie, frequency):
        self.name = name
        self.movie = movie
        self.frequency = frequency

4.3用PySide6实现暴龙机鼠标拖拽

通过对DigitalPet添加def mousePressEvent(self, event)(按下鼠标)、def mouseMoveEvent(self, event)(移动鼠标)、def mouseReleaseEvent(self, event)(松开鼠标)、def enterEvent(self, event)(鼠标进入窗体)事件的处理代码,实现暴龙机鼠标拖拽。

拖拽截图:
在这里插入图片描述

主要代码:

# 在遮罩中点击鼠标左键时, 遮罩将和鼠标位置绑定
    def mousePressEvent(self, event):
        if event.button() == Qt.LeftButton:
            self.is_follow_mouse = True
        # globalPos() 事件触发点相对于桌面的位置
        # pos() 程序相对于桌面左上角的位置,实际是窗口的左上角坐标
        self.mouse_drag_pos = QCursor.pos() - self.pos()
        event.accept()
        # 拖动时鼠标图形的设置
        self.setCursor(QCursor(Qt.OpenHandCursor))

    # 鼠标移动时调用,实现宠物随鼠标移动
    def mouseMoveEvent(self, event):
        # 如果鼠标左键按下,且处于绑定状态
        if Qt.LeftButton and self.is_follow_mouse:
            # 宠物随鼠标进行移动
            self.move(QCursor.pos() - self.mouse_drag_pos)
        event.accept()

    # 鼠标释放调用,取消绑定
    def mouseReleaseEvent(self, event):
        self.is_follow_mouse = False
        # 鼠标图形设置为箭头
        self.setCursor(QCursor(Qt.ArrowCursor))

    # 鼠标移进时调用
    def enterEvent(self, event):
        # 设置鼠标形状 Qt.ClosedHandCursor
        self.setCursor(Qt.ClosedHandCursor)

4.5用PySide6实现暴龙机右键弹出菜单

通过def contextMenuEvent(self, event)方法实现暴龙机右键弹出菜单,邮件弹出菜单包含退出和隐藏暴龙机功能。

右键弹出菜单截图:
在这里插入图片描述

主要代码:

# 宠物右键点击交互
    def contextMenuEvent(self, event):
        # 定义菜单
        menu = QMenu(self)
        # 定义菜单项
        quitAction = menu.addAction("退出")
        hide = menu.addAction("隐藏")
        # 使用exec()方法显示菜单。从鼠标右键事件对象中获得当前坐标。mapToGlobal()方法把当前组件的相对坐标转换为窗口(window)的绝对坐标。
        action = menu.exec(self.mapToGlobal(event.pos()))
        # 点击事件为退出
        if action == quitAction:
            app.quit()
        # 点击事件为隐藏
        if action == hide:
            # 通过设置透明度方式隐藏宠物
            self.setWindowOpacity(0)

四、下一步计划

到这里,复刻数码暴龙机(电波暴龙机)就完成了,而且还为原来的黑色液晶添加了彩色,整个研究、设计、开发过程大概几周时间,看来Python的效率还是挺高的。这个程序只是用来研究可以学习,未来有时间再继续对这个程序进行完善和升级。

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

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

相关文章

java——Junit单元测试

测试分类 黑盒测试:不输入代码,给输入值,看程序能够给出期望的值。 白盒测试:写代码,关注程序具体执行流程。 JUnit单元测试 一个测试框架,供java开发人员编写单元测试。 是程序员测试,即白…

qt 创建一个可以拖拽的矩形,简单实践

1.概要 需求&#xff0c;一个可以拖拽的矩形&#xff0c;鼠标接近边线点击变成可拖拽形状。 2.代码 #include <QApplication> #include <QGraphicsView> #include <QGraphicsScene> #include <QGraphicsRectItem> #include <QMouseEvent> #in…

教大家如何下载保存腾讯会议的视频到本地

引言&#xff1a; 大家好&#xff0c;今天教大家如何下载保存腾讯会议的视频到本地&#xff0c;我们这边是地方网络技术&#xff01; 很多时候&#xff0c;腾讯会议的视频是无法直接下载保存的。今天我们就教大家如何下载保存腾讯会议的视频到本地。方法非常简单一&#xff0…

基于Faster R-CNN的安全帽目标检测

基于Faster R-CNN的安全帽目标检测项目通常旨在解决工作场所&#xff0c;特别是建筑工地的安全监管问题。这类项目使用计算机视觉技术&#xff0c;特别是深度学习中的Faster R-CNN算法&#xff0c;来自动检测工人是否正确佩戴了安全帽&#xff0c;从而确保遵守安全规定并减少事…

iOS ------ 消息传递和消息转发

一&#xff0c;消息传递 在OC中&#xff0c;传递消息就是在对象上调用方法。 相对于C语言的方法就“静态绑定”的函数&#xff0c;在编译器就决定了运行时所要调用的函数。在OC中&#xff0c;如果向某对象传递消息&#xff0c;就会使用动态绑定机制来决定需要调用那个方法。调…

网易天音:网易云音乐推出的一站式AI音乐创作工具

网易天音是一款由网易云音乐推出的AI音乐创作工具&#xff0c;它为音乐爱好者和专业歌手提供了一个便捷高效的创作平台。用户可以通过输入灵感&#xff0c;利用AI技术辅助完成作词、作曲、编曲和演唱&#xff0c;生成初稿后还可以进行词曲协同调整&#xff0c;以满足个性化的音…

ScanImage介绍

ScanImage 是由 Howard Hughes Medical Institute (HHMI) 的 Janelia Research Campus 开发的一款开源显微镜控制软件&#xff0c;专门用于双光子显微镜和其他高端显微镜系统的控制和数据采集。它被广泛应用于神经科学和生物医学研究领域&#xff0c;以其高效的成像性能和灵活的…

CSA笔记2-文件管理命令

tree 以树状图显示多级目录 示例&#xff1a; [rootlocalhost ~]# tree haha/ haha/ └── 111 └── 222 2 directories, 0 files [rootlocalhost ~]# tree -L 1 haha/haha/ └── 111 echo > >> < << 示例&#xff1a; [rootxxx ~]#…

vs中的代码有红色波浪线怎么办?

vs中的代码有红色波浪线怎么办? 问题分析问题解决 问题分析 环境没有错,代码语法也没有错,程序可正常运行,但是程序在vs中出现了红色波浪线.(俗称:vs抽风了怎么办?) 问题解决 项目->重新扫描解决方案

工业物联网智能网关重要性及功能特点应用探索-天拓四方

随着物联网技术的飞速发展&#xff0c;工业物联网智能网关作为连接物理世界与数字世界的桥梁&#xff0c;正逐渐成为工业4.0时代不可或缺的核心组件。本文将结合实际使用案例&#xff0c;探讨工业物联网智能网关的重要性、功能特点以及在实际应用中的效果与价值。 一、工业物联…

基于jeecgboot-vue3的Flowable流程支持bpmn流程设计器与仿钉钉流程设计器-编辑多版本处理

因为这个项目license问题无法开源&#xff0c;更多技术支持与服务请加入我的知识星球。 1、前端编辑带有仿钉钉流程的处理 /** 编辑流程设计弹窗页面 */const handleLoadXml (row) > {console.log("handleLoadXml row",row)const params {flowKey: row.key,ver…

本地部署:Real-ESRGAN: 高效的图像超分辨率解决方案

目录 引言 什么是 Real-ESRGAN Real-ESRGAN 的特点 工作原理 应用场景 本地部署 本地运行 实验与结果 未来发展方向 结语 Tip&#xff1a; 引言 图像超分辨率&#xff08;Super-Resolution, SR&#xff09;技术旨在从低分辨率图像生成高分辨率图像&#xff0c;应用…

C++ 回溯算法

什么时候不需要startIndex? 全排列&#xff1a;1在[1,2]中已经使用过了&#xff0c;但是在[2,1]中还要在使用一次1&#xff0c;所以处理排列问题就不用使用startIndex了&#xff1b;电话号码的字母组合&#xff1a;如果是多个集合取组合&#xff0c;各个集合之间相互不影响&a…

Windows与Linux双机热备软件推荐

网络数据安全在如今信息化的时代越来越变得举足轻重&#xff0c;因此服务器维护和管理也成为企业健康稳定运营的一项重要工作。但实际情况是很多公司并没有配备专业的运维人员&#xff0c;一般都会通过一些管理软件维护或者主机托管给服务商。整理6款服务器的Windows与Linux双机…

Redis系列命令更新--Redis列表命令

Redis列表 1、Redis Blpop命令&#xff1a; &#xff08;1&#xff09;说明&#xff1a;Redis Blpop命令移出并获取列表的第一个元素&#xff1b;如果列表没有元素会阻塞列表直到等到超时或发现可弹出元素为止 &#xff08;2&#xff09;语法&#xff1a;redis 127.0.0.1:63…

Python37 智能优化算法之差分进化算法DE

发展背景和原理 差分进化算法&#xff08;Differential Evolution, DE&#xff09;是一种基于群体的随机优化算法&#xff0c;由Storn和Price于1995年提出。该算法起源于遗传算法&#xff08;Genetic Algorithm, GA&#xff09;&#xff0c;但其具有更简单的结构和更强的全局搜…

IDEA字体如何放大调整?快捷键是什么?

在编程的世界里&#xff0c;IDE&#xff08;集成开发环境&#xff09;是我们探索代码、构建梦想的舞台。IntelliJ IDEA&#xff0c;作为Java开发者乃至多语言开发者的首选工具之一&#xff0c;以其强大的功能、流畅的界面和丰富的插件生态赢得了无数开发者的青睐。然而&#xf…

奇门遁甲起名大师颜廷利:中国最厉害的改名字大师

奇门遁甲起名大师颜廷利&#xff1a;中国最厉害的改名字大师 在中国奇门遁甲的领域里&#xff0c;颜廷利教授以其深厚的学识和卓越的成就&#xff0c;被公认为排名第一的大师。他不仅在南派易学中占据泰斗地位&#xff0c;而且在北派易经的代表人物中也是一位杰出的领军者。作为…

nftables(8)MAPS、VMAPS

MAPS MAPS简介 上篇文章我们介绍了SETS集合相关的内容&#xff0c;本篇文章主要介绍map&#xff0c;在nftables中&#xff0c;Map&#xff08;映射&#xff09;用于存储键值对&#xff0c;类似于许多编程语言中的关联数组/字典/哈希表。在nftables规则中&#xff0c;可以指定…

SVH勒索病毒详解,数据库恢复指南

引言 在数字化时代&#xff0c;网络安全问题日益严峻&#xff0c;其中勒索病毒成为威胁个人、企业及政府机构数据安全的重大隐患。SVH勒索病毒作为一种极具破坏性的恶意软件&#xff0c;通过加密受害者的重要文件并要求支付赎金来解锁&#xff0c;给受害者带来了巨大经济损失和…