• python17(pygame)


    安装pygame

    在cmd或者pycharm终端输入

    pip install pygame
    
    • 1

    卸载:

    pip uninstall pygame
    
    • 1

    坦克大战项目

    1、分析需求

    坦克大战游戏的需求
    1、项目中有那些类
    2、每个类中有哪些方法

    (1)坦克类(我方坦克,敌方坦克)
    射击
    移动类
    显示坦克的方法

    (2)子弹类
    移动
    显示子弹的方法

    (3)墙壁类
    属性:是否可以通过(子弹,坦克)

    (4)爆炸效果类
    展示爆炸效果

    (5)音效类
    播放音乐

    (6)主类
    开始游戏
    结束游戏

    2、搭建框架

    class MainGame():
        def __init__(self):
            pass
        # 开始游戏
        def startGame(self):
            pass
        # 结束游戏
        def endGame(self):
            pass
    
    class Tank():
        def __init__(self):
            pass
        #移动
        def move(self):
            pass
    
        #射击
        def shot(self):
            pass
        # 展示坦克的方法
        def dispalyTank(self):
            pass
    #我方坦克
    class MyTank(Tank):
        def __init__(self):
            pass
    #敌方坦克
    class EnemyTank(Tank):
        def __init__(self):
            pass
    #子弹类
    class Bullet():
        def __init__(self):
            pass
        #移动
        def move(self):
            pass
        #展示子弹的方法
        def displayBullet(self):
            pass
    #墙壁
    class Wall():
        def __init__(self):
            pass
        #展示墙壁的方法
        def displayWall(self):
            pass
    
    class Explode():
        def __init__(self):
            pass
        # 展示爆炸效果的方法
        def displayExplode(self):
            pass
    class Music():
        def __init__(self):
            pass
        #播放音乐
        def startMusic(self):
            pass
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61

    可查看需要调用哪些

    https://www.pygame.org/docs.html

    3、加载主窗口

    用到
    pygame.display.init()
    pygame.display.set_mode(宽度,高度)

    class MainGame():
        window=None
        def __init__(self):
            pass
        # 开始游戏
        def startGame(self):
            #加载主窗口
            #先初始化窗口
            pygame.display.init()
            #设置窗口的大小以及显示,调用pygame.display.set_mode(宽度,高度)
            MainGame.window=pygame.display.set_mode([SCREEN_WIDTH,SCREEN_HEIGHT])
            
            #由于调用仅显示一次,所以循环调用
            while True:
                #给窗口设置填充色
                MainGame.window.fill(BG_COLOR)
                pygame.display.update()
            pass
            # 设置窗口标题
            pygame.display.set_caption('坦克大战')
        # 结束游戏
        def endGame(self):
            pass
    if __name__=='__main__':
        MainGame().startGame()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    4、事件处理

    #coding:gbk
    '''
    新增功能:
        添加事件
        1、点击关闭,关闭窗口
        2、按下键盘,判断键盘按下的是什么键,分别对不同的键做处理
    
    '''
    #导入pygame模块
    import pygame
    SCREEN_WIDTH=700
    SCREEN_HEIGHT=500
    BG_COLOR=pygame.Color(0,52,50)
    class MainGame():
        window=None
        def __init__(self):
            pass
        # 开始游戏
        def startGame(self):
            #加载主窗口
            #初始化窗口
            pygame.display.init()
            #设置窗口的大小以及显示
            MainGame.window=pygame.display.set_mode([SCREEN_WIDTH,SCREEN_HEIGHT])
            #由于调用仅显示一次,所以循环调用
    
            while True:
                #给窗口设置填充色
                MainGame.window.fill(BG_COLOR)
                #获取事件
                self.getEvent()
                pygame.display.update()
    
                # 设置窗口标题
                pygame.display.set_caption("坦克大战")
        # 结束游戏
        def endGame(self):
            print('谢谢使用,欢迎再次使用')
            exit()
    
        #获取事件
        def getEvent(self):
            #获取所有事件
            eventList=pygame.event.get()
            #遍历事件
            for event in eventList:
                #判断按下的键是关闭还是键盘按下
    
                #如果点击的是退出,关闭窗口
                if event.type==pygame.QUIT:
                    self.endGame()
                #如果是键盘的下键
                if event.type==pygame.KEYDOWN:
                    #判断按下的是上、下、左、右
                    if event.key==pygame.K_LEFT:
                        print("按下左键,坦克向左自动")
                    elif event.key==pygame.K_RIGHT:
                        print("按下右键,坦克向右自动")
                    elif event.key==pygame.K_UP:
                        print("按下上键,坦克向上自动")
                    elif event.key == pygame.K_DOWN:
                        print("按下下键,坦克向下自动")
    
    class Tank():
        def __init__(self):
            pass
        #移动
        def move(self):
            pass
    
        #射击
        def shot(self):
            pass
        # 展示坦克的方法
        def dispalyTank(self):
            pass
    #我方坦克
    class MyTank(Tank):
        def __init__(self):
            pass
    #敌方坦克
    class EnemyTank(Tank):
        def __init__(self):
            pass
    #子弹类
    class Bullet():
        def __init__(self):
            pass
        #移动
        def move(self):
            pass
        #展示子弹的方法
        def displayBullet(self):
            pass
    #墙壁
    class Wall():
        def __init__(self):
            pass
        #展示墙壁的方法
        def displayWall(self):
            pass
    
    class Explode():
        def __init__(self):
            pass
        # 展示爆炸效果的方法
        def displayExplode(self):
            pass
    class Music():
        def __init__(self):
            pass
        #播放音乐
        def startMusic(self):
            pass
    if __name__=='__main__':
        MainGame().startGame()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116

    在这里插入图片描述

    5、pygame文字绘制

    1.首先初始化字体
    2.利用pygame.font.Sysfont(样式,size)获取字体的对象
    3.利用font.render()设置字体

    #左上角文字的绘制
        def getTextSurface(self,text):
            #初始化字体模块
            pygame.init()
            pygame.font.init()
            #查看所有的字体名称
            # print(pygame.font.get_fonts())
    
            #获取字体font对象
            Font=pygame.font.SysFont("kaiti",20)
            #绘制文字信息
            textSurface=Font.render(text,True,TEXT_COLOR)
            return textSurface
    MainGame.window.blit(self.getTextSurface('敌方坦克剩余数量%d'%6),(10,10))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    6、显示我方坦克

    class Tank():
        #添加距离左边left,距离上边top
        def __init__(self,left,top):
            #保存加载的图片
            self.images={'U':pygame.image.load("D:\桌面\Python\project01\img\p1tankU.gif"),
                         'D':pygame.image.load("D:\桌面\Python\project01\img\p1tankD.gif"),
                         'E':pygame.image.load("D:\桌面\Python\project01\img\p1tankL.gif"),
                         'R':pygame.image.load("D:\桌面\Python\project01\img\p1tankR.gif"),}
    
            #方向
            self.direction='U'
            #根据当前图片的方向,获取当前的图片
            self.image=self.images[self.direction]
            #根据图片获取区域
            self.rect=self.image.get_rect()
            #设置区域left和top
            self.rect.left=left
            self.rect.top=top
            
    	def dispalyTank(self):
            #获取展示的对象
            self.image=self.images[self.direction]
            #调用blit方法展示
            MainGame.window.blit(self.image,self.rect)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    7、设置坦克的移动

    设置方向键更改图片,给坦克加一个速度,设置方向键调整坦克位置

    class Tank():
        #添加距离左边left,距离上边top
        def __init__(self,left,top):
            #保存加载的图片
            self.images={'U':pygame.image.load("D:\桌面\Python\project01\img\p1tankU.gif"),
                         'D':pygame.image.load("D:\桌面\Python\project01\img\p1tankD.gif"),
                         'L':pygame.image.load("D:\桌面\Python\project01\img\p1tankL.gif"),
                         'R':pygame.image.load("D:\桌面\Python\project01\img\p1tankR.gif"),}
    
            #方向
            self.direction='U'
            #根据当前图片的方向,获取当前的图片
            self.image=self.images[self.direction]
            #根据图片获取区域
            self.rect=self.image.get_rect()
            #设置区域left和top
            self.rect.left=left
            self.rect.top=top
            #速度,决定移动的快慢
            self.speed=10
    
        #移动
        def move(self):
            #判断坦克的方向进行移动
            if self.direction=='L':
                self.rect.left-=self.speed
            elif self.direction=='U':
                self.rect.top-=self.speed
            elif self.direction=='D':
                self.rect.top+=self.speed
            elif self.direction == 'R':
                self.rect.left += self.speed
    
        
        # 展示坦克的方法
        def dispalyTank(self):
            #获取展示的对象 
            self.image=self.images[self.direction]
            #调用blit方法展示
            MainGame.window.blit(self.image,self.rect)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40

    在这里插入图片描述

    8、移动优化

    class Tank():
        #添加距离左边left,距离上边top
        def __init__(self,left,top):
            #保存加载的图片
            self.images={'U':pygame.image.load("D:\桌面\Python\project01\img\p1tankU.gif"),
                         'D':pygame.image.load("D:\桌面\Python\project01\img\p1tankD.gif"),
                         'L':pygame.image.load("D:\桌面\Python\project01\img\p1tankL.gif"),
                         'R':pygame.image.load("D:\桌面\Python\project01\img\p1tankR.gif"),}
    
            #方向
            self.direction='U'
            #根据当前图片的方向,获取当前的图片
            self.image=self.images[self.direction]
            #根据图片获取区域
            self.rect=self.image.get_rect()
            #设置区域left和top
            self.rect.left=left
            self.rect.top=top
            #速度,决定移动的快慢
            self.speed=5
            #坦克移动的开关
            self.stop=True
    
        #移动
        def move(self):
            #判断坦克的方向进行移动
            if self.direction=='L':
                if self.rect.left > 0:
                    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<SCREEN_HEIGHT:
                    self.rect.top+=self.speed
            elif self.direction == 'R':
                if self.rect.left+self.rect.height<SCREEN_WIDTH:
                    self.rect.left += self.speed
    class MainGame():
        window=None
        my_tank=None 
            def startGame(self):
            #加载主窗口
            #初始化窗口
            pygame.display.init()
            #设置窗口的大小以及显示
            MainGame.window=pygame.display.set_mode([SCREEN_WIDTH,SCREEN_HEIGHT])
           #初始化我方坦克
            MainGame.my_tank=Tank(350,250)
            # 设置窗口标题
            pygame.display.set_caption("坦克大战")
            #由于调用仅显示一次,所以循环调用
            while True:
                #让循环执行的慢一点
                time.sleep((0.03))
                #给窗口设置填充色
                MainGame.window.fill(BG_COLOR)
                #获取事件
                self.getEvent()
    
                #绘制文字
                MainGame.window.blit(self.getTextSurface('敌方坦克剩余数量%d'%6),(10,10))
                #调用坦克显示的方法
                MainGame.my_tank.dispalyTank()
                #调用移动方法
                #如果坦克的开关开启,才可以移动
                if not MainGame.my_tank.stop:
                    MainGame.my_tank.move()
                pygame.display.update()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69

    9、显示敌方坦克

    利用random随机生成敌方坦克方向

    #coding:utf-8
    '''
    新增功能:
        1、完善敌方坦克初始化方法
        2、创建敌方坦克并展示
    
    '''
    
    class MainGame():
        window=None
        my_tank=None
        #创建存储敌方坦克的列表
        enemyTankList=[]
    
        #定义敌方坦克的数量
        enemyTankCount=5
        
            while True:
                #让循环执行的慢一点
                time.sleep((0.03))
                #给窗口设置填充色
                MainGame.window.fill(BG_COLOR)
                #获取事件
                self.getEvent()
    
                #绘制文字
                MainGame.window.blit(self.getTextSurface('敌方坦克剩余数量%d'%6),(10,10))
                #调用坦克显示的方法
                MainGame.my_tank.displayTank()
                #循环遍历敌方坦克列表,展示敌方坦克
                self.blitEnemyTank()
                #调用移动方法
                #如果坦克的开关开启,才可以移动
                if not MainGame.my_tank.stop:
                    MainGame.my_tank.move()
                pygame.display.update()
        #初始化敌方坦克, 并将敌方坦克添加到列表
        def createEnemyTank(self):
            top=100
            #循环生成敌方坦克
            for i in range(MainGame.enemyTankCount):
                left=random.randint(0,600)
                speed=random.randint(1,4)
                enemy=EnemyTank(left,top,speed)
                MainGame.enemyTankList.append(enemy)
    
        # 循环遍历敌方坦克列表,展示敌方坦克
        def blitEnemyTank(self):
            for enemyTank in MainGame.enemyTankList:
                enemyTank.displayTank()
    # 结束游戏
        def endGame(self):
            print('谢谢使用,欢迎再次使用')
            exit()
    
        #获取事件
        def getEvent(self):
            #获取所有事件
            eventList=pygame.event.get()
            #遍历事件
            for event in eventList:
                #判断按下的键是关闭还是键盘按下
    
                #如果点击的是退出,关闭窗口
                if event.type==pygame.QUIT:
                    self.endGame()
                #如果是键盘的下键
                if event.type==pygame.KEYDOWN:
                    #判断按下的是上、下、左、右
                    if event.key==pygame.K_LEFT:
                        #切换方向
                        MainGame.my_tank.direction='L'
                        #修改坦克的开关状态
                        MainGame.my_tank.stop=False
                        # MainGame.my_tank.move()
                        print("按下左键,坦克向左自动")
                    elif event.key==pygame.K_RIGHT:
                        MainGame.my_tank.direction = 'R'
                        MainGame.my_tank.stop=False
                        # MainGame.my_tank.move()
                        print("按下右键,坦克向右自动")
                    elif event.key==pygame.K_UP:
                        MainGame.my_tank.direction = 'U'
                        MainGame.my_tank.stop=False
                        # MainGame.my_tank.move()
                        print("按下上键,坦克向上自动")
                    elif event.key == pygame.K_DOWN:
                        MainGame.my_tank.direction = 'D'
                        MainGame.my_tank.stop=False
                        # MainGame.my_tank.move()
                        print("按下下键,坦克向下自动")
                    elif event.key==pygame.K_SPACE:
                        print("发射子弹")
    
                #松开方向键,停止移动,修改坦克开关状态
                if event.type==pygame.KEYUP:
                    #判断松开的键是上 下 左、右
                    if event.key==pygame.K_UP or event.key==pygame.K_DOWN or event.key==pygame.K_LEFT or event.key==pygame.K_RIGHT:
                        MainGame.my_tank.stop=True
    
    class Tank():
        # 展示坦克的方法
        def displayTank(self):
            #获取展示的对象
            self.image=self.images[self.direction]
            #调用blit方法展示
            MainGame.window.blit(self.image,self.rect)
    
    #敌方坦克
    class EnemyTank(Tank):
        def __init__(self,left,top,speed):
            #加载图片集
            self.images={
                'U': pygame.image.load("D:\桌面\Python\project01\img\enemy1U.gif"),
                'D': pygame.image.load("D:\桌面\Python\project01\img\enemy1D.gif"),
                'L': pygame.image.load("D:\桌面\Python\project01\img\enemy1L.gif"),
                'R': pygame.image.load("D:\桌面\Python\project01\img\enemy1R.gif"),
            }
            #方向,随机生成敌方坦克
            self.direction=self.randDirection()
            #根据方向获取图片
            self.image=self.images[self.direction]
            #区域
            self.rect=self.image.get_rect()
            #对left和top赋值
            self.rect.left=left
            self.rect.top=top
            #速度
            self.speed=speed
            #移动开关
            self.flag=True
        #随机生成敌方坦克
        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()
    
    if __name__=='__main__':
        MainGame().startGame()
        MainGame().getTextSurface()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148

    在这里插入图片描述

    TankAll

    # coding:utf-8
    
    # 导入pygame模块
    import pygame, time, random
    import pygame.freetype
    # 导入pygame模块
    import pygame
    import pygame.freetype
    import time
    from pygame.sprite import Sprite
    
    SCREEN_WIDTH = 700
    SCREEN_HEIGHT = 500
    
    BG_COLOR = pygame.Color(0, 0, 0)
    TEXT_COLOR = pygame.Color(255, 0, 0)
    screen = pygame.display.set_mode((700, 500))
    
    
    # 定义一个基类
    class BaseItem(Sprite):
        def __init__(self, color, width, height):
            pygame.sprite.Sprite.__init__(self)
    
    
    class MainGame():
        window = None
        my_tank = None
        # 创建存储敌方坦克的列表
        enemyTankList = []
    
        # 定义敌方坦克的数量
        enemyTankCount = 5
        myTankDiedCount=0
        # 存储我方子弹的列表
        myBulletList = []
        # 存储敌方子弹的列表
        enemyBulletList = []
        # 存储爆炸效果的列表
        explodeList = []
        #存储墙壁的列表
        wallList=[]
    
        def __init__(self):
            pass
    
        # 开始游戏
        def startGame(self):
            # 加载主窗口
            # 初始化窗口
            pygame.display.init()
            # 设置窗口的大小以及显示
            MainGame.window = pygame.display.set_mode([SCREEN_WIDTH, SCREEN_HEIGHT])
            # 初始化我方坦克
            self.createmyTank()
            # 初始化敌方坦克,并将敌方坦克添加到列表
            self.createEnemyTank()
            #初始化墙壁
            self.createWall()
            # 设置窗口标题
            pygame.display.set_caption("坦克大战")
            # 由于调用仅显示一次,所以循环调用
            while True:
                # 让循环执行的慢一点
                time.sleep((0.03))
                # 给窗口设置填充色
                MainGame.window.fill(BG_COLOR)
                # 获取事件
                self.getEvent()
                # 绘制文字
                MainGame.window.blit(self.getTextSurface('敌方坦克剩余数量%d' % len(MainGame.enemyTankList)), (10, 10))
                MainGame.window.blit(self.getTextSurface('死亡次数%d' % MainGame.myTankDiedCount), (500, 10))
                # 调用坦克显示的方法
                #添加判断我方坦克是否是存活
                if MainGame.my_tank and MainGame.my_tank.live:
                    MainGame.my_tank.displayTank()
                else:
                    #删除我方坦克
                    del MainGame.my_tank
                    MainGame.my_tank=None
                # 循环遍历敌方坦克列表,展示敌方坦克
                self.blitEnemyTank()
                # 循环遍历我方坦克的子弹
                self.blitMyBullet()
                # 循环遍历敌方子弹列表,展示敌方子弹
                self.blitEnemyBullet()
                #循环遍历墙壁列表,展示墙壁
                self.blitWall()
                # 循环遍历爆炸列表,展示爆炸效果
                self.blitExplode()
                # 调用移动方法
                # 如果坦克的开关开启,才可以移动
                if MainGame.my_tank and MainGame.my_tank.live:
                    if not MainGame.my_tank.stop:
                        MainGame.my_tank.move()
                        #检测我方坦克是否与墙壁发生碰撞
                        MainGame.my_tank.hitWall()
                        #检查我方坦克是否与敌方坦克发生碰撞
                        MainGame.my_tank.myTank_hit_enemyTank()
                pygame.display.update()
    
        # 循环遍历墙壁列表,展示墙壁
        def blitWall(self):
            for wall in MainGame.wallList:
                #调用墙壁的显示方法
                wall.displayWall()
        #初始化墙壁
        def createWall(self):
            for i in range(6):
                #初始化墙壁
                wall=Wall(i*130,220)
                #将墙壁添加到列表中
                MainGame.wallList.append(wall)
        #创建我方坦克的方法
        def createmyTank(self):
            MainGame.my_tank=MyTank(350,280)
        # 初始化敌方坦克, 并将敌方坦克添加到列表
        def createEnemyTank(self):
            top = 100
            # 循环生成敌方坦克
            for i in range(MainGame.enemyTankCount):
                left = random.randint(0, 600)
                speed = random.randint(1, 4)
                enemy = EnemyTank(left, top, speed)
                MainGame.enemyTankList.append(enemy)
    
        # 循环遍历敌方坦克列表,展示敌方坦克
        def blitEnemyTank(self):
            for enemyTank in MainGame.enemyTankList:
                # 判断当前敌方坦克是否或者
                if enemyTank.live:
                    enemyTank.displayTank()
                    enemyTank.randMove()
                    #调用检测是否与墙壁碰撞
                    enemyTank.hitWall()
                    #检测敌方坦克是否与我方坦克碰撞
                    if MainGame.my_tank and MainGame.my_tank.live:
                        enemyTank.enemyTank_hit_myTank()
                    # 发射子弹
                    enemyBullet = enemyTank.shot()
                    # 敌方子弹是否为None,如果不为None,则添加到敌方子弹列表中
                    if enemyBullet:
                        # 将敌方子弹存储到敌方子弹列表中
                        MainGame.enemyBulletList.append(enemyBullet)
                else:  # 死亡,从敌方坦克列表中删除
                    MainGame.enemyTankList.remove(enemyTank)
    
        # 循环遍历我方子弹存贮列表
        def blitMyBullet(self):
            for myBullet in MainGame.myBulletList:
                # 判断当前子弹是否碰到墙壁
                if myBullet.live:
                    myBullet.displayBullet()
                    # 调用子弹的移动方法
                    myBullet.move()
                    # 调用检查我方子弹是否和敌方坦克发生碰撞
                    myBullet.myBullet_hit_enemyTank()
                    #检测我方子弹是否与墙壁碰撞
                    myBullet.hitWall()
    
                # 碰到墙壁删除
                else:
                    MainGame.myBulletList.remove(myBullet)
    
        # 循环遍历敌方子弹列表
        def blitEnemyBullet(self):
            for enemyBullet in MainGame.enemyBulletList:
                if enemyBullet.live:  # 判断敌方子弹是否存活
                    enemyBullet.displayBullet()
                    enemyBullet.move()
                    #调用敌方子弹与我方坦克碰撞的方法
                    enemyBullet.enemyBullet_hit_myTank()
                    #检测敌方子弹是否与墙壁碰撞
                    enemyBullet.hitWall()
    
    
                else:
                    MainGame.enemyBulletList.remove(enemyBullet)
    
        # 左上角文字的绘制
        def getTextSurface(self, text):
            # 初始化字体模块
            pygame.init()
            pygame.font.init()
            # 查看所有的字体名称
            # print(pygame.font.get_fonts())
    
            # 获取字体font对象
            Font = pygame.font.SysFont("kaiti", 20)
            # 绘制文字信息
            textSurface = Font.render(text, True, TEXT_COLOR)
            return textSurface
    
        # 循环展示爆炸效果
        def blitExplode(self):
            for explode in MainGame.explodeList:
                if explode.live:
                    # 展示
                    explode.displayExplode()
                else:
                    # 在爆炸列表中移除
                    MainGame.explodeList.remove(explode)
    
        # 结束游戏
        def endGame(self):
            print('谢谢使用,欢迎再次使用')
            exit()
    
        # 获取事件
        def getEvent(self):
            # 获取所有事件
            eventList = pygame.event.get()
            # 遍历事件
            for event in eventList:
                # 判断按下的键是关闭还是键盘按下
    
                # 如果点击的是退出,关闭窗口
                if event.type == pygame.QUIT:
                    self.endGame()
                # 如果是键盘的下键
                if event.type == pygame.KEYDOWN:
                    # 当坦克不存在时
                    if not MainGame.my_tank:
                        #判断按下的时Esc键,让坦克重生
                        if event.key==pygame.K_ESCAPE:
                            #让我方坦克重生及调用创建坦克的方法
                            self.createmyTank()
                            MainGame.myTankDiedCount+=1
                    if MainGame.my_tank and MainGame.my_tank.live:
                       # 判断按下的是上、下、左、右
                        if event.key == pygame.K_LEFT:
                               # 切换方向
                            MainGame.my_tank.direction = 'L'
                               # 修改坦克的开关状态
                            MainGame.my_tank.stop = False
                               # MainGame.my_tank.move()
                            print("按下左键,坦克向左自动")
                        elif event.key == pygame.K_RIGHT:
                            MainGame.my_tank.direction = 'R'
                            MainGame.my_tank.stop = False
                               # MainGame.my_tank.move()
                            print("按下右键,坦克向右自动")
                        elif event.key == pygame.K_UP:
                            MainGame.my_tank.direction = 'U'
                            MainGame.my_tank.stop = False
                               # MainGame.my_tank.move()
                            print("按下上键,坦克向上自动")
                        elif event.key == pygame.K_DOWN:
                            MainGame.my_tank.direction = 'D'
                            MainGame.my_tank.stop = False
                               # MainGame.my_tank.move()
                            print("按下下键,坦克向下自动")
                        elif event.key == pygame.K_SPACE:
                            print("发射子弹")
                               # 如果我方子弹列表<3才可以创建子弹
                            if len(MainGame.myBulletList) <= 3:
                                   # 创建我方坦克发射的子弹
                                myBullet = Bullet(MainGame.my_tank)
                                MainGame.myBulletList.append(myBullet)
    
                # 松开方向键,停止移动,修改坦克开关状态
                if event.type == pygame.KEYUP:
                    # 判断松开的键是上 下 左、右
                    if event.key == pygame.K_UP or event.key == pygame.K_DOWN or event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT:
                        if MainGame.my_tank and MainGame.my_tank.live:
                            MainGame.my_tank.stop = True
    
    
    class Tank(BaseItem):
        # 添加距离左边left,距离上边top
        def __init__(self, left, top):
            # 保存加载的图片
            self.images = {'U': pygame.image.load("D:\桌面\Python\project01\img\p1tankU.gif"),
                           'D': pygame.image.load("D:\桌面\Python\project01\img\p1tankD.gif"),
                           'L': pygame.image.load("D:\桌面\Python\project01\img\p1tankL.gif"),
                           'R': pygame.image.load("D:\桌面\Python\project01\img\p1tankR.gif"), }
    
            # 方向
            self.direction = 'U'
            # 根据当前图片的方向,获取当前的图片
            self.image = self.images[self.direction]
            # 根据图片获取区域
            self.rect = self.image.get_rect()
            # 设置区域left和top
            self.rect.left = left
            self.rect.top = top
            # 速度,决定移动的快慢
            self.speed = 5
            # 坦克移动的开关
            self.stop = True
            # 是否活着
            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 == 'U':
                if self.rect.top > 0:
                    self.rect.top -= self.speed
            elif self.direction == 'D':
                if self.rect.top + self.rect.height < SCREEN_HEIGHT:
                    self.rect.top += self.speed
            elif self.direction == 'R':
                if self.rect.left + self.rect.height < SCREEN_WIDTH:
                    self.rect.left += self.speed
    
        # 射击
        def shot(self):
            return Bullet(self)
        def stay(self):
            self.rect.left=self.oldLeft
            self.rect.top=self.oldTop
        #检测坦克是否与墙壁发生碰撞
        def hitWall(self):
            for wall in MainGame.wallList:
                if pygame.sprite.collide_rect(self,wall):
                    #将坐标设置为移动之前的坐标
                    self.stay()
        # 展示坦克的方法
        def displayTank(self):
            # 获取展示的对象
            self.image = self.images[self.direction]
            # 调用blit方法展示
            MainGame.window.blit(self.image, self.rect)
    
    
    # 我方坦克
    class MyTank(Tank):
        def __init__(self,left,top):
            super(MyTank, self).__init__(left,top)
        #检测我方坦克和敌方坦克发生碰撞
        def myTank_hit_enemyTank(self):
            #循环遍历敌方坦克列表
            for enemyTank in MainGame.enemyTankList:
                if pygame.sprite.collide_rect(self,enemyTank):
                    self.stay()
    
    # 敌方坦克
    class EnemyTank(Tank):
        def __init__(self, left, top, speed):
            # 调用父类的初始化方法
            super(EnemyTank, self).__init__(left, top)
            # 加载图片集
            self.images = {
                'U': pygame.image.load("D:\桌面\Python\project01\img\enemy1U.gif"),
                'D': pygame.image.load("D:\桌面\Python\project01\img\enemy1D.gif"),
                'L': pygame.image.load("D:\桌面\Python\project01\img\enemy1L.gif"),
                'R': pygame.image.load("D:\桌面\Python\project01\img\enemy1R.gif"),
            }
            # 方向,随机生成敌方坦克
            self.direction = self.randDirection()
            # 根据方向获取图片
            self.image = self.images[self.direction]
            # 区域
            self.rect = self.image.get_rect()
            # 对left和top赋值
            self.rect.left = left
            self.rect.top = top
            # 速度
            self.speed = speed
            # 移动开关
            self.flag = True
            # 新增一个步数变量,step
            self.step = 20
        #敌方坦克与我方坦克是否发生碰撞
        def enemyTank_hit_myTank(self):
            if pygame.sprite.collide_rect(self,MainGame.my_tank):
                self.stay()
    
        # 随机生成敌方坦克
        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 = random.randint(20, 60)
            else:
                self.move()
                # 让步数递减
                self.step -= 1
    
        def shot(self):
            # 随机生成100以内的数
            num = random.randint(1, 100)
            if num < 3:
                return Bullet(self)
    
    
    # 子弹类
    class Bullet(BaseItem):
        def __init__(self, tank):
            # 加载图片
            self.image = pygame.image.load("D:\桌面\Python\project01\img\enemymissile.gif")
            # 坦克的方向决定子弹的方向
            self.direction = tank.direction
            # 获取区域
            self.rect = self.image.get_rect()
            # 子弹的left和top与方向有关
            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 = 8
            # 子弹的状态,碰到墙壁消失
            self.live = True
    
        # 移动
        def move(self):
            if self.direction == 'U':
                if self.rect.top > 0:
                    self.rect.top -= self.speed
                else:
                    self.live = False
            elif self.direction == 'R':
                if self.rect.left + self.rect.width < SCREEN_WIDTH:
                    self.rect.left += self.speed
                else:
                    self.live = False
            elif self.direction == 'D':
                if self.rect.top + self.rect.height < SCREEN_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
    
        #子弹是否碰撞墙壁
        def hitWall(self):
            #循环遍历墙壁列表
            for wall in MainGame.wallList:
                #判断墙壁是否存活
                if wall.live:
                    #调用墙壁的显示方法
                    wall.displayWall()
                else:
                    #从列表中移除
                    MainGame.wallList.remove(wall)
                if pygame.sprite.collide_rect(self,wall):
                    #让子弹消失
                    self.live=False
                    #墙壁的生命值减少
                    wall.hp-=1
                    if wall.hp<=0:
                        #修改墙壁的状态
                        wall.live=False
    
        # 展示子弹的方法
        def displayBullet(self):
            MainGame.window.blit(self.image, self.rect)
    
        # 我方子弹和敌方的坦克的碰撞
        def myBullet_hit_enemyTank(self):
            # 循环遍历敌方坦克列表,判断是否发生碰撞
            for enemyTank in MainGame.enemyTankList:
                if pygame.sprite.collide_rect(enemyTank,self):
                    # 修改敌方坦克和我方子弹的状态
                    enemyTank.live = False
                    self.live = False
                    # 创建爆炸对象
                    explode = Explode(enemyTank)
                    # 将爆炸对象添加到爆炸列表中
                    MainGame.explodeList.append(explode)
    
        def enemyBullet_hit_myTank(self):
            if MainGame.my_tank and MainGame.my_tank.live:
                if pygame.sprite.collide_rect(MainGame.my_tank, self):
                    # 产生爆炸对象
                    explode = Explode(MainGame.my_tank)
                    # 将对象添加到爆炸列表中
                    MainGame.explodeList.append(explode)
                    # 修改敌方子弹与我方坦克的状态
                    self.live = False
                    MainGame.my_tank.live = False
    # 墙壁
    class Wall():
        def __init__(self,left,top):
            #加载图片
            self.image=pygame.image.load("D:\桌面\Python\project01\img\steels.gif")
            #获取墙壁的区域
            self.rect=self.image.get_rect()
            #设置位置,left。top
            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 Explode():
        def __init__(self, tank):
            # 爆炸的位置由当前子弹打中的坦克位置决定
            self.rect = tank.rect
            self.images = [
                pygame.image.load("D:\桌面\Python\project01\img//blast0.gif"),
                pygame.image.load("D:\桌面\Python\project01\img//blast1.gif"),
                pygame.image.load("D:\桌面\Python\project01\img//blast2.gif"),
                pygame.image.load("D:\桌面\Python\project01\img//blast3.gif"),
                pygame.image.load("D:\桌面\Python\project01\img//blast4.gif"),
            ]
            self.step = 0
            self.image = self.images[self.step]
            # 是否或者
            self.live = True
    
        # 展示爆炸效果的方法
        def displayExplode(self):
            if self.step < len(self.images):
                # 根据索引获取爆炸对象
                self.image = self.images[self.step]
                self.step += 1
                # 添加到主窗口
                MainGame.window.blit(self.image, self.rect)
            else:
                # 修改活着的状态
                self.live = False
                self.step = 0
    
    
    class Music():
        def __init__(self):
            pass
    
        # 播放音乐
        def startMusic(self):
            pass
    
    
    if __name__ == '__main__':
        MainGame().startGame()
        MainGame().getTextSurface()
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149
    • 150
    • 151
    • 152
    • 153
    • 154
    • 155
    • 156
    • 157
    • 158
    • 159
    • 160
    • 161
    • 162
    • 163
    • 164
    • 165
    • 166
    • 167
    • 168
    • 169
    • 170
    • 171
    • 172
    • 173
    • 174
    • 175
    • 176
    • 177
    • 178
    • 179
    • 180
    • 181
    • 182
    • 183
    • 184
    • 185
    • 186
    • 187
    • 188
    • 189
    • 190
    • 191
    • 192
    • 193
    • 194
    • 195
    • 196
    • 197
    • 198
    • 199
    • 200
    • 201
    • 202
    • 203
    • 204
    • 205
    • 206
    • 207
    • 208
    • 209
    • 210
    • 211
    • 212
    • 213
    • 214
    • 215
    • 216
    • 217
    • 218
    • 219
    • 220
    • 221
    • 222
    • 223
    • 224
    • 225
    • 226
    • 227
    • 228
    • 229
    • 230
    • 231
    • 232
    • 233
    • 234
    • 235
    • 236
    • 237
    • 238
    • 239
    • 240
    • 241
    • 242
    • 243
    • 244
    • 245
    • 246
    • 247
    • 248
    • 249
    • 250
    • 251
    • 252
    • 253
    • 254
    • 255
    • 256
    • 257
    • 258
    • 259
    • 260
    • 261
    • 262
    • 263
    • 264
    • 265
    • 266
    • 267
    • 268
    • 269
    • 270
    • 271
    • 272
    • 273
    • 274
    • 275
    • 276
    • 277
    • 278
    • 279
    • 280
    • 281
    • 282
    • 283
    • 284
    • 285
    • 286
    • 287
    • 288
    • 289
    • 290
    • 291
    • 292
    • 293
    • 294
    • 295
    • 296
    • 297
    • 298
    • 299
    • 300
    • 301
    • 302
    • 303
    • 304
    • 305
    • 306
    • 307
    • 308
    • 309
    • 310
    • 311
    • 312
    • 313
    • 314
    • 315
    • 316
    • 317
    • 318
    • 319
    • 320
    • 321
    • 322
    • 323
    • 324
    • 325
    • 326
    • 327
    • 328
    • 329
    • 330
    • 331
    • 332
    • 333
    • 334
    • 335
    • 336
    • 337
    • 338
    • 339
    • 340
    • 341
    • 342
    • 343
    • 344
    • 345
    • 346
    • 347
    • 348
    • 349
    • 350
    • 351
    • 352
    • 353
    • 354
    • 355
    • 356
    • 357
    • 358
    • 359
    • 360
    • 361
    • 362
    • 363
    • 364
    • 365
    • 366
    • 367
    • 368
    • 369
    • 370
    • 371
    • 372
    • 373
    • 374
    • 375
    • 376
    • 377
    • 378
    • 379
    • 380
    • 381
    • 382
    • 383
    • 384
    • 385
    • 386
    • 387
    • 388
    • 389
    • 390
    • 391
    • 392
    • 393
    • 394
    • 395
    • 396
    • 397
    • 398
    • 399
    • 400
    • 401
    • 402
    • 403
    • 404
    • 405
    • 406
    • 407
    • 408
    • 409
    • 410
    • 411
    • 412
    • 413
    • 414
    • 415
    • 416
    • 417
    • 418
    • 419
    • 420
    • 421
    • 422
    • 423
    • 424
    • 425
    • 426
    • 427
    • 428
    • 429
    • 430
    • 431
    • 432
    • 433
    • 434
    • 435
    • 436
    • 437
    • 438
    • 439
    • 440
    • 441
    • 442
    • 443
    • 444
    • 445
    • 446
    • 447
    • 448
    • 449
    • 450
    • 451
    • 452
    • 453
    • 454
    • 455
    • 456
    • 457
    • 458
    • 459
    • 460
    • 461
    • 462
    • 463
    • 464
    • 465
    • 466
    • 467
    • 468
    • 469
    • 470
    • 471
    • 472
    • 473
    • 474
    • 475
    • 476
    • 477
    • 478
    • 479
    • 480
    • 481
    • 482
    • 483
    • 484
    • 485
    • 486
    • 487
    • 488
    • 489
    • 490
    • 491
    • 492
    • 493
    • 494
    • 495
    • 496
    • 497
    • 498
    • 499
    • 500
    • 501
    • 502
    • 503
    • 504
    • 505
    • 506
    • 507
    • 508
    • 509
    • 510
    • 511
    • 512
    • 513
    • 514
    • 515
    • 516
    • 517
    • 518
    • 519
    • 520
    • 521
    • 522
    • 523
    • 524
    • 525
    • 526
    • 527
    • 528
    • 529
    • 530
    • 531
    • 532
    • 533
    • 534
    • 535
    • 536
    • 537
    • 538
    • 539
    • 540
    • 541
    • 542
    • 543
    • 544
    • 545
    • 546
    • 547
    • 548
    • 549
    • 550
    • 551
    • 552
    • 553
    • 554
    • 555
    • 556
    • 557
    • 558
    • 559
    • 560
    • 561
    • 562
    • 563
    • 564
    • 565
    • 566
    • 567
    • 568
    • 569
    • 570
    • 571
    • 572
    • 573
    • 574

    在这里插入图片描述

  • 相关阅读:
    VMware虚拟机安装CentOS Linux操作系统
    16. Java字符串拼接的低层原理
    MindFusion Crack版,以围绕根的同心圆排列层
    oled显示器程序(IIC)从stm32f103移植到stm32f429出现bug不显示-解决移植失败问题
    [题]:排列数字 #深搜 #DFS
    VMware 虚拟机中 Linux 系统Centos7磁盘空间扩容
    如何看待AIGC技术?【模板】
    图片拼接:如何将一堆杂乱无章的图片变成一个有意义的、协调的整体
    C++中栈数组、堆数组和vector向量的效率比较
    人工智能与神经网络BenchMark--MLPerf
  • 原文地址:https://blog.csdn.net/m0_62497122/article/details/126042134