当前位置: 首页 > news >正文

python实现小游戏——植物大战僵尸(魔改版本)

制作一款DIY的‘植物大战僵尸’游戏引起了很多人的兴趣。在这里,我将分享一个使用Python语言在PyCharm环境中开发的初始状态版本。这个版本主要应用了pygame库来完成,是一个充满创意和趣味的魔改版本。

文章目录

  • 前言
  • 一、开发环境准备
  • 二、代码
    • 1.main方法
    • 2.敌人角色(示例)
    • 2.我方角色(示例)
  • 总结


前言

近期,《植物大战僵尸杂交版》的热度确实高涨,这主要得益于其独特的创意、对经典游戏的致敬与创新,以及玩家社区的积极反馈与传播。《植物大战僵尸杂交版》由B站UP主“潜艇伟伟迷”开发制作,游戏中引入了杂交植物的概念,如豌豆向日葵、火焰花女王等,这些杂交植物结合了多种植物的特性,拥有独特的攻击方式和能力,极大地丰富了游戏的策略性和可玩性。除了杂交植物外,游戏中还加入了多种新奇的僵尸类型,如武装舞王僵尸、冰车巨人等,以及全新的地图设计,为玩家带来更加刺激和挑战性的游戏体验。游戏不仅保留了原版的经典模式,还增加了抽奖盒子无尽模式等Roguelike玩法,以及多种有趣的小游戏和挑战模式,让玩家在重复游玩中也能保持新鲜感。

制作一款DIY的‘植物大战僵尸’游戏引起了很多人的兴趣。在这里,我将分享一个使用Python语言在PyCharm环境中开发的初始状态版本。这个版本主要应用了pygame库来完成,是一个充满创意和趣味的魔改版本。
在这里插入图片描述

在这篇博文我将源代码以及运行程序压缩包: 运行程序
(解压后可直接运行)一并分享出来,并给出源码链接: 源码供免费下载。
里面的所有角色图片来自网络资源都来自于网络资源,由本人一张一张裁剪制作而成,制作不易,希望喜欢并使用的小伙伴可以为我点一个star。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述


提示:以下是本篇文章正文内容,下面案例可供参考

一、开发环境准备

实现上述描述的DIY“植物大战僵尸”游戏,你需要准备以下代码环境:
1.Python语言:
确保你的计算机上安装了Python。可以从Python的官方网站下载并安装最新版本的Python。
2.PyCharm IDE:
PyCharm是一个流行的Python集成开发环境(IDE),它提供了代码编辑、调试、测试等功能。你可以从JetBrains的官方网站下载并安装PyCharm。
3.pygame库:
pygame是一个用于创建游戏的Python库,它提供了图形、声音、事件处理等游戏开发所需的功能。你可以使用pip命令来安装pygame库:pip install pygame。

二、代码

1.main方法

代码如下:

# -*- codeing = utf-8 -*-
# @Time : 2023/1/14 15:59
# @Author : 小马
# @File: plant_vs_zoomie_game_normal_main.py
# @Software : PyCharm
import time
import pygame
import random
import os
from Adc import Adc
from shooter import shoot
from Ap import Ap
from tank import tank
from Sun import Sun
from Zombie import Zombie
from badmanmini import badmanmini
from Bullet import Bullet
from bulletshooter import bulletshooter
from enemy import enemy
from Carman import Carman
from Boss import Boss
from pythonExtend import pythonExtend
pygame.init()
#1680*720
backgd_size=(1200,600)
screen=pygame.display.set_mode(backgd_size)
pygame.display.set_caption('保卫花花之家')
bg_image_path= 'material/bg1.1.png'
bg_img_obj=pygame.image.load(bg_image_path).convert_alpha()
# sunbank_image_path= 'material/counter2.jpeg'
# sunbank_img_obj=pygame.image.load(sunbank_image_path).convert_alpha()
sunbankImg=pygame.image.load('material/cardbank.png').convert_alpha()
deleteImg=pygame.image.load('material/delete1.png').convert_alpha()
delete=pygame.image.load('material/delete.png').convert_alpha()
cardadc=pygame.image.load('material/cardadc.png').convert_alpha()
cardap=pygame.image.load('material/cardap.png').convert_alpha()
cardtank=pygame.image.load('material/cardtank.png').convert_alpha()
cardshooter=pygame.image.load('material/cardshooter.png').convert_alpha()
apImg=pygame.image.load('material/character3.1.PNG').convert_alpha()
tankImg=pygame.image.load('material/character4.1.PNG').convert_alpha()
adcImg=pygame.image.load('material/character1.1.1.PNG').convert_alpha()
shooterImg=pygame.image.load('material/character2.1.PNG').convert_alpha()
text='900'
sun_font=pygame.font.SysFont('arial',25)
sun_num_surface=sun_font.render(text,True,(0,0,0))
# adc=Adc()
# ap=Ap()
# tank=tank()
#shoot=shoot()
# zombie=Zombie()
# badman=badmanmini()
# enemy=enemy()
spriteGroup=pygame.sprite.Group()
#spriteGroup.add(adc)
# spriteGroup.add(ap)
# spriteGroup.add(tank)
#spriteGroup.add(shoot)
# spriteGroup.add(zombie)
# spriteGroup.add(badman)
# spriteGroup.add(enemy)
sunList=pygame.sprite.Group()
bulletList=pygame.sprite.Group()
enemyList=pygame.sprite.Group()
clock=pygame.time.Clock()
GEN_SUN_EVENT=pygame.USEREVENT+1
pygame.time.set_timer(GEN_SUN_EVENT,1000)
GEN_BULLET_EVENT=pygame.USEREVENT+2
pygame.time.set_timer(GEN_BULLET_EVENT,3000)
GEN_ENERMY_EVENT=pygame.USEREVENT+3
pygame.time.set_timer(GEN_ENERMY_EVENT,9000)
choose=0 #点中太阳花为1 点中坚果为2 点中射手为3 点中ADC为4
def init():pygame.mixer.init()s='material/sound'bgm=pygame.mixer.Sound(os.path.join(s,'bgm1.mp3'))start=pygame.mixer.Sound(os.path.join(s,'start1.mp3'))start2=pygame.mixer.Sound(os.path.join(s,'start2.mp3'))bossbgm=pygame.mixer.Sound(os.path.join(s,'boss.mp3'))tank1=pygame.mixer.Sound(os.path.join(s,'tank.mp3'))pygame.mixer.Sound.play(start)pygame.mixer.Sound.play(start2)sounds=[]global text,chooseglobal sun_num_surfacerunning =Trueindex=0while running:# sounds.append(bgm)# for sound in sounds:#  pygame.mixer.Sound.play(sound)pygame.mixer.Sound.play(bgm)clock.tick(10)# if index % 40==0:#     s=Sun(ap.rect)#     sunList.add(s)# if index % 40==0:# boss = Boss()# spriteGroup.add(boss)# for i in range(1,5):#     j = random.randint(1, 3)#     if j==1:#         zombie = Zombie()#         badman = badmanmini()#         ene = enemy()#         spriteGroup.add(zombie)#         spriteGroup.add(badman)#         spriteGroup.add(ene)#     elif j==2:#         badman = badmanmini()#         e = enemy()##         spriteGroup.add(badman)#         spriteGroup.add(e)#     elif j==3:#         en = enemy()#         carman=Carman()##         spriteGroup.add(en)#         spriteGroup.add(carman)# if index %80==0:#     b=Bullet(adc.rect,backgd_size)#     spriteGroup.add(b)# if index %30==0:#     d=bulletshooter(shoot.rect,backgd_size)#     spriteGroup.add(d)for bullet in bulletList:for enem in enemyList:if pygame.sprite.collide_mask(bullet,enem):bulletList.remove(bullet)enem.blood-=1for item in spriteGroup:for enem in enemyList:if  isinstance(item,tank) and pygame.sprite.collide_mask(item,enem):enem.blood-=1item.blood-=1screen.blit(bg_img_obj,(0,0))screen.blit(sunbankImg,(320,-12))screen.blit(sun_num_surface,(350,57))screen.blit(cardap,(415,3))screen.blit(cardadc, (491,3))screen.blit(cardshooter, (567,3))screen.blit(cardtank, (643,3))screen.blit(deleteImg, (719, 3))spriteGroup.update(index)spriteGroup.draw(screen)sunList.update(index)sunList.draw(screen)bulletList.update(index)bulletList.draw(screen)enemyList.update(index)enemyList.draw(screen)(x,y)=pygame.mouse.get_pos()if choose==1:right=apImg.get_rect().rightbottom=apImg.get_rect().bottomscreen.blit(apImg,(x-right/2,y-bottom/2))elif choose==4:right = apImg.get_rect().rightbottom = apImg.get_rect().bottomscreen.blit(tankImg,(x-right/2,y-bottom/2))elif choose==2:right = apImg.get_rect().rightbottom = apImg.get_rect().bottomscreen.blit(adcImg,(x-right/2,y-bottom/2))elif choose == 3:right = apImg.get_rect().rightbottom = apImg.get_rect().bottomscreen.blit(shooterImg, (x-right/2,y-bottom/2))elif choose==5:right = apImg.get_rect().rightbottom = apImg.get_rect().bottomscreen.blit(delete,(x-right/2,y-bottom/2))# screen.blit(adc.images[index%8],adc.rect)# screen.blit(shoot.images[index%31],shoot.rect)# screen.blit(ap.images[index % 26], ap.rect)# screen.blit(tank.images[index % 31], tank.rect)# for sun in sunList:#     screen.blit(sun.images[index % 1], sun.rect)index+=1for event in pygame.event.get():if event.type==GEN_SUN_EVENT:for sprite in spriteGroup:if isinstance(sprite,Ap):now=time.time()if now-sprite.lasttime>=5:s = Sun(sprite.rect)sunList.add(s)sprite.lasttime=nowif event.type==GEN_BULLET_EVENT:for sprite in spriteGroup:if isinstance(sprite,Adc):now=time.time()if now-sprite.lasttime>=5:b=Bullet(sprite.rect,backgd_size)bulletList.add(b)sprite.lasttime=nowelif isinstance(sprite,shoot):bs=bulletshooter(sprite.rect,backgd_size)bulletList.add(bs)if event.type==GEN_ENERMY_EVENT:boss = Boss()enemyList.add(boss)for i in range(1, 5):j = random.randint(1, 3)if j == 1:zombie = Zombie()badman = badmanmini()ene = enemy()enemyList.add(zombie)enemyList.add(badman)enemyList.add(ene)elif j == 2:badman = badmanmini()e = enemy()enemyList.add(badman)enemyList.add(e)elif j == 3:en = enemy()carman = Carman()pythonextend=pythonExtend()enemyList.add(en)enemyList.add(carman)enemyList.add(pythonextend)if event.type==pygame.QUIT:running=Falseif event.type==pygame.MOUSEBUTTONDOWN:pressed_point=pygame.mouse.get_pressed()if pressed_point[0]==1:position=pygame.mouse.get_pos()x,y=positionprint(position)if 415<x<486 and 3<y<84 and int (text)>=50:choose=1elif 491<x<562 and 3<y<84 and int (text)>=100:choose=2elif 567<x<638 and 3<y<84 and int (text)>=100:choose=3elif 643<x<714 and 3<y<84 and int (text)>=50:choose=4elif  719<x<771 and 3<y<83:choose=5elif 425<x<1200 and 100<y<600:if choose==1:current_time=time.time()ap=Ap(current_time)i=425while(i<=1200):if i<=x<=i+85:ap.rect.left=ibreaki=i+85j=100while(j<=600):if j<=y<=j+100:ap.rect.top=jbreakj=j+100#=positiony#=positionxspriteGroup.add(ap)choose=0text = str(int(text) - 50)sun_font = pygame.font.SysFont('arial', 25)sun_num_surface = sun_font.render(text, True, (0, 0, 0))# text=int(text)# text-=50# text=str(text)# myfont=pygame.font.SysFont('arial',20)# txtImg= myfont.render(str(text),True,(0,0,0))elif choose==4:# pygame.mixer.init()# s = 'material/sound'# bgm = pygame.mixer.Sound('material/sound/tank.mp3')# bgm.play()t = tank()i = 425while (i <= 1200):if i <= x <= i + 85:t.rect.left = ibreaki = i + 85j = 100while (j <= 600):if j <= y <= j + 100:t.rect.top = jbreakj = j + 100# =positiony# =positionxspriteGroup.add(t)# pygame.mixer.Sound.play(tank1)choose = 0text = str(int(text) - 50)sun_font = pygame.font.SysFont('arial', 25)sun_num_surface = sun_font.render(text, True, (0, 0, 0))elif choose==2:current_time = time.time()adc = Adc(current_time)i = 425while (i <= 1200):if i <= x <= i + 85:adc.rect.left = ibreaki = i + 85j = 100while (j <= 600):if j <= y <= j + 100:adc.rect.top = jbreakj = j + 100# =positiony# =positionxspriteGroup.add(adc)choose = 0text = str(int(text) - 50)sun_font = pygame.font.SysFont('arial', 25)sun_num_surface = sun_font.render(text, True, (0, 0, 0))elif choose==3:sh=shoot()i = 400while (i <= 1175):if i <= x <= i + 85:sh.rect.left = ibreaki = i + 85j = 80while (j <= 580):if j <= y <= j + 100:sh.rect.top = jbreakj = j + 100# =positiony# =positionxspriteGroup.add(sh)# pygame.mixer.Sound.play(tank1)choose = 0text = str(int(text) - 50)sun_font = pygame.font.SysFont('arial', 25)sun_num_surface = sun_font.render(text, True, (0, 0, 0))elif choose==5:for sprite in spriteGroup:if sprite.rect.left<x<sprite.rect.right and sprite.rect.top<y<sprite.rect.bottom:spriteGroup.remove(sprite)choose=0else:choose=0for sun in sunList:if sun.rect.collidepoint(position):sunList.remove(sun)text=str(int(text)+50)sun_font = pygame.font.SysFont('arial', 25)sun_num_surface = sun_font.render(text, True, (0, 0, 0))pygame.display.update()if __name__=="__main__":init()

