【项目:坦克大战】

2023-11-17

"""
v1.25
    新增功能:
       1.音效的处理
"""
import pygame,time,random
_display = pygame.display
COLOR_BLACK = pygame.Color(0, 0, 0)
COLOR_RED = pygame.Color(255, 0, 0)
version = 'v1.25'
class MainGame():
    #游戏主窗口
    window = None
    SCREEN_HEIGHT = 500
    SCREEN_WIDTH = 800
    #创建我方坦克
    TANK_P1 = None
    #存储所有敌方坦克
    EnemyTank_list = []
    #要创建的敌方坦克的数量
    EnemTank_count = 5
    #存储我方子弹的列表
    Bullet_list = []
    #存储敌方子弹的列表
    Enemy_bullet_list = []
    #爆炸效果列表
    Explode_list = []
    #墙壁列表
    Wall_list = []
    #开始游戏方法
    def startGame(self):
        _display.init()
        #创建窗口加载窗口(借鉴官方文档)
        MainGame.window = _display.set_mode([MainGame.SCREEN_WIDTH,MainGame.SCREEN_HEIGHT])
        self.creatMyTank()
        self.creatEnemyTank()
        self.creatWalls()
        #设置一下游戏标题
        _display.set_caption("坦克大战"+version)
        #让窗口持续刷新操作
        while True:
            #给窗口完成一个填充颜色
            MainGame.window.fill(COLOR_BLACK)
            #在循环中持续完成事件的获取
            self.getEvent()
            #将绘制文字得到的小画布,粘贴到窗口中
            MainGame.window.blit(self.getTextSurface("剩余敌方坦克%d辆"%len(MainGame.EnemyTank_list)),(5,5))
            #调用展示墙壁的方法
            self.blitWalls()
            if MainGame.TANK_P1 and MainGame.TANK_P1.live:
                # 将我方坦克加入到窗口中
                MainGame.TANK_P1.displayTank()
            else:
                del MainGame.TANK_P1
                MainGame.TANK_P1 = None
            #循环展示敌方坦克
            self.blitEnemyTank()
            #根据坦克的开关状态调用坦克的移动方法
            if MainGame.TANK_P1 and not MainGame.TANK_P1.stop:
                MainGame.TANK_P1.move()
                #调用碰撞墙壁的方法
                MainGame.TANK_P1.hitWalls()
                MainGame.TANK_P1.hitEnemyTank()
            #调用渲染子弹列表的一个方法
            self.blitBullet()
            #调用渲染敌方子弹列表的一个方法
            self.blitEnemyBullet()
            #调用展示爆炸效果的方法
            self.displayExplodes()
            time.sleep(0.02)
            #窗口的刷新
            _display.update()
    #创建我方坦克的方法
    def creatMyTank(self):
        # 创建我方坦克
        MainGame.TANK_P1 = MyTank(400, 300)
        #创建音乐对象
        music = Music('img/start.wav')
        #调用播放音乐方法
        music.play()
    #创建敌方坦克
    def creatEnemyTank(self):
        top = 100
        for i in range(MainGame.EnemTank_count):
            speed = random.randint(3,6)
            #每次都随机生成一个left值
            left = random.randint(1, 7)
            eTank = EnemyTank(left*100,top,speed)
            MainGame.EnemyTank_list.append(eTank)
    #创建墙壁的方法
    def creatWalls(self):
        for i in range(6):
            wall = Wall(130*i,240)
            MainGame.Wall_list.append(wall)
    def blitWalls(self):
        for wall in MainGame.Wall_list:
            if wall.live:
                wall.displayWall()
            else:
                MainGame.Wall_list.remove(wall)
    #将敌方坦克加入到窗口中
    def blitEnemyTank(self):
        for eTank in MainGame.EnemyTank_list:
            if eTank.live:
                eTank.displayTank()
                # 坦克移动的方法
                eTank.randMove()
                #调用敌方坦克与墙壁的碰撞方法
                eTank.hitWalls()
                #敌方坦克是否撞到我方坦克
                eTank.hitMyTank()
                # 调用敌方坦克的射击
                eBullet = eTank.shot()
                # 如果子弹为None。不加入到列表
                if eBullet:
                    # 将子弹存储敌方子弹列表
                    MainGame.Enemy_bullet_list.append(eBullet)
            else:
                MainGame.EnemyTank_list.remove(eTank)
    #将我方子弹加入到窗口中
    def blitBullet(self):
        for bullet in MainGame.Bullet_list:
            #如果子弹还活着,绘制出来,否则,直接从列表中移除该子弹
            if bullet.live:
                bullet.displayBullet()
                # 让子弹移动
                bullet.bulletMove()
                # 调用我方子弹与敌方坦克的碰撞方法
                bullet.hitEnemyTank()
                # 调用判断我方子弹是否碰撞到墙壁的方法
                bullet.hitWalls()
            else:
                MainGame.Bullet_list.remove(bullet)
    #将敌方子弹加入到窗口中
    def blitEnemyBullet(self):
        for eBullet in MainGame.Enemy_bullet_list:
            # 如果子弹还活着,绘制出来,否则,直接从列表中移除该子弹
            if eBullet.live:
                eBullet.displayBullet()
                # 让子弹移动
                eBullet.bulletMove()
                #调用是否碰撞到墙壁的一个方法
                eBullet.hitWalls()
                if MainGame.TANK_P1 and MainGame.TANK_P1.live:
                    eBullet.hitMyTank()
            else:
                MainGame.Enemy_bullet_list.remove(eBullet)
    #新增方法: 展示爆炸效果列表
    def displayExplodes(self):
        for explode in MainGame.Explode_list:
            if explode.live:
                explode.displayExplode()
            else:
                MainGame.Explode_list.remove(explode)
    #获取程序期间所有事件(鼠标事件,键盘事件)
    def getEvent(self):
        #1.获取所有事件
        eventList = pygame.event.get()
        #2.对事件进行判断处理(1、点击关闭按钮  2、按下键盘上的某个按键)
        for event in eventList:
            #判断event.type 是否QUIT,如果是退出的话,直接调用程序结束方法
            if event.type == pygame.QUIT:
                self.endGame()
            #判断事件类型是否为按键按下,如果是,继续判断按键是哪一个按键,来进行对应的处理
            if event.type == pygame.KEYDOWN:
                #点击ESC按键让我方坦克重生
                if event.key == pygame.K_ESCAPE and not MainGame.TANK_P1:
                    #调用创建我方坦克的方法
                    self.creatMyTank()
                if MainGame.TANK_P1 and MainGame.TANK_P1.live:
                    # 具体是哪一个按键的处理
                    if event.key == pygame.K_LEFT:
                        print("坦克向左调头,移动")
                        # 修改坦克方向
                        MainGame.TANK_P1.direction = 'L'
                        MainGame.TANK_P1.stop = False
                    elif event.key == pygame.K_RIGHT:
                        print("坦克向右调头,移动")
                        # 修改坦克方向
                        MainGame.TANK_P1.direction = 'R'
                        MainGame.TANK_P1.stop = False
                    elif event.key == pygame.K_UP:
                        print("坦克向上调头,移动")
                        # 修改坦克方向
                        MainGame.TANK_P1.direction = 'U'
                        MainGame.TANK_P1.stop = False
                    elif event.key == pygame.K_DOWN:
                        print("坦克向下掉头,移动")
                        # 修改坦克方向
                        MainGame.TANK_P1.direction = 'D'
                        MainGame.TANK_P1.stop = False
                    elif event.key == pygame.K_SPACE:
                        print("发射子弹")
                        if len(MainGame.Bullet_list) < 3:
                            # 产生一颗子弹
                            m = Bullet(MainGame.TANK_P1)
                            # 将子弹加入到子弹列表
                            MainGame.Bullet_list.append(m)
                            music = Music('img/fire.wav')
                            music.play()
                        else:
                            print("子弹数量不足")
                        print("当前屏幕中的子弹数量为:%d" % len(MainGame.Bullet_list))
            #结束游戏方法
            if event.type == pygame.KEYUP:
                #松开的如果是方向键,才更改移动开关状态
                if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT or event.key == pygame.K_UP or event.key == pygame.K_DOWN:
                    if MainGame.TANK_P1 and MainGame.TANK_P1.live:
                        # 修改坦克的移动状态
                        MainGame.TANK_P1.stop = True
    #左上角文字绘制的功能
    def getTextSurface(self,text):
        # 初始化字体模块
        pygame.font.init()
        #查看系统支持的所有字体
        # fontList = pygame.font.get_fonts()
        # print(fontList)
        # 选中一个合适的字体
        font = pygame.font.SysFont('kaiti',18)
        # 使用对应的字符完成相关内容的绘制
        textSurface = font.render(text,True,COLOR_RED)
        return textSurface
    def endGame(self):
        print("谢谢使用")
        #结束python解释器
        exit()
