学习 Python 之 Pygame 开发坦克大战(五)
学习 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只能为正数 功德也只能是正数(负数的…...
offset三大家族
以下是关于 offset 三大家族的知识点总结: 1. offsetParent 定义:offsetParent 是距离目标元素最近的已定位(position 不为 static)的祖先元素。特点: 如果父级元素都没有定位,则 offsetParent 为 body。…...
青少年编程与数学 02-020 C#程序设计基础 09课题、面向对象编程
青少年编程与数学 02-020 C#程序设计基础 09课题、面向对象编程 一、概述1. 对象(Object)2. 类(Class)3. 封装(Encapsulation)4. 继承(Inheritance)5. 多态(Polymorphism…...

KWIC—Implicit Invocation
KWIC—Implicit Invocation ✏️ KWIC—Implicit Invocation 文章目录 KWIC—Implicit Invocation📝KWIC—Implicit Invocation🧩KWIC🧩核心组件🧩ImplementationScheme⚖️ 隐式调用 vs 显式调用对比 🌟 总结 &#x…...
音视频中的复用器
🎬 什么是复用器(Muxer)? 复用器(muxer)是负责把音频、视频、字幕等多个媒体流打包(封装)成一个单一的文件格式的组件。 💡 举个形象的例子: 假设你有两样东…...
微信小程序(uniapp)对接腾讯云IM
UniApp 对接腾讯云 IM(即时通讯)完整指南 一、项目背景与需求分析 随着社交场景的普及,即时通讯功能已成为移动应用的标配。腾讯云 IM(Tencent IM,即 TIM)提供稳定可靠的即时通讯服务,支持单聊…...

不加载PHP OpenTelemetry SDK实现Trace与Logs
目录 前言一、回到OpenTelemetry原理看问题1、数据接收(Receivers)2、数据处理(Processors)3、数据导出(Exporters) 二、不加载OpenTelemetry SDK实现Trace与Logs示例 前言 前面两篇我们分别介绍了OpenT…...

C#数字图像处理(一)
文章目录 1.C#图像处理基础1.1 Bitmap类1.2 Bitmapdata类1.3 Graphics类1.4 Image类 2.彩色图像灰度化1.提取像素法2.内存法3.指针法三种方法的比较4.灰度图像二值化: 3.相关链接 Bitmap类、 Bitmapdata类和 Graphics类是C#图像处理中最重要的3个类,如果要用C# 进行…...

实验三 企业网络搭建及应用
实验三 企业网络搭建及应用 一、实验目的 1.掌握企业网络组建方法。 2.掌握企业网中常用网络技术配置方法。 二、实验描述 某企业设有销售部、市场部、技术部和财务部四个部门。公司内部网络使用二层交换机作为用户的接入设备。为了使网络更加稳定可靠,公司决定…...

开源即战力!从科研到商用:Hello Robot 移动操作机器人Stretch 3多模态传感融合(RGB-D/激光/力矩)控制方案
科研领域对机器人技术的需求日益增长,Hello Robot的移动操作机器人Stretch 3凭借其灵活性和性能满足了这一需求。其模块化设计、开源架构和高精度传感控制能力,使科研人员能够顺利开展实验。Stretch 3以其独特的移动操作能力,为科研探索提供了…...
ChatGPT与认知科学:人机协同的未来图景
目录 导论:当机器开始“思考”,我们如何理解智能的未来? 第一部分:ChatGPT的技术解密与认知科学基础 第一章:ChatGPT的“芯”事:深入浅出聊技术,洞察认知新启示 1.1 开篇聊两句:…...