在这里插入图片描述
在Pygame库中,clock.tick(10)是一个用来控制游戏循环帧率的函数。这里的clock是pygame.time.Clock()的一个实例,而tick()方法则是用来设定游戏循环的最大帧率。具体来说,clock.tick(10)意味着你希望游戏循环每秒最多执行10次。这实际上是在说,你希望游戏的帧率被限制在每秒10帧。然而,需要注意的是,如果游戏的某些部分(如图形渲染或物理计算)执行得比预期更慢,那么实际的帧率可能会低于这个设定的上限。clock.tick()方法还会返回一个表示自上次调用以来经过的毫秒数的值。这个返回值可以用来测量游戏循环中不同部分的执行时间,从而进行性能分析或优化。 pygame.sprite 是 Pygame 库中的一个模块,它提供了处理游戏中精灵(Sprite)的便捷方式。精灵是游戏中的一个对象,通常代表了一个角色、物体或任何其他可见的游戏元素。使用 pygame.sprite 模块,你可以轻松地管理精灵的集合,包括它们的渲染、更新和碰撞检测等。

在main方法通过动画的原理:当快速连续地展示一系列静态图像时,由于人眼的视觉暂留效应,这些图像会在大脑中形成连续运动的错觉,从而产生了动画的效果。
在这里主要实现了以下几个功能:
1.创建背景图,选项卡
2.启动背景音乐
3.创建敌人角色
4.鼠标拖动选项卡到指定位置,创建我方人物
5.生产阳光,发射子弹
6.碰撞检测
7.角色消失

