物流网站怎么开/外贸怎么找客户资源
学习 Python 之 Pygame 开发坦克大战(五)
- 坦克大战完善地图
- 1. 创建砖墙
- 2. 给砖墙增加子弹击中的碰撞效果
- 3. 给砖墙添加坦克不能通过的碰撞效果
- 4. 添加石墙
- 5. 添加玩家基地
- 6. 最终效果
坦克大战完善地图
我的素材放到了百度网盘里,里面还有原版坦克大战素材,我都放在一起来,我的素材是从原版改的,各位小伙伴可以直接用或者自己改一下再用,做出适合自己的素材
素材链接:百度网盘
链接:https://pan.baidu.com/s/19sCyH7rp37f6DzRj0iXDCA?pwd=tkdz
提取码:tkdz
那我们就继续编写坦克大战吧
1. 创建砖墙
坦克大战中,砖墙是最常见的墙,子弹都可以轻松击穿,下面我们来加入到自己的坦克大战中
创建砖墙类
import pygame.image
from ParentObject import ParentObjectclass BrickWall(ParentObject):def __init__(self, x, y):super().__init__()self.image = pygame.image.load('../Image/Wall/BrickWall.png')self.rect = self.image.get_rect()self.rect.left = xself.rect.top = yself.isDestroy = Falsedef draw(self, window):window.blit(self.image, self.rect)
在主类中加入砖墙列表
class MainGame:...# 砖墙brickWallList = []...
在主类中加入初始化砖墙函数和显示砖墙函数
def drawBrickWall(self, brickWallList):for brickWall in brickWallList:if brickWall.isDestroy:brickWallList.remove(brickWall)else:brickWall.draw(MainGame.window)def initBrickWall(self):for i in range(20):MainGame.brickWallList.append(BrickWall(i * 25, 200))
这里我在y = 200的位置,连续画出20个砖,砖的图片是25x25的,所以为了防止重叠,要间隔25个距离(像素)
在主函数startGame()函数中调用函数
def startGame(self):# 初始化展示模块pygame.display.init()# 设置窗口大小size = (SCREEN_WIDTH, SCREEN_HEIGHT)# 初始化窗口MainGame.window = pygame.display.set_mode(size)# 设置窗口标题pygame.display.set_caption('Tank Battle')# 初始化我方坦克MainGame.playerTank = PlayerTank(PLAYER_TANK_POSITION[0], PLAYER_TANK_POSITION[1], 1, 1)# 播放开始音乐MainGame.startingSound.play()# 初始化场景self.initBrickWall()while 1:# 设置背景颜色MainGame.window.fill(BACKGROUND_COLOR)# 获取窗口事件self.getPlayingModeEvent()# 显示物体self.drawBrickWall(MainGame.brickWallList)# 展示敌方坦克self.drawEnemyTank()# 显示我方坦克MainGame.playerTank.draw(MainGame.window, PLAYER_TANK_POSITION[0], PLAYER_TANK_POSITION[1])# 我方坦克移动if not MainGame.playerTank.stop:MainGame.playerTank.move()MainGame.playerTank.collideEnemyTank(MainGame.enemyTankList)# 显示我方坦克子弹self.drawPlayerBullet(MainGame.playerBulletList)# 展示敌方坦克子弹self.drawEnemyBullet()# 展示爆炸效果self.drawExplode()# 更新窗口pygame.display.update()
运行一下,看看结果
但是墙只是摆设,子弹可以穿过,坦克也可以穿过,下面给墙增加碰撞效果
2. 给砖墙增加子弹击中的碰撞效果
在子弹类中增加函数
def bulletCollideBrickWall(self, brickWallList, explodeList):for brickWall in brickWallList:# 子弹与墙发生碰撞if pygame.sprite.collide_rect(self, brickWall):self.isDestroy = TruebrickWall.isDestroy = True# 碰撞出现爆炸效果explode = Explode(brickWall, 25)explodeList.append(explode)# 出现爆炸播放音效Sound('../Sound/block.wav').play()
在主函数中调用
修改显示子弹的两个函数
def drawPlayerBullet(self, playerBulletList):# 遍历整个子弹列表,如果是没有被销毁的状态,就把子弹显示出来,否则从列表中删除for bullet in playerBulletList:if not bullet.isDestroy:bullet.draw(MainGame.window)bullet.move(MainGame.explodeList)bullet.playerBulletCollideEnemyTank(MainGame.enemyTankList, MainGame.explodeList)bullet.bulletCollideBrickWall(MainGame.brickWallList, MainGame.explodeList)else:playerBulletList.remove(bullet)
def drawEnemyBullet(self):for bullet in MainGame.enemyTankBulletList:if not bullet.isDestroy:bullet.draw(MainGame.window)bullet.move(MainGame.explodeList)bullet.enemyBulletCollidePlayerTank(MainGame.playerTank, MainGame.explodeList)bullet.bulletCollideBrickWall(MainGame.brickWallList, MainGame.explodeList)else:bullet.source.bulletCount -= 1MainGame.enemyTankBulletList.remove(bullet)
运行一下看看
可以看到墙可以被打掉了
3. 给砖墙添加坦克不能通过的碰撞效果
在敌方坦克类中加入函数,在我方坦克类中加入函数
collideBrickWall()
def collideBrickWall(self, brickWallList):for brickWall in brickWallList:if pygame.sprite.collide_rect(self, brickWall):self.rect.left = self.prvXself.rect.top = self.prvY
在主类中调用
在while循环中调用
while 1:# 设置背景颜色MainGame.window.fill(BACKGROUND_COLOR)# 获取窗口事件self.getPlayingModeEvent()# 显示物体self.drawBrickWall(MainGame.brickWallList)# 展示敌方坦克self.drawEnemyTank()# 显示我方坦克MainGame.playerTank.draw(MainGame.window, PLAYER_TANK_POSITION[0], PLAYER_TANK_POSITION[1])# 我方坦克移动if not MainGame.playerTank.stop:MainGame.playerTank.move()MainGame.playerTank.collideEnemyTank(MainGame.enemyTankList)# 不能撞墙MainGame.playerTank.collideBrickWall(MainGame.brickWallList)
在主类的drawEnemyTank()中调用
def drawEnemyTank(self):...for tank in MainGame.enemyTankList:# 坦克还有生命值if tank.life > 0:tank.draw(MainGame.window)tank.move()tank.collidePlayerTank(MainGame.playerTank)tank.collideEnemyTank(MainGame.enemyTankList)# 不能撞墙tank.collideBrickWall(MainGame.brickWallList)bullet = tank.shot()if bullet is not None:MainGame.enemyTankBulletList.append(bullet)# 坦克生命值为0,就从列表中剔除else:MainGame.enemyTankCurrentCount -= 1MainGame.enemyTankList.remove(tank)
运行一下,看看效果
确实是不能穿过了
那就完成啦,接下来就是添加其他的物体了
添加的过程跟添加砖墙是一样的
4. 添加石墙
创建石墙类
import pygame.image
from ParentObject import ParentObjectclass StoneWall(ParentObject):def __init__(self, x, y):super().__init__()self.image = pygame.image.load('../Image/Wall/StoneWall.png')self.rect = self.image.get_rect()self.rect.left = xself.rect.top = yself.isDestroy = Falsedef draw(self, window):window.blit(self.image, self.rect)
在主类中加入石墙列表
在主类中加入显示石墙函数
def initStoneWall(self):for i in range(20):MainGame.stoneWallList.append(StoneWall(i * 25, 400))def drawStoneWall(self, stoneWallList):for stoneWall in stoneWallList:if stoneWall.isDestroy:stoneWallList.remove(stoneWall)else:stoneWall.draw(MainGame.window)
给石墙添加坦克不能通过的碰撞效果
在敌方坦克类中加入函数,在我方坦克类中加入函数
collideStoneWall()
def collideStoneWall(self, stoneWallList):for stoneWall in stoneWallList:if pygame.sprite.collide_rect(self, stoneWall):self.rect.left = self.prvXself.rect.top = self.prvY
在主类中调用函数
接下来是给子弹添加打击石墙的效果
def bulletCollideStoneWall(self, stoneWallList, explodeList):for stoneWall in stoneWallList:if pygame.sprite.collide_rect(self, stoneWall):# 判断坦克的等级,大于等于2时,可以打穿石墙if self.source.level >= 2:stoneWall.isDestroy = Trueself.isDestroy = Trueexplode = Explode(stoneWall, 25)explodeList.append(explode)Sound('../Sound/block.wav').play()
在主类中调用函数
主类的完整代码
import pygame
import sysfrom PlayerTank import PlayerTank
from EnemyTank import EnemyTank
from Sound import Sound
from BrickWall import BrickWall
from StoneWall import StoneWallSCREEN_WIDTH = 1100
SCREEN_HEIGHT = 600
BACKGROUND_COLOR = pygame.Color(0, 0, 0)
FONT_COLOR = (255, 255, 255)
PLAYER_TANK_POSITION = (325, 550)class MainGame:# 窗口Surface对象window = None# 玩家坦克playerTank = None# 玩家子弹playerBulletList = []playerBulletNumber = 3# 敌人坦克enemyTankList = []enemyTankTotalCount = 5# 用来给玩家展示坦克的数量enemyTankCurrentCount = 5# 敌人坦克子弹enemyTankBulletList = []# 爆炸列表explodeList = []# 坦克移动音效playerTankMoveSound = Sound('../Sound/player.move.wav').setVolume()# 游戏开始音效startingSound = Sound('../Sound/intro.wav')# 砖墙brickWallList = []# 石墙stoneWallList = []def __init__(self):passdef startGame(self):# 初始化展示模块pygame.display.init()# 设置窗口大小size = (SCREEN_WIDTH, SCREEN_HEIGHT)# 初始化窗口MainGame.window = pygame.display.set_mode(size)# 设置窗口标题pygame.display.set_caption('Tank Battle')# 初始化我方坦克MainGame.playerTank = PlayerTank(PLAYER_TANK_POSITION[0], PLAYER_TANK_POSITION[1], 1, 1)# 播放开始音乐MainGame.startingSound.play()# 初始化场景self.initBrickWall()self.initStoneWall()while 1:# 设置背景颜色MainGame.window.fill(BACKGROUND_COLOR)# 获取窗口事件self.getPlayingModeEvent()# 显示物体self.drawBrickWall(MainGame.brickWallList)self.drawStoneWall(MainGame.stoneWallList)# 展示敌方坦克self.drawEnemyTank()# 显示我方坦克MainGame.playerTank.draw(MainGame.window, PLAYER_TANK_POSITION[0], PLAYER_TANK_POSITION[1])# 我方坦克移动if not MainGame.playerTank.stop:MainGame.playerTank.move()MainGame.playerTank.collideEnemyTank(MainGame.enemyTankList)MainGame.playerTank.collideBrickWall(MainGame.brickWallList)MainGame.playerTank.collideStoneWall(MainGame.stoneWallList)# 显示我方坦克子弹self.drawPlayerBullet(MainGame.playerBulletList)# 展示敌方坦克子弹self.drawEnemyBullet()# 展示爆炸效果self.drawExplode()# 更新窗口pygame.display.update()def getPlayingModeEvent(self):# 获取所有事件eventList = pygame.event.get()for event in eventList:if event.type == pygame.QUIT:sys.exit()"""stop属性用来控制坦克移动,当键盘按键按下时,坦克可以移动,一直按住一直移动,当按键抬起时,停止移动如果没有该属性,按一下按键移动一次,按一下移动一下,不能一直按住一直移动"""if event.type == pygame.KEYDOWN:MainGame.playerTankMoveSound.play(-1)if event.key == pygame.K_w:MainGame.playerTank.direction = 'UP'MainGame.playerTank.stop = Falseelif event.key == pygame.K_s:MainGame.playerTank.direction = 'DOWN'MainGame.playerTank.stop = Falseelif event.key == pygame.K_a:MainGame.playerTank.direction = 'LEFT'MainGame.playerTank.stop = Falseelif event.key == pygame.K_d:MainGame.playerTank.direction = 'RIGHT'MainGame.playerTank.stop = Falseelif event.key == pygame.K_j:# 判断子弹数量是否超过指定的个数if len(MainGame.playerBulletList) < MainGame.playerBulletNumber:bullet = MainGame.playerTank.shot()MainGame.playerBulletList.append(bullet)# 添加音效Sound('../Sound/shoot.wav').play(0)if event.type == pygame.KEYUP:MainGame.playerTankMoveSound.stop()if event.key == pygame.K_w:MainGame.playerTank.stop = Trueelif event.key == pygame.K_s:MainGame.playerTank.stop = Trueelif event.key == pygame.K_a:MainGame.playerTank.stop = Trueelif event.key == pygame.K_d:MainGame.playerTank.stop = Truedef drawPlayerBullet(self, playerBulletList):# 遍历整个子弹列表,如果是没有被销毁的状态,就把子弹显示出来,否则从列表中删除for bullet in playerBulletList:if not bullet.isDestroy:bullet.draw(MainGame.window)bullet.move(MainGame.explodeList)bullet.playerBulletCollideEnemyTank(MainGame.enemyTankList, MainGame.explodeList)bullet.bulletCollideBrickWall(MainGame.brickWallList, MainGame.explodeList)bullet.bulletCollideStoneWall(MainGame.stoneWallList, MainGame.explodeList)else:playerBulletList.remove(bullet)def drawEnemyTank(self):# 如果当前坦克为0,那么就该重新生成坦克if len(MainGame.enemyTankList) == 0:# 一次性产生三个,如果剩余坦克数量超过三,那只能产生三个n = min(3, MainGame.enemyTankTotalCount)# 如果最小是0,就说明敌人坦克没有了,那么就赢了if n == 0:print('赢了')return# 没有赢的话,就产生n个坦克self.initEnemyTank(n)# 总个数减去产生的个数MainGame.enemyTankTotalCount -= n# 遍历坦克列表,展示坦克并且移动for tank in MainGame.enemyTankList:# 坦克还有生命值if tank.life > 0:tank.draw(MainGame.window)tank.move()tank.collidePlayerTank(MainGame.playerTank)tank.collideEnemyTank(MainGame.enemyTankList)tank.collideBrickWall(MainGame.brickWallList)tank.collideStoneWall(MainGame.stoneWallList)bullet = tank.shot()if bullet is not None:MainGame.enemyTankBulletList.append(bullet)# 坦克生命值为0,就从列表中剔除else:MainGame.enemyTankCurrentCount -= 1MainGame.enemyTankList.remove(tank)def initEnemyTank(self, number):y = 0position = [0, 425, 850]index = 0for i in range(number):x = position[index]enemyTank = EnemyTank(x, y)MainGame.enemyTankList.append(enemyTank)index += 1def drawEnemyBullet(self):for bullet in MainGame.enemyTankBulletList:if not bullet.isDestroy:bullet.draw(MainGame.window)bullet.move(MainGame.explodeList)bullet.enemyBulletCollidePlayerTank(MainGame.playerTank, MainGame.explodeList)bullet.bulletCollideBrickWall(MainGame.brickWallList, MainGame.explodeList)bullet.bulletCollideStoneWall(MainGame.stoneWallList, MainGame.explodeList)else:bullet.source.bulletCount -= 1MainGame.enemyTankBulletList.remove(bullet)def drawExplode(self):for e in MainGame.explodeList:if e.isDestroy:MainGame.explodeList.remove(e)else:e.draw(MainGame.window)def drawBrickWall(self, brickWallList):for brickWall in brickWallList:if brickWall.isDestroy:brickWallList.remove(brickWall)else:brickWall.draw(MainGame.window)def initBrickWall(self):for i in range(20):MainGame.brickWallList.append(BrickWall(i * 25, 200))def initStoneWall(self):for i in range(20):MainGame.stoneWallList.append(StoneWall(i * 25, 400))def drawStoneWall(self, stoneWallList):for stoneWall in stoneWallList:if stoneWall.isDestroy:stoneWallList.remove(stoneWall)else:stoneWall.draw(MainGame.window)if __name__ == '__main__':MainGame().startGame()
5. 添加玩家基地
坦克大战是玩家坦克在保护自己基地的同时消灭敌方坦克,当玩家坦克生命值为0或者基地爆炸时,游戏失败,下面来添加玩家的基地
创建基地类
import pygame.imagefrom ParentObject import ParentObjectclass Home(ParentObject):def __init__(self, x, y):super().__init__()self.image = pygame.image.load('../Image/Home/Home.png')self.rect = self.image.get_rect()self.rect.left = xself.rect.top = yself.isDestroy = Falsedef draw(self, window):window.blit(self.image, self.rect)
为基地添加碰撞效果,在两个坦克类中加入下面的函数
def collideHome(self, home):if pygame.sprite.collide_rect(self, home):self.rect.left = self.prvXself.rect.top = self.prvY
在主函数创建基地变量,并初始化和调用上面的函数
之后给基地加入子弹击中效果
def bulletCollidePlayerHome(self, home, explodeList):if pygame.sprite.collide_rect(self, home):self.isDestroy = Trueexplode = Explode(home, 50)explodeList.append(explode)Sound('../Sound/buh.wav').play()return Trueelse:return False
返回值用来判断是否结束游戏
在主类中设置一个变量记录是否游戏结束
def __init__(self):# 初始化MainGame.home = Home(425, 550)# 记录是否输了self.isDefeated = False
在循环中检查
while 1:...# 检查是否输了if self.isDefeated:self.defeated()break...
def defeated(self):# 失败了坦克不能移动了MainGame.playerTankMoveSound.stop()# 播放失败音乐Sound('../Sound/gameOver.wav').play()print('游戏结束')self.isDefeated = True
游戏结束后要改变窗口中的内容,显示你输了,所以要用break跳出
这里需要使用到在窗口显示文字,编写一个函数
def drawText(self, text, x, y, fontSize, window):# 初始化字体pygame.font.init()font = pygame.font.SysFont('georgia', fontSize)# 加载文字并设置颜色fontColor = pygame.Color(255, 255, 255)fontObject = font.render(text, True, fontColor)# 展示文字window.blit(fontObject, (x, y))
记得在主函数中调用
while 1:# 设置背景颜色MainGame.window.fill(BACKGROUND_COLOR)# 获取窗口事件self.getPlayingModeEvent()# 显示物体self.drawBrickWall(MainGame.brickWallList)self.drawStoneWall(MainGame.stoneWallList)MainGame.home.draw(MainGame.window)# 展示敌方坦克self.drawEnemyTank()# 显示我方坦克MainGame.playerTank.draw(MainGame.window, PLAYER_TANK_POSITION[0], PLAYER_TANK_POSITION[1])# 我方坦克移动if not MainGame.playerTank.stop:MainGame.playerTank.move()MainGame.playerTank.collideEnemyTank(MainGame.enemyTankList)MainGame.playerTank.collideBrickWall(MainGame.brickWallList)MainGame.playerTank.collideStoneWall(MainGame.stoneWallList)MainGame.playerTank.collideHome(MainGame.home)# 显示我方坦克子弹self.drawPlayerBullet(MainGame.playerBulletList)# 展示敌方坦克子弹self.drawEnemyBullet()# 展示爆炸效果self.drawExplode()# 检查是否输了if self.isDefeated:self.defeated()break# 更新窗口pygame.display.update()# 设置背景颜色
MainGame.window.fill(BACKGROUND_COLOR)# 显示字体
self.drawText('Defeated', 200, 200, 50, MainGame.window)# 更新窗口
pygame.display.update()
给玩家提示敌人坦克数量
到这里,坦克大战的基本功能就实现了,接下来就是添加其他的场景物体和坦克样子了
6. 最终效果
主界面,这里直接放了一张图片上去,图片在素材里,上面的坦克是自己画上去的,w和s键可以上下移动坦克,选择对应的模式
选择关卡,这里使用用了四张图片,左右箭头,上面的标题和start文字,这些都是图片,按下黄色箭头可以选择关卡,使用的鼠标事件
游戏界面
其中加入了奖励功能
地图制作可以使用excel读取信息,下面是第一关的地图
坦克大战代码
链接:https://pan.baidu.com/s/1qFV-0hi0cgZS1Hnvx6mK6Q?pwd=90tk
提取码:90tk
相关文章:

