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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux小组件:gcc

gcc 是C语言的编译器&#xff0c;在Linux下我们也用这个编译C语言 安装gcc sudo apt install build-essential 查看gcc版本信息 gcc --version 有时候会出现代码编译不过去的问题&#xff0c;通常可能是gcc的编译标准太低&#xff0c;不支持某些写法 比如在很多旧的编译标…

SQL注入实例(sqli-labs/less-4)

0、初始页面 1、确定闭合符号 前两条判断是否为数值型注入&#xff0c;后两条判断字符型注入的闭合符号 ?id1 and 11 ?id1 and 12 ?id1" ?id1") 2、确定表的列数 ?id1") order by 3 -- 3、确定回显位置 ?id-1") union select 1,2,3 -- 4、爆库…

【kali靶机之serial】--反序列化漏洞实操

kali靶机配置 【我图片里没有截图的默认配置即可】需要改的地方图片里面都有。 使用kali扫描网关的主机。 扫到一个开放了80端口HTTP协议的主机ip 访问80端口 会看到一个文本页面&#xff0c;翻译一下看是什么意思。。 F12查看cookie&#xff0c;是一个base64编码了的东西 使…

新手小白学习PCB设计,立创EDA专业版

本教程有b站某UP主的视频观后感 视频链接&#xff1a;http://【【教程】零基础入门PCB设计-国一学长带你学立创EDA专业版 全程保姆级教学 中文字幕&#xff08;持续更新中&#xff09;】https://www.bilibili.com/video/BV1At421h7Ui?vd_sourcefedb10d2d09f5750366f83c1e0d4a…

指标一致化处理

什么是数据指标 数据指标有别于传统意义上的统计指标&#xff0c;它是通过对数据进行分析得到的一个汇总结果&#xff0c;是将业务单元精分和量化后的度量值&#xff0c;使得业务目标可描述、可度量、可拆解。 数据指标有哪些类型 极大型:期望取值越大越好&#xff1b; 极小…

Memcached未授权访问漏洞

Memcached 是一套常用的 key-value 分布式高速缓存系统&#xff0c;由于 Memcached 的安全设计缺陷没有权限控制模块&#xff0c;所以对公网开放的Memcache服务很容易被攻击者扫描发现&#xff0c;攻击者无需认证通过命令交互可直接读取 Memcached中的敏感信息。 app"Mem…

AI电销机器人的效果与作用

ai电销机器人的工作效率是非常高的&#xff0c;电销机器人一天的外呼量至少是3000左右&#xff0c;工作效率是人工的十倍还多&#xff0c;并且电销机器人没有负面情绪&#xff0c;一直都可以保持高昂的工作热情&#xff0c;非常简单方便。 并且ai电销机器人是越用越聪明的&…

英国AI大学排名

计算机学科英国Top10 “计算机科学与信息系统”学科除了最受关注的“计算机科学”专业&#xff0c;还包括了“人工智能”“软件工程”“计算机金融”等众多分支专业。 1.帝国理工学院 Imperial College London 单以计算机专业本科来讲&#xff0c;仅Computing这个专业&#x…

来点八股文(五) 分布式和一致性

Raft raft 会进入脑裂状态吗&#xff1f;描述下场景&#xff0c;怎么解决&#xff1f; 不会。raft通过选举安全性解决了这个问题&#xff1a; 一个任期内&#xff0c;follower 只会投票一次票&#xff0c;且先来先得&#xff1b;Candidate 存储的日志至少要和 follower 一样新…

用uniapp 及socket.io做一个简单聊天app 4

界面如下&#xff1a; <template><view class"container"><input v-model"username" placeholder"用户名" /><input v-model"password" type"password" placeholder"密码" /><butto…

comfyUI-MuseTalk的参数设置

comfyUI-MuseTalk的参数设置 目录 comfyUI-MuseTalk的参数设置 一、ComfyUI-VideoHelperSuite 二、comfyUI-MuseV合成的参考视频 2.1、什么时候会用到MuseV&#xff1f; 2.2、MuseV特别消耗系统内存 2.2.1、测试图片序列的像素比 2.2.2、影响运动范围和生成结果的参数 …

Yarn:一个快速、可靠且安全的JavaScript包管理工具

(创作不易&#xff0c;感谢有你&#xff0c;你的支持&#xff0c;就是我前行的最大动力&#xff0c;如果看完对你有帮助&#xff0c;还请三连支持一波哇ヾ(&#xff20;^∇^&#xff20;)ノ&#xff09; 目录 一、Yarn简介 二、Yarn的安装 1. 使用npm安装Yarn 2. 在macOS上…

基于Springboot的个人博客系统

文章目录 介绍访问地址一、功能展示1.前台首页归档相册留言关于我登陆注册 2.后台管理系统登陆页面首页文章管理相册管理写博客访客统计 介绍 基于Java&#xff08;Springboot&#xff09;可以用做毕业设计的个人博客系统&#xff0c;包括网站前台和后台管理系统两部分。网站前…

C++中const关键字的用法

C语言和C中const的不同 首先我们需要区分一下C语言中的const和C中的const&#xff0c;C语言中的const修饰的变量可以不初始化&#xff0c;但如果将一个变量定位为const类型还不初始化&#xff0c;那么之后就不能对这个变量直接赋值了。 如果我们使用C语言中的const定义的变量指…

c++ 21 指针

*像一把钥匙 通过钥匙去找内存空间 间接修改内存空间的值 不停的给指针赋值 等于不停的更改指针的指向 指针也是一种数据类型 指针做函数参数怎么看都不可以 指针也是一个数据类型 是指它指向空间的数据类习惯 作业 野指针 向null空间地址copy数据 不断改变指针指向 …

将本地微服务发布到docker镜像二:

上一篇文章我们介绍了如何将一个简单的springboot服务发布到docker镜像中&#xff0c;这一篇我们将介绍如何将一个复杂的微服务&#xff08;关联mysql、redis&#xff09;发布到docker镜像。 我们将使用以下两种不同的方式来实现此功能。 redis、mysql、springboot微服务分开…

Redis未授权访问漏洞 *

#安装redis apt-get install redis #redis链接 redis-cli -h 192.168.4.176 -p 6379 #redis常见命令 &#xff08;1&#xff09;查看信息&#xff1a;info &#xff08;2&#xff09;删除所有数据库内容&#xff1a;flushall &#xff08;3&#xff09;刷新数据库&#xff1a;f…

平衡二叉树 - 力扣(LeetCode) C语言

110. 平衡二叉树 - 力扣&#xff08;LeetCode&#xff09;&#xff08;点击前面链接即可查看题目&#xff09; 一、题目 给定一个二叉树&#xff0c;判断它是否是 平衡二叉树 是指该树所有节点的左右子树的深度相差不超过 1。 示例 1&#xff1a; 输入&#xff1a;root […

unity拖拽物品遇到的bug及解决思路

记录一下拖拽实现过程中遇到的bug RectTransform 专门用在UI中transform 判断点击是否在UI中 使用这个函数就可以判断点击的是否是UI面板&#xff0c;返回true表明在UI面板中 EventSystem.current.IsPointerOverGameObject()值得一提的是&#xff0c;如果发现了有UI穿透效…

【Material-UI】多选模式(Multiple values)与Autocomplete的高级用法解析

文章目录 一、多选模式的基本用法二、高级用法1. 固定选项&#xff08;Fixed options&#xff09;2. 复选框&#xff08;Checkboxes&#xff09;3. 限制标签显示数量&#xff08;Limit tags&#xff09; 三、性能优化与最佳实践1. 筛选已选项&#xff08;filterSelectedOptions…