2.敌人角色(示例)

代码如下(示例):

# -*- codeing = utf-8 -*-
# @Time : 2023/2/14 16:00
# @Author : 小马
# @File: Zombie.py
# @Software : PyCharm
import pygame.sprite
import randomclass Zombie(pygame.sprite.Sprite):def __init__(self):super(Zombie,self).__init__()self.image=pygame.image.load('material/badman1.1.PNG').convert_alpha()self.images=[pygame.image.load('material/badman1.{:d}.png'.format(i)).convert_alpha() for i in range(1,6)]self.rect = self.images[0].get_rect()t = random.randint(1, 5)self.rect.top = t * 100self.speed = 6self.rect.left = 1200self.blood=1def update(self, *args):if self.blood>0:self.image=self.images[args[0]%len(self.images)]if self.rect.left<600:self.kill()else:self.rect.left -= self.speedelse :self.kill()

在这里插入图片描述
这段代码定义了一个名为Zombie的类,它继承自pygame.sprite.Sprite。Zombie类代表了一个游戏中的僵尸角色,包含了僵尸的图像、位置、速度以及生命值等属性。

以下是Zombie类的主要组成部分:

初始化方法 (init):
调用父类的初始化方法。
加载僵尸的图像,并将其转换为包含alpha通道的图像(即支持透明度的图像)。
创建一个图像列表,包含僵尸的不同动作或帧的图像。
设置僵尸的初始位置(self.rect)和速度(self.speed)。
初始化僵尸的生命值(self.blood)。
更新方法 (update):
检查僵尸的生命值,如果生命值大于0,则继续更新僵尸的状态。
根据传入的参数(args[0])更新僵尸的图像,以实现动画效果。
如果僵尸的rect.left属性小于600,表示僵尸已经走出了屏幕范围,此时调用self.kill()方法将僵尸从精灵组中移除。
如果僵尸的生命值不大于0,也调用self.kill()方法将僵尸移除。
这个类可以用于创建一个或多个僵尸实例,并将它们添加到一个pygame.sprite.Group中,以便在游戏循环中更新和渲染它们。通过调用update方法,可以更新僵尸的位置和动画帧,而kill方法则用于在僵尸死亡或走出屏幕时将其从游戏中移除。