学习 Python 之 Pygame 开发坦克大战(五)
学习 Python 之 Pygame 开发坦克大战(五)坦克大战完善地图1. 创建砖墙2. 给砖墙增加子弹击中的碰撞效果3. 给砖墙添加坦克不能通过的碰撞效果4. 添加石墙5. 添加玩家基地6. 最终效果坦克大战完善地图 我的素材放到了百度网盘里,里面还有原版…...

【ROS】Windows系统安装ROS体验
大家平时玩ROS都是在Ubuntu系统上,那Windows系统可以安装吗,答案是:可以的!Windows为了发展自家的物联网生态,已经在Windows系统支持ROS了。 文章目录1.安装VS 20172.安装Chocolatey & Git3.安装ROS4.运行ROS例程1…...

第1讲-初步认识数据库系统(测试题总结)
一、测试题 数据库系统 包含 数据库管理系统 详细版: 数据库管理系统DBMS是数据管理软件,在用户和操作系统之间。 数据库系统DBS由数据库,数据库管理系统(及其应用开发工具)、应用程序和数据库管理员DBA组成的存储、管…...

进程-操作系统结构
进程-操作系统结构 中文仅本人理解,有错误请联系我。 操作系统为不同方面服务,有不同的设计角度。 为用户: 使用 为程序员:创造 程序员需要关注的就是system call接口的调度 file systems:ntfs,ext4 commu…...
【网络原理6】数据链路层协议——以太网
数据链路层负责的是相邻两个网络节点之间的数据以帧为单位进行传输。 具体关于数据链路层的介绍,已经在这一篇文章当中提到了。 初识网络:IP、端口、网络协议、TCP-IP五层模型_革凡成圣211的博客-CSDN博客TCP/IP五层协议详解https://blog.csdn.net/weix…...