class BaseItem(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
class Tank(BaseItem):
    def __init__(self,left,top):
        self.images = {
            'U':pygame.image.load('img/p1tankU.gif'),
            'D':pygame.image.load('img/p1tankD.gif'),
            'L':pygame.image.load('img/p1tankL.gif'),
            'R':pygame.image.load('img/p1tankR.gif')
        }
        self.direction = 'U'
        self.image = self.images[self.direction]
        #坦克所在的区域  Rect->
        self.rect = self.image.get_rect()
        #指定坦克初始化位置 分别距x,y轴的位置
        self.rect.left = left
        self.rect.top = top
        #新增速度属性
        self.speed = 5
        #新增属性: 坦克的移动开关
        self.stop = True
        #新增属性  live 用来记录,坦克是否活着
        self.live = True
        #新增属性: 用来记录坦克移动之前的坐标(用于坐标还原时使用)
        self.oldLeft = self.rect.left
        self.oldTop = self.rect.top

    #坦克的移动方法
    def move(self):
        #先记录移动之前的坐标
        self.oldLeft = self.rect.left
        self.oldTop = self.rect.top
        if self.direction == 'L':
            if self.rect.left > 0:
                self.rect.left -= self.speed
        elif self.direction == 'R':
            if self.rect.left + self.rect.height < MainGame.SCREEN_WIDTH:
                self.rect.left += self.speed
        elif self.direction == 'U':
            if self.rect.top > 0:
                self.rect.top -= self.speed
        elif self.direction == 'D':
            if self.rect.top + self.rect.height < MainGame.SCREEN_HEIGHT:
                self.rect.top += self.speed
    def stay(self):
        self.rect.left = self.oldLeft
        self.rect.top = self.oldTop
    #新增碰撞墙壁的方法
    def hitWalls(self):
       for wall in MainGame.Wall_list:
           if pygame.sprite.collide_rect(wall,self):
               self.stay()
    #射击方法
    def shot(self):
        return Bullet(self)
    #展示坦克(将坦克这个surface绘制到窗口中  blit())
    def displayTank(self):
        #1.重新设置坦克的图片
        self.image = self.images[self.direction]
        #2.将坦克加入到窗口中
        MainGame.window.blit(self.image,self.rect)
class MyTank(Tank):
    def __init__(self,left,top):
        super(MyTank, self).__init__(left,top)
    #新增主动碰撞到敌方坦克的方法
    def hitEnemyTank(self):
        for eTank in MainGame.EnemyTank_list:
            if pygame.sprite.collide_rect(eTank,self):
                self.stay()

class EnemyTank(Tank):
    def __init__(self,left,top,speed):
        super(EnemyTank, self).__init__(left,top)
        # self.live = True
        self.images = {
            'U': pygame.image.load('img/enemy1U.gif'),
            'D': pygame.image.load('img/enemy1D.gif'),
            'L': pygame.image.load('img/enemy1L.gif'),
            'R': pygame.image.load('img/enemy1R.gif')
        }
        self.direction = self.randDirection()
        self.image = self.images[self.direction]
        # 坦克所在的区域  Rect->
        self.rect = self.image.get_rect()
        # 指定坦克初始化位置 分别距x,y轴的位置
        self.rect.left = left
        self.rect.top = top
        # 新增速度属性
        self.speed = speed
        self.stop = True
        #新增步数属性,用来控制敌方坦克随机移动
        self.step = 30

    def randDirection(self):
        num = random.randint(1,4)
        if num == 1:
            return 'U'
        elif num == 2:
            return 'D'
        elif num == 3:
            return 'L'
        elif num == 4:
            return 'R'
    # def displayEnemtTank(self):
    #     super().displayTank()
    #随机移动
    def randMove(self):
        if self.step <= 0:
            self.direction = self.randDirection()
            self.step = 50
        else:
            self.move()
            self.step -= 1
    def shot(self):
        num = random.randint(1,1000)
        if num  <= 20:
            return Bullet(self)
    def hitMyTank(self):
        if MainGame.TANK_P1 and MainGame.TANK_P1.live:
            if pygame.sprite.collide_rect(self, MainGame.TANK_P1):
                # 让敌方坦克停下来  stay()
                self.stay()
class Bullet(BaseItem):
    def __init__(self,tank):
        #图片
        self.image = pygame.image.load('img/enemymissile.gif')
        #方向(坦克方向)
        self.direction = tank.direction
        #位置
        self.rect = self.image.get_rect()
        if self.direction == 'U':
            self.rect.left = tank.rect.left + tank.rect.width/2 - self.rect.width/2
            self.rect.top = tank.rect.top - self.rect.height
        elif self.direction == 'D':
            self.rect.left = tank.rect.left + tank.rect.width / 2 - self.rect.width / 2
            self.rect.top = tank.rect.top + tank.rect.height
        elif self.direction == 'L':
            self.rect.left = tank.rect.left - self.rect.width / 2 - self.rect.width / 2
            self.rect.top = tank.rect.top + tank.rect.width / 2 - self.rect.width / 2
        elif self.direction == 'R':
            self.rect.left = tank.rect.left + tank.rect.width
            self.rect.top = tank.rect.top + tank.rect.width / 2 - self.rect.width / 2
        #速度
        self.speed = 7
        #用来记录子弹是否活着
        self.live = True
    #子弹的移动方法
    def bulletMove(self):
        if self.direction == 'U':
            if self.rect.top > 0:
                self.rect.top -= self.speed
            else:
                #修改状态值
                self.live = False
        elif self.direction == 'D':
            if self.rect.top < MainGame.SCREEN_HEIGHT - self.rect.height:
                self.rect.top += self.speed
            else:
                # 修改状态值
                self.live = False
        elif self.direction == 'L':
            if self.rect.left > 0:
                self.rect.left -= self.speed
            else:
                # 修改状态值
                self.live = False
        elif self.direction == 'R':
            if self.rect.left < MainGame.SCREEN_WIDTH - self.rect.width:
                self.rect.left += self.speed
            else:
                # 修改状态值
                self.live = False
    #展示子弹的方法
    def displayBullet(self):
        MainGame.window.blit(self.image,self.rect)
    #新增我方子弹碰撞敌方坦克的方法
    def hitEnemyTank(self):
        for eTank in MainGame.EnemyTank_list:
            if pygame.sprite.collide_rect(eTank,self):
                #产生一个爆炸效果
                explode = Explode(eTank)
                #将爆炸效果加入到爆炸效果列表
                MainGame.Explode_list.append(explode)
                self.live = False
                eTank.live = False
    #新增敌方子弹与我方坦克的碰撞方法
    def hitMyTank(self):
        if pygame.sprite.collide_rect(self,MainGame.TANK_P1):
            # 产生爆炸效果,并加入到爆炸效果列表中
            explode = Explode(MainGame.TANK_P1)
            MainGame.Explode_list.append(explode)
            #修改子弹状态
            self.live = False
            #修改我方坦克状态
            MainGame.TANK_P1.live = False
    #新增子弹与墙壁的碰撞
    def hitWalls(self):
        for wall in MainGame.Wall_list:
            if pygame.sprite.collide_rect(wall,self):
                #修改子弹的live属性
                self.live = False
                wall.hp -= 1
                if wall.hp <= 0:
                    wall.live = False
class Explode():
    def __init__(self,tank):
        self.rect = tank.rect
        self.step = 0
        self.images = [
            pygame.image.load('img/blast0.gif'),
            pygame.image.load('img/blast1.gif'),
            pygame.image.load('img/blast2.gif'),
            pygame.image.load('img/blast3.gif'),
            pygame.image.load('img/blast4.gif')
        ]
        self.image = self.images[self.step]
        self.live = True
    #展示爆炸效果
    def displayExplode(self):
        if self.step < len(self.images):
            MainGame.window.blit(self.image, self.rect)
            self.image = self.images[self.step]
            self.step += 1
        else:
            self.live = False
            self.step = 0
class Wall():
    def __init__(self,left,top):
        self.image = pygame.image.load('img/steels.gif')
        self.rect = self.image.get_rect()
        self.rect.left = left
        self.rect.top = top
        #用来判断墙壁是否应该在窗口中展示
        self.live = True
        #用来记录墙壁的生命值
        self.hp = 3
    #展示墙壁的方法
    def displayWall(self):
        MainGame.window.blit(self.image,self.rect)
#我方坦克出生
class Music():
    def __init__(self,fileName):
        self.fileName = fileName
        #先初始化混合器
        pygame.mixer.init()
        pygame.mixer.music.load(self.fileName)
    #开始播放音乐
    def play(self):
        pygame.mixer.music.play()
MainGame().startGame()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【项目:坦克大战】 的相关文章

  • python中的一些小trick

    1 set用处 个人之前一直没怎么用过set 直到今天我在写一段代码的时候发现in关键字和set对象简直天生一对 a list if b in a 上面这段代码相信大家都写过 但如果将list对象转换成为set 那么代码速度将大大提升 本质
  • python opencv输出中文的方法 putText 支持中文输出

    python opencv输出中文 opencv在视频中通过putText函数能添加文字 但对于中文则无能为力 一般需要FreeType字体库进行处理 在python可以通过PIL转换一下 现将在视频中添加中文封装成函数如下 def pai
  • 2021-09-23 opencv学习笔记(图像变换,二值化,滤波器介绍及python实现)

    opencv学习笔记 颜色空间 改变颜色空间 cv2 cvtColor 目标追踪 如何查找某个颜色的HSV值 图形变换 缩放 cv2 resize 平移 旋转 仿射变换 透视变换 二值化 简单阈值法 自适应阈值 Otsu二值化 俗称大津法
  • python后端学习(十三)路由支持正则、Url编码、增删改操作、增加log日志

    路由支持正则 编码 增删改操作 增加log日志 mini frame py import re url编码相关 import urllib parse import logging from pymysql import connect U
  • python后端学习(九)GIL、深/浅拷贝、私有化、import、封装继承多态

    GIL面试题 描述Python GIL的概念 以及它对python多线程的影响 编写一个多线程抓取网页的程序 并阐明多线程抓取程序是否可比单线程性能有提升 并解释原因 Guido的声明 http www artima com forums
  • 运行python脚本时传入参数的几种方式(接收外部参数)

    运行python脚本时传入参数时三种格式对应不同的参数解析方式 分别为sys argv argparse tf app run 前两者是python自带的功能 后者是tensorflow提供的便捷方式 1 sys argv sys模块是很常
  • python实现链表的旋转

    python实现链表的旋转 链表是一种常用的数据结构 实现起来也不难 但当我们需要将链表中的元素旋转时 就会有一些困难 本文介绍基于python语言的链表旋转实现方法 实现思路 链表旋转可以通过移动节点的位置来实现 我们可以找到需要旋转的位
  • Python 学习笔记(1):心历路程,print()函数,变量和赋值

    也不知道从什么时候开始 对python这个语言有兴趣了 可能是公众号 广告推给我的吧 对python这个语言的印象不错 哈哈 之前大学的时候 对编程就比较感兴趣 反应也还可以 但毕竟不是专门学的 能力不够 毕业之后从事了与专业不相关的工作
  • Python os.path() 模块

    os path 模块主要用于获取文件的属性 以下是os path 模块的几种常用方法 方法 说明 os path abspath path 返回绝对路径 os path basename path 返回路径中最后一个元素 以 结尾时返回空字
  • Python —— 第四部分 面向对象程序设计

    第四部分 面向对象程序设计 4 1 基本概念 4 2 类的定义与使用 4 3 self 参数 4 4 类成员与实例成员 4 4 1 修改属性的值 4 5 成员 4 6 方法 4 7 继承机制 4 7 1 子类的方法 init 4 7 2 给
  • python水仙花数

    题目 打印出所有的 水仙花数 所谓 水仙花数 是指一个三位数 其各位数字立方和等于该数本身 例如 153是一个 水仙花数 因为153 1的三次方 5的三次方 3的三次方 def narcissus narcissus number grou
  • python机器学习之十一 numpy库之矩阵(matrix)

    本文主要介绍numpy库中的矩阵 矩阵的创建 常见的矩阵运算 矩阵 列表 数组之间的转换 矩阵的创建 语法格式 numpy matrix data dtype data 数据 dtype 数据类型 同数组 如 m2 np matrix 1
  • 在linux服务器上进行VTM的cmake并进行编解码

    前不多言 直接进入主题 一 上传VTM源码至linux服务器端 源码压缩包可以去这个网站进行下载 二 上传后使用linux操作命令解压 unzip xxx zip 三 解压后进行cmake操作 输入命令行进行操作 第一步 进入至解压后的vt
  • Mac安装python3

    可以在命令行中输入 brew install python3 但是出现了error 如下所示 tar Error opening archive Failed to open Users my Library Caches Homebrew
  • python3读取excel文件只提取某些行某些列的值

    今天有一位同学给了我一个excel文件 要求读取某些行 某些列 然后我试着做了一个demo 这里分享出来 希望能帮到大家 首先安装xlrd pip3 install xlrd 然后上代码 import numpy as np import
  • Python03-pytest框架

    Python03 pytest测试框架 pytest简介 支持参数化可以细分控制测试用例 支持简单的单元测试和复杂的功能测试 还支持selenium appium等自动化测试 接口自动化测试 支持第三方插件 可以自定义扩展 pytestht
  • Python学习-----起步4(列表元素的添加,删除,修改,查询,获取长度)

    目录 前言 列表元素的添加 或者叫写入 1 append 函数 2 extend 函数 3 insert 函数 列表元素的删除 1 remove 函数 2 pop 函数 3 clear 函数 4 del 方法 这个不是函数哦 列表元素的修改
  • Leetcode刷题日志5.0

    目录 前言 1 两数相加 2 无重复字符的最长子串 3 整数反转 4 删除链表的倒数第 N 个结点 前言 今天我又来继续分享最近做的题了 现在开始进入我们快乐的刷题时间吧 编程语言Python3 0 难度 中等 1 两数相加 给你两个 非空
  • 【PyCharm警告】选择性忽略 PEP8 警告

    提示 Class names should use CamelCase convention Inspection info This inspection checks the PEP8naming conventions 为什么 从命名
  • python自动化笔记(九)文件操作

    文件的打开 file open test txt w encoding utf 8 参数 文件名 访问模式 write 默认为read file write hello python 删除原有内容 并写入 ret file read 读取文

随机推荐

  • [系统安全] 五十三.DataCon竞赛 (2)2022年DataCon涉网分析之恶意样本IOC自动化提取详解

    您可能之前看到过我写的类似文章 为什么还要重复撰写呢 只是想更好地帮助初学者了解病毒逆向分析和系统安全 更加成体系且不破坏之前的系列 因此 我重新开设了这个专栏 准备系统整理和深入学习系统安全 逆向分析和恶意代码检测 系统安全 系列文章会更
  • Android开发报错与解决

    一 AndroidStudio部署项目到设备时 出现以下报错 导致部署失败 Cause buildOutput apkData must not be null 或者 Cause buildOutput apkInfo must not b
  • 1054 求平均值 (20 分)2021/5/13

    本题的基本要求非常简单 给定 N 个实数 计算它们的平均值 但复杂的是有些输入数据可能是非法的 一个 合法 的输入是 1000 1000 区间内的实数 并且最多精确到小数点后 2 位 当你计算平均值的时候 不能把那些非法的数据算在内 输入格
  • 云计算基础入门

    文章目录 前言 一 大数据 1 大数据技术 基础技术 2 大数据技术的产生 3 大数据 4 大数据对科学研究产生的影响 第四范式 四种范式 5 大数据的4V特征 二 云计算 1 云计算模式 2 云计算定义 2 云计算的主要服务模式 3 三种
  • 【MySQL中对表的常见操作】 —— 第四天

    1 删除表的基础语法 drop table 表名 普通删除 drop table if exists 表名 先判断该表是否存在 2 向表中插入数据的基础语法 insert into 表名 字段1 字段2 字段n values 字段值 字段值
  • Python中的包管理方法

    在Python开发中 包管理与依赖问题一直是开发者头疼的问题之一 随着项目规模的增大和复杂性的增加 管理各种依赖包和解决版本冲突变得尤为重要 本文将分享解决Python中的包管理与依赖问题的方法和工具 帮助开发者更好地管理项目中的依赖关系
  • 单片机c语言的指针,单片机C语言指针的指针

    指针的指针 一个指针变量内部可以存储一个值 这个值是另外一个对象的地址 所以我们说一个指针变量可以指向一个普通变量 同样这个指针变量也有一个地址 也就是 说有一个东西可以指向这个指针变量 然后再通过这个指针变量指向这个对象 那么如何来指向这
  • 右值引用 右值 左值和 左值引用

    首先注意lvalue 和rvalue 中的l r 不是 left和right 而是 l locator value 可以寻址的数据 明确一定是一个地址容纳一个数据 可以在该条语句后面再找到这个值 r read value 不可寻址数据或者用
  • FileZilla出现Failed to convert command to 8 bit charset 

    FileZilla这款FTP客户端软件 自从华哥使用以来 采用其默认的设置 一直用得很顺畅 没有出现过什么问题 但是今天碰到了一个问题 如图 错误信息为 Failed to convert command to 8 bit charset
  • linux 常用指令

    发布java jar程序 后台运行 输出日志文件 nohup java jar jar gt log log 列出后台执行的作业 jobs 列出作业 fg 123 将编号为123的作业调回前台 查看端口占用的线程的pid netstat n
  • Android MediaPlayer播放本地音频

    reference Android 第一行代码 MediaPlayer类常用的方法 setDataSource 设置要播放的音频文件的路径 prepare 开始播放之前调用这个方法完成准备工作 start 开始或继续播放 pause 暂停播
  • 基于SSM的图书馆借阅管理系统

    全网粉丝20W csdn特邀作者 博客专家 CSDN新星计划导师 java领域优质创作者 博客之星 掘金 华为云 阿里云 InfoQ等平台优质作者 专注于Java技术领域和毕业项目实战 文末获取项目下载方式 一 项目背景介绍 随着社会的发展
  • 重新梳理DeepFaceLab(DeepFake)最近动态:简要且全面的信息

    DeepFaceLab相关文章 一 简单介绍DeepFaceLab DeepFake 的使用以及容易被忽略的事项 二 继续聊聊DeepFaceLab DeepFake 不断演进的2 0版本 三 如何翻译DeepFaceLab DeepFak
  • 外置USB供电与内置锂电池供电自动切换电路

    外置USB供电与内置锂电池供电自动切换电路 便携电子设备常用 经典电路必须掌握 本文要分析的电路 很多内置有锂电池的便携电子设备 比如手机 通常采用这样的供电方式 1 没有插入USB电源时 使用内置的锂电池供电 2 当插入USB电源时 切换
  • JAVA体系书籍大全

    二哥 能不能给一套 Java 电子书的链接啊 最好是成体系的 我现在就想好好的学习 感觉和公司的一些同事差距有点大 想追赶上 纸质书有点沉 天天带在手边很不方便 尤其是上下班坐地铁的时候 都感觉看纸质书不太好意思 电子书不仅携带方便 还能不
  • 安装Tensorflow教程

    安装Tensorflow教程 1 环境要求 pychon3 5 可以在cmd下查看python3版本号 要求必须是3 5以及以上 python3 version Python 3 9 8 2 anaconda安装 打开anaconda en
  • Pyqt5 在线/离线安装教程

    在线安装 在线安装很简单 两行命令搞定 pip3 install PyQt5 pip install PyQt5 tools 如果访问外网不是很顺畅建议使用豆瓣的镜像下载 pip install PyQt5 i https pypi dou
  • window.open完美替代window.showModalDialog

    var url http www baidu com var name 百度 var iWidth 1100 弹窗宽度 var iHeight 700 弹窗高度 var iTop window screen availHeight 30 i
  • 组件化学习-3-源码分析ARouter

    之前我们学习了Arouter的使用 今天分析下源码实现原理 主要分3步 生成路由表 加载路由表 使用路由表 生成路由表 RouteProcessor负责生产路由表 ARouter框架使用编译时注解工具 Annotation Processi
  • 【项目:坦克大战】

    v1 25 新增功能 1 音效的处理 import pygame time random display pygame display COLOR BLACK pygame Color 0 0 0 COLOR RED pygame Colo