2.我方角色(示例)

# -*- codeing = utf-8 -*-
# @Time : 2022/12/21 20:44
# @Author : 小马
# @File: Adc.py
# @Software : PyCharm
import pygame
class Adc(pygame.sprite.Sprite):def __init__(self,lasttime):super(Adc,self).__init__()self.image=pygame.image.load('material/character1.1.1.PNG').convert_alpha()self.images=[pygame.image.load('material/character1.1.{:d}.PNG'.format(i)).convert_alpha() for i in range(1,9)]self.rect=self.images[0].get_rect()self.rect.top=120self.rect.left=480self.lasttime=lasttimedef update(self,*args):if args[0]%6==0:i=int(args[0]/8)self.image=self.images[i%len(self.images)]

在这里插入图片描述
在这里插入图片描述
这段代码定义了一个名为Adc的类,它继承自pygame.sprite.Sprite。Adc类代表了一个游戏中的角色,具体来说是射手(ADC)角色,包含了角色的图像、位置以及一个用于追踪时间的属性。

以下是Adc类的主要组成部分:

初始化方法 (init):
调用父类的初始化方法。
加载角色的初始图像,并将其转换为包含alpha通道的图像(即支持透明度的图像)。
创建一个图像列表,包含角色的不同动作或帧的图像。
设置角色的初始位置(self.rect)。
初始化self.lasttime属性,这个属性可能用于追踪上一次更新角色状态的时间。
更新方法 (update):
这个方法接收一个参数args,它是一个元组,其中args[0]可能代表游戏循环的当前帧或时间。
如果args[0]除以6的余数为0,说明满足一定的时间间隔条件,此时更新角色的图像。
通过计算i = int(args[0]/8)来确定应该使用图像列表中的哪一张图像,并使用i%len(self.images)来确保索引不会超出图像列表的范围。
这个类可以用于创建一个Adc实例,并将它添加到一个pygame.sprite.Group中,以便在游戏循环中更新和渲染它。通过调用update方法,可以根据游戏循环的当前帧或时间来更新角色的图像,从而实现动画效果。