组合数学原理与例题
目录 一、前言 二、计数原理 1、加法原理 2、分割立方体(lanqiaoOJ题号1620) 3、乘法原理 4、挑选子串(lanqiaoOJ题号1621) 5、糊涂人寄信(lanqiaoOJ题号1622) 6、战斗吧N皇后(lanqiaoO…...

【机器学习 深度学习】通俗讲解集成学习算法
目录:集成学习一、机器学习中的集成学习1.1 定义1.2 分类器(Classifier)1.2.1 决策树分类器1.2.2 朴素贝叶斯分类器1.2.3 AdaBoost算法1.2.4 支持向量机1.2.5 K近邻算法1.3 集成学习方法1.3.1 自助聚合(Bagging)1.3.2 提升法(Boosting)1.3.2.1 自适应adaboost1.3.3 …...

汉字----dgfont
Abstract 字符生成是一个具有挑战性的问题,特别是对于一些由大量字符组成的书写系统,近年来受到了广泛的关注。然而,现有的字体生成方法通常是在监督学习中。它们需要大量的配对数据,这是劳动密集型和昂贵的收集。此外,常见的图像到图像转换模型通常将风格定义为纹理和颜…...

C# chart绘图 鼠标响应
1、图形自动滚动设置 chart1.ChartAreas[0].AxisX.Maximum 横坐标显示区域最大值 chart1.ChartAreas[0].AxisX.Minimum 横坐标显示区域最小值 显示宽度 chart1.ChartAreas[0].AxisX.Maximum - chart1.ChartAreas[0].AxisX.Minimum chart1.ChartAreas[0].AxisX.Maximum x_d…...

结构体与引用
1.结构体基本概念结构体属于用户自定义的数据类型,允许用户存储不同的数据类型2.结构体定义和使用语法: struct 结构体 { 结构体成员列表 };通过结构体创建变量的方式有三种:struct 结构体名 变量名struct 结构体名 变量名 { 成员1值,成员2值...}定义结构…...

13.罗马数字转整数
罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。字符 数值I 1V 5X 10L 50C 100D 500M 1000例如, 罗马数字 2 写做 II ,即为两个并列的 1 。12 写做 XII ,即为 X II 。 27 写做 XX…...

JVM垃圾回收机制
垃圾回收机制(GC) 内存管理 Java的内存管理很大程度指的就是对象的管理,其中包括对象空间的分配和释放。 对象空间的分配:使用new关键字创建对象即可 对象空间的释放:将对象赋值null即可。垃圾回收器将负责所有“不…...

Java File类、IO流、Properties属性类
文章目录一、补充二、File类File类的含义创建多级文件File类的常见方法三、IO流IO流分类输入输出流FileOutputStreamInputStreamInputStream与OutputStream的实例ReaderWriterFileReader和FileWriter的实例缓冲流转换流序列化与ObjectInputStream、ObjectOutputStream打印流Pro…...

MySQL备份恢复(十二)
文章目录1. MySQL数据损坏类型1.1 物理损坏1.2 逻辑损坏2. DBA运维人员备份/恢复职责2.1 设计备份/容灾策略2.1.1 备份策略2.1.2 容灾策略2.2 定期的备份/容灾检查2.3 定期的故障恢复演练2.4 数据损坏时的快速准确恢复2.5 数据迁移工作3. MySQL常用备份工具3.1 逻辑备份方式3.2…...

【Java|golang】1792. 最大平均通过率---封装最小堆
一所学校里有一些班级,每个班级里有一些学生,现在每个班都会进行一场期末考试。给你一个二维数组 classes ,其中 classes[i] [passi, totali] ,表示你提前知道了第 i 个班级总共有 totali 个学生,其中只有 passi 个学…...

PHP 页面静态化
前言随着网站的内容的增多和用户访问量的增多,网站加载会越来越慢,受限于带宽和服务器同一时间的请求次数的限制,,我们往往需要在此时对我们的网站进行代码优化和服务器配置的优化。一、页面静态化概念静态化定义静态化就是指把原…...

【Python】进制、计算机中的单位、编码、数据类型、索引、字符串切片、字符串的功能方法
一、进制计算机中底层所有的数据都是以 010101 的形式存在(图片、文本、视频等)。二进制八进制十进制(也就是我们熟知的阿拉伯数字)十六进制进制转换v1 bin(25) # 十进制转换为二进制 print(v1) # "0b11001"v2 oct(23…...

基于android的无人健身房
需求信息: 1:客户登录:首次登陆必须注册,用户注册完成后可以进入软件查看自己的金额、会员等级、消费和健身时长。 2:计费功能:用户通过软件扫描二维码后即可进入健身房,软件显示欢迎进入健身房…...

带你Java基础入门
首先我们都知道的,Java是一种高级计算机语言,是可以编写跨平台应用软件、完全面向对象的程序设计语言。相对于零基础小白如何更加快速的入门java?小编给大家整理了java300集自学教程视频,非常适合零基础的小伙伴,一周时间实现快速…...

VNCTF 2023 - Web 象棋王子|电子木鱼|BabyGo Writeups
象棋王子 签到题,jsfuck解密 丢到console得到flag 电子木鱼 后面两道都是代码审计,这题是rust,题目给出了源码,下载下来看 关键代码: 由于限制,quantity只能为正数 功德也只能是正数(负数的…...

「JVM 编译优化」插入式注解处理器(自定义代码编译检查)
JDK 的编译子系统暴露给用户直接控制的功能相对很少,除了虚拟机即时编译的若干参数,便只有 JSR-296 中定义的插入式注解处理器 API; 文章目录1. 目标2. 实现3. 运行与测试4. 其他应用案例1. 目标 前端编译器在讲 Java 源码编译成字节码时对源…...

一文彻底理解大小端和位域 BIGENDIAN LITTLEENDIAN
一文彻底理解大小端和位域 为什么有大小端 人们一直认为大道至简,就好像物理学上的世界追求使用一个理论来统一所有的现象。为什么cpu存在大小端之分,一言以蔽之,这两种模式各有各的优点,其各自的优点就是对方的缺点,…...

面试准备知识点与总结——(虚拟机篇)
目录JVM的内存结构JVM哪些部分会发生内存溢出方法区、永久代、元空间三者之间的关系JVM内存参数JVM垃圾回收算法1.标记清除法2.标记整理3.标记复制说说GC和分代回收算法三色标记与并发漏标的问题垃圾回收器项目中什么时候会内存溢出,怎么解决类加载过程三个阶段何为…...

spring cloud 集成 seata 分布式事务
spring cloud 集成 seata 分布式事务 基于 seata-server 1.6.x 序言 下载 seata-server 准备一个数据库 seata 专门为 seata-server 做存储,如, 可以指定 branch_tabledistributed_lockglobal_tablelock_table 准备一个业务库,比如存放定单ÿ…...

k8s篇之概念介绍
文章目录时光回溯什么是K8SK8S不是什么一、K8S构成组件控制平面组件(Control Plane Components)kube-apiserveretcdkube-schedulerkube-controller-managercloud-controller-managerNode 组件kubeletkube-proxy容器运行时(Container Runtime&…...

JavaScript学习第1天:浏览器组成、JS的组成、变量、数据类型转化、运算符、while和do...while循环
目录一、浏览器的组成二、JS的组成三、变量1、同时声明多个变量2、声明变量特殊情况四、数据类型1、数据类型2、 isNaN()方法3、字符串转义符4、字符串拼接5、特殊拼接五、数据类型转换1、转化为字符串2、转化为数字型3、转化为布尔值六、运算符1、递增和递减运算符2、逻辑运算…...

【Flutter入门到进阶】Dart进阶篇---Dart多线程异步原理
1 Isolate 1.1 什么是Isolate 1.1.1 概念 线程?异步?隔离?到底什么意思? Isolate中文意思是隔离,从使用角度来说是Dart的线程,但是从本质虚拟机的实现角度来讲Isolate是一组封装。 isolate可以理解为dar…...

WEB系列(二)-----------XSS
XSS原理及基础 定义 恶意攻击者会往Web页面里插入JS代码,当用户点击网页时.镶嵌的JS代码就会执行,从而达到恶意的特殊目的. 原因 程序对输入和输出的控制不够严格,导致payload输出到前段时被浏览器当做有效代码执行从而产生危害。 分类 存储型反射型DOM型 测…...

[python入门㊾] - python异常中的断言
目录 ❤ 断言的功能与语法 ❤ 常用断言 ❤ 常用的断言表达方式 ❤ 异常断言 ❤ 正则断言 ❤ 检查断言装饰器 ❤ 断言的功能与语法 Python assert(断言)用于判断一个表达式,在表达式条件为 False 的时候触发异常 断言可以在条件…...

一文告诉你什么是财务数据治理?
大家好,我是梦想家Alex,今天是周末,就不给大家分享技术文了~应出版社老师推荐,文末给大家送几本DAMA中国主席力荐,20位行业专家历时2年共同打造的《财务数据治理实战》,将数据治理理论应用于财务…...