总结

这款植物大战僵尸的魔改版本还有些许问题待处理(没有设置游戏的结束,游戏的平衡有待提高),总共设定了四个我方游戏角色:
1.能够产生阳光的AP
2.两个可以发射子弹的ADC
3.一个近距离攻击的tank
设定了6个敌人大小不一的敌人角色,选取了较为史诗宏壮的背景音乐,视觉和听觉效果拉满,可以用来作为自己的课程设计或者兴趣爱好。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
整个作品的图片都是我个人裁剪制作而成,有喜欢的小伙伴希望在下载使用的时候给我点一个star

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

代码链接
链接:https://pan.baidu.com/s/1dhxHiE_CJJmg2ytUO4TW0Q?pwd=yyv6
提取码:yyv6

运行程序链接:
https://gitee.com/majunlong1/Plants_vs_zooms_game

相关文章:

python实现小游戏——植物大战僵尸(魔改版本)

制作一款DIY的‘植物大战僵尸’游戏引起了很多人的兴趣。在这里&#xff0c;我将分享一个使用Python语言在PyCharm环境中开发的初始状态版本。这个版本主要应用了pygame库来完成&#xff0c;是一个充满创意和趣味的魔改版本。 文章目录 前言一、开发环境准备二、代码1.main方法…...

基于K210智能人脸识别+车牌识别系统(完整工程资料源码)

运行效果&#xff1a; 基于K210的智能人脸与车牌识别系统工程 目录&#xff1a; 运行效果&#xff1a; 目录&#xff1a; 前言&#xff1a; 一、国内外研究现状与发展趋势 二、相关技术基础 2.1 人脸识别技术 2.2 车牌识别技术 三、智能小区门禁系统设计 3.1 系统设计方案 3.2 …...

8.怎么配嵌套子路由,以及它的作用

作用 配嵌套子路由,就是可以通过同一个页面,让不同的位置发生变化,其他的位置不会发生变化,而做到一个局部刷新 例子 红线框住的部分,头部和导航栏是不会发生变化的,变化的只有中间的内容 子路由的操作步骤 将这个页面的头部和导航栏部分的样式和风格,移到主路由上(<tem…...

【海贼王航海日志:前端技术探索】HTML你学会了吗?(二)

目录 1 -> HTML常见标签 1.1 -> 表格标签 1.1.1 -> 基本使用 1.1.2 -> 合并单元格 1.2 -> 列表标签 1.3 -> 表单标签 1.3.1 -> form标签 1.3.2 -> input标签 1.4 -> label标签 1.5 -> select标签 1.6 -> textarea标签 1.7 -> …...

体系结构论文导读(三十一)(下):Soft errors in DNN accelerators: A comprehensive review

第五部分&#xff1a;DNN加速器中的软错误 本部分回顾和分析了有关人工神经网络&#xff08;ANN&#xff09;可靠性的研究。特别是关注通过DNN加速器解决DNN可靠性的研究&#xff0c;从软错误的角度进行探讨。许多前期工作声称ANN本身对故障具有固有的容错能力。然而&#xff…...

Python在指定文件夹下创建虚拟环境

基于不同python版本和第三方包版本开发的项目&#xff0c;为了方便学习和管理python环境&#xff0c;可以在指定的文件夹里创建项目所需的虚拟环境。具体流程如下&#xff1a; (1) 以管理员身份打开Ananconda Prompt&#xff0c;查看当前虚拟环境&#xff0c;输入命令如下&…...

【SpringBoot】 定时任务之任务执行和调度及使用指南

【SpringBoot】 定时任务之任务执行和调度及使用指南 Spring框架分别通过TaskExecutor和TaskScheduler接口为任务的异步执行和调度提供了抽象。Spring还提供了支持应用程序服务器环境中的线程池或CommonJ委托的那些接口的实现。最终&#xff0c;在公共接口后面使用这些实现&…...

理解 Objective-C 中 +load 方法的执行顺序

在 Objective-C 中&#xff0c;load 方法是在类或分类&#xff08;category&#xff09;被加载到内存时调用的。它的执行顺序非常严格&#xff0c;并且在应用启动过程中可能会导致一些令人困惑的行为。理解 load 方法的执行顺序对调试和控制应用的初始化过程非常重要。 load 方…...

切面条问题算法的详解

切面条问题是一个经典的动态规划问题&#xff0c;也称为切钢条问题。问题描述为&#xff1a;给定一根长度为n的钢条和一个价格表P[i]&#xff0c;表示长度为i的钢条的价格。求解如何切割钢条使得收益最大。 解决这个问题的关键是找到一个最优子结构和递推关系。 首先&#xf…...

JNDI注入

&#x1f3bc;个人主页&#xff1a;金灰 &#x1f60e;作者简介:一名简单的大一学生;易编橙终身成长社群的嘉宾.✨ 专注网络空间安全服务,期待与您的交流分享~ 感谢您的点赞、关注、评论、收藏、是对我最大的认可和支持&#xff01;❤️ &#x1f34a;易编橙终身成长社群&#…...

SQL Server数据库文件过大而无法直接导出解决方案

目录 1. 使用分割备份 (Split Backup) 2. 使用文件和文件组备份 (File and Filegroup Backup) 3. 使用压缩备份 (Compressed Backup) 4. 逻辑备份 (BCP工具) 5. 使用导出工具 (SQL Server Management Studio) 6. 部分备份 (Partial Backup) 7. 使用第三方工具 1. 使用分割…...

学习日志8.4--DHCP攻击防范

目录 DHCP饿死攻击 DHCP Sever仿冒攻击 DHCP攻击防范 DHCP动态主机配置协议&#xff0c;是给主机提供自动获取IP地址等配置信息的服务。在主机对DHCP服务器发送DHCP Discover请求之后&#xff0c;服务器回复offer&#xff0c;主机再回复request&#xff0c;最后服务器回复AC…...

解决多个Jenkins Master实例共享Jenkins_home目录的问题(加锁解锁机制)

在Jenkins的持续集成和持续部署&#xff08;CI/CD&#xff09;环境中&#xff0c;JENKINS_HOME目录扮演着至关重要的角色。它存储了Jenkins的配置、插件、作业历史记录等核心数据。然而&#xff0c;在某些场景下&#xff0c;我们可能面临多个Jenkins master实例需要共享同一个J…...

postgresql array 反向截取

postgresql array 反向截取 array_to_string((string_to_array(REPLACE(delcell.小区网管名称,‘‘,’-‘),’-‘))[:array_length(string_to_array(REPLACE(delcell.小区网管名称,’’,‘-’),‘-’),1)-1],‘-’) as 基站名称 在PostgreSQL中&#xff0c;如果你想要对数组进…...

最新口型同步技术EchoMimic部署

EchoMimic是由蚂蚁集团推出的一个 AI 驱动的口型同步技术项目&#xff0c;能够通过人像面部特征和音频来帮助人物“对口型”&#xff0c;生成逼真的动态肖像视频。 EchoMimic的技术亮点在于其创新的动画生成方法&#xff0c;它不仅能够通过音频和面部关键点单独驱动图像动画&a…...

程序设计基础(c语言)_补充_1

1、编程应用双层循环输出九九乘法表 #include <stdio.h> #include <stdlib.h> int main() {int i,j;for(i1;i<9;i){for(j1;j<i;j)if(ji)printf("%d*%d%d",j,i,j*i);elseprintf("%d*%d%-2d ",j,i,j*i);printf("\n");}return 0…...

8.4 day bug

bug1 忘记给css变量加var 复制代码到通义千问&#xff0c;解决 bug2 这不是我的bug&#xff0c;是freecodecamp的bug 题目中“ 将 --building-color2 变量的颜色更改为 #000” “ 应改为” 将 #000 变量的颜色更改为 --building-color2 “ bug3 又忘记加var(–xxx) 还去问…...

【Material-UI】Autocomplete中的禁用选项:Disabled options

文章目录 一、简介二、基本用法三、进阶用法1. 动态禁用2. 提示禁用原因3. 复杂的禁用条件 四、最佳实践1. 一致性2. 提供反馈3. 优化性能 五、总结 Material-UI的Autocomplete组件提供了丰富的功能&#xff0c;包括禁用特定选项的能力。这一特性对于限制用户选择、提供更好的用…...

Pytest测试报告生成专题

在 pytest 中,你可以使用多个选项生成不同格式的测试报告。以下是几种常用的生成测试报告的方法: 1. 生成简单的测试结果文件 你可以使用 pytest 的 --junitxml 选项生成一个 XML 格式的测试报告,这个报告可以与 CI/CD 工具集成。 pytest --junitxml=report.xml这将在当前…...

QT 笔记

HTTPS SSL配置 下载配置 子父对象 QTimer *timer new QTimer; // QTimer inherits QObject timer->inherits("QTimer"); // returns true timer->inherits("QObject"); // returns true timer->inherits("QAbst…...

逻辑回归:给不确定性划界的分类大师

想象你是一名医生。面对患者的检查报告&#xff08;肿瘤大小、血液指标&#xff09;&#xff0c;你需要做出一个**决定性判断**&#xff1a;恶性还是良性&#xff1f;这种“非黑即白”的抉择&#xff0c;正是**逻辑回归&#xff08;Logistic Regression&#xff09;** 的战场&a…...

什么是库存周转?如何用进销存系统提高库存周转率?

你可能听说过这样一句话&#xff1a; “利润不是赚出来的&#xff0c;是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业&#xff0c;很多企业看着销售不错&#xff0c;账上却没钱、利润也不见了&#xff0c;一翻库存才发现&#xff1a; 一堆卖不动的旧货…...

微信小程序 - 手机震动

一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注&#xff1a;文档 https://developers.weixin.qq…...

生成 Git SSH 证书

&#x1f511; 1. ​​生成 SSH 密钥对​​ 在终端&#xff08;Windows 使用 Git Bash&#xff0c;Mac/Linux 使用 Terminal&#xff09;执行命令&#xff1a; ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" ​​参数说明​​&#xff1a; -t rsa&#x…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面

代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口&#xff08;适配服务端返回 Token&#xff09; export const login async (code, avatar) > {const res await http…...

【配置 YOLOX 用于按目录分类的图片数据集】

现在的图标点选越来越多&#xff0c;如何一步解决&#xff0c;采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集&#xff08;每个目录代表一个类别&#xff0c;目录下是该类别的所有图片&#xff09;&#xff0c;你需要进行以下配置步骤&#x…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容

目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法&#xff0c;当前调用一个医疗行业的AI识别算法后返回…...

Web 架构之 CDN 加速原理与落地实践

文章目录 一、思维导图二、正文内容&#xff08;一&#xff09;CDN 基础概念1. 定义2. 组成部分 &#xff08;二&#xff09;CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 &#xff08;三&#xff09;CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 &#xf…...

技术栈RabbitMq的介绍和使用

目录 1. 什么是消息队列&#xff1f;2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题

分区配置 (ptab.json) img 属性介绍&#xff1a; img 属性指定分区存放的 image 名称&#xff0c;指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件&#xff0c;则以 proj_name:binary_name 格式指定文件名&#xff0c; proj_name 为工程 名&…...