天天看点

python坦克大战(4)玩家坦克和敌对坦克坦克大战4

坦克大战4

1.玩家坦克

class Player:   
    """玩家管理"""
    def __init__(self,view_manager,screen):
        #生命
        self.hp = 100
        #杀敌数量
        self.kill = 0
        #动作
        self.move = pv.MOVE_STAND
        #记录最近一次保持的动作;初始化的时候是朝上
        self.lastmove = pv.MOVE_UP
        #移动速度
        self.speed = 5
        #玩家坐标
        self.x = view_manager.screen_width / 2
        self.y = view_manager.screen_height * 3 / 4
        #玩家发射的子弹
        self.bullets = []
        #当前炮口的中心坐标
        self.guncenterx = -1
        self.guncentery = -1
        #发射炮弹的间隔
        self.firedelay = 0.3
        #上次发射炮弹的时间
        self.firetime = datetime.datetime.now() - datetime.timedelta(days=1)
        #字体
        self.font = view_manager.font[1]

    def is_die(self):
        if self.hp <= 0:
            return True
        else:
            return False

    #控制角色移动
    def move_position(self,view_manager,screen):
        if self.move == pv.MOVE_STAND:
            return
        
        # 更新角色位置
        if self.move == pv.MOVE_LEFT:
            self.x-=self.speed
            #左边界判断
            if self.x <= 0:
                self.x = 0
        elif self.move == pv.MOVE_RIGHT:
            self.x+=self.speed

            #右边界判断
            bodysize = view_manager.player_body[3].get_rect()
            
            if self.x + bodysize.width >= view_manager.screen_width :
                self.x = view_manager.screen_width - bodysize.width

        elif self.move == pv.MOVE_UP:
            self.y-=self.speed
            #右边界判断
            if self.y <= 0:
                self.y = 0
        elif self.move == pv.MOVE_DOWN:
            self.y+=self.speed

            #下边界判断
            bodysize = view_manager.player_body[1].get_rect()
            if self.y + bodysize.height >= view_manager.screen_height :
                self.y = view_manager.screen_height - bodysize.height

    #当前图像范围
    def getrect(self ,view_manager):
        if self.lastmove == pv.MOVE_UP :
            return view_manager.player_body[0].get_rect()
        if self.lastmove == pv.MOVE_DOWN:
            return view_manager.player_body[1].get_rect()
        if self.lastmove == pv.MOVE_LEFT:
            return view_manager.player_body[2].get_rect()
        if self.lastmove == pv.MOVE_RIGHT:
            return view_manager.player_body[3].get_rect()

        return None

    #绘制角色
    def draw(self,view_manager,screen):
        direct = self.move

        # 绘制角色站立的位置
        if self.move == pv.MOVE_STAND:
             #未进行任何操作的时候,保持最后一次控制的方向
            direct = self.lastmove      
            
        if direct == pv.MOVE_UP:
            screen.blit(view_manager.player_body[0],(self.x,self.y))
        if direct == pv.MOVE_DOWN:
            screen.blit(view_manager.player_body[1],(self.x,self.y))
        if direct == pv.MOVE_LEFT:
            screen.blit(view_manager.player_body[2],(self.x,self.y))
        if direct == pv.MOVE_RIGHT:
            screen.blit(view_manager.player_body[3],(self.x,self.y))
              
        #绘制矩形角色血量条
        pygame.draw.rect(screen,pv.COLOR_RED,Rect((self.x + 5 , self.y - 5),(self.hp , 5)))

        #绘制杀敌数量
        killtxt = self.font.render('击毁:' + str(self.kill) ,1,pv.COLOR_RED)
        screen.blit(killtxt,(5,5))

    #角色控制
    def work(self,screen,view_manager):

        #角色移动
        self.move_position(view_manager,screen)

        #绘制角色
        self.draw(view_manager,screen)

        #移除已经失效的炮弹
        for b in self.bullets:
            if b.is_effect == False:
                self.bullets.remove(b)

        #绘制角色发射的炮弹
        for b in self.bullets:
            b.move_position(view_manager,screen)
            b.draw(view_manager,screen)

    #炮口的坐标
    def guncenter(self,view_manager):              
        if self.lastmove == pv.MOVE_UP :
            bodyrect = view_manager.player_body[0].get_rect()
            self.guncenterx = self.x + bodyrect.width / 2 - 4
            self.guncentery = self.y
            return

        if self.lastmove == pv.MOVE_DOWN:
            bodyrect = view_manager.player_body[1].get_rect()
            self.guncenterx = self.x + bodyrect.width / 2 - 4
            self.guncentery = self.y + bodyrect.height
            return

        if self.lastmove == pv.MOVE_LEFT:
            bodyrect = view_manager.player_body[2].get_rect()
            self.guncenterx = self.x
            self.guncentery = self.y + bodyrect.height / 2 - 4
            return

        if self.lastmove == pv.MOVE_RIGHT:
            bodyrect = view_manager.player_body[3].get_rect()
            self.guncenterx = self.x + bodyrect.width 
            self.guncentery = self.y + bodyrect.height / 2 - 4
            return

    #发射炮弹
    def fire(self,screen,view_manager):
        #每间隔1秒发射一次
        firepass = (datetime.datetime.now() - self.firetime).microseconds / 1000000
        if firepass < self.firedelay :
            return

        self.firetime = datetime.datetime.now()

        #更新炮口坐标
        self.guncenter(view_manager)

        #创建炮弹 #根据当前的面向设置炮弹
        newbullet = Bullet(view_manager,screen,self.guncenterx,self.guncentery,self.lastmove)
        #模拟爆炸
        #newbullet.is_bomb = True

        #记录炮弹
        self.bullets.append(newbullet)

        #播放音乐:发射
        view_manager.sounds[0].play()
        
           

2.敌对坦克

class Monster:
    """敌人处理"""
    def __init__(self,view_manager,screen):
        #血量
        self.hp = 100
        #动作
        self.move = pv.MOVE_DOWN
        #记录最近一次保持的动作;初始化的时候是朝上
        self.lastmove = pv.MOVE_DOWN
        #移动速度
        self.speed = 4
        #随机出现坐标在屏幕上半部分
        self.x = random.randint(100,view_manager.screen_width - 300)
        self.y = random.randint(0,view_manager.screen_height / 2)

        #发射的子弹
        self.bullets = []
        
        #当前炮口的中心坐标
        self.guncenterx = -1
        self.guncentery = -1

        #发射炮弹的间隔
        self.firedelay = 1
        #上次发射炮弹的时间
        self.firetime = datetime.datetime.now() - datetime.timedelta(days=1)

        #更改方向的间隔
        self.changemovedelay = random.randint(0,3)
        #上次更改移动方向的时间
        self.changemovetime = datetime.datetime.now() - datetime.timedelta(days=1)


    #控制移动
    def move_position(self,view_manager,screen):      
        
        #重新生成移动方向
        changepass = (datetime.datetime.now() - self.changemovetime).seconds
        if changepass > self.changemovedelay :            
            self.changemovetime = datetime.datetime.now()
            #随机生成4个方向状态
            self.move = random.randint(1,4)
            self.lastmove = self.move
            #随机下次变向间隔
            self.changemovedelay = random.randint(0,3)

        #更新角色位置

        # 站立不动
        if self.move == pv.MOVE_STAND:
            return

        # 向左
        if self.move == pv.MOVE_LEFT:
            self.x-=self.speed
            #左边界判断
            if self.x <= 0:
                self.x = 0                
                self.move = pv.MOVE_RIGHT
                self.lastmove = self.move
        # 向右
        elif self.move == pv.MOVE_RIGHT:
            self.x+=self.speed

            #右边界判断
            bodysize = view_manager.monster_body[3].get_rect()            
            if self.x + bodysize.width >= view_manager.screen_width :
                self.x = view_manager.screen_width - bodysize.width                
                self.move = pv.MOVE_LEFT
                self.lastmove = self.move
        # 向上
        elif self.move == pv.MOVE_UP:
            self.y-=self.speed
            #右边界判断
            if self.y <= 0:
                self.y = 0                
                self.move = pv.MOVE_DOWN
                self.lastmove = self.move
        # 向下
        elif self.move == pv.MOVE_DOWN:
            self.y+=self.speed

            #下边界判断
            bodysize = view_manager.monster_body[1].get_rect()
            if self.y + bodysize.height >= view_manager.screen_height :
                self.y = view_manager.screen_height - bodysize.height
                self.move = pv.MOVE_UP
                self.lastmove = self.move

    #当前主体范围
    def getrect(self ,view_manager):
        if self.lastmove == pv.MOVE_UP :
            return view_manager.monster_body[0].get_rect()
        if self.lastmove == pv.MOVE_DOWN:
            return view_manager.monster_body[1].get_rect()
        if self.lastmove == pv.MOVE_LEFT:
            return view_manager.monster_body[2].get_rect()
        if self.lastmove == pv.MOVE_RIGHT:
            return view_manager.monster_body[3].get_rect()

        return None


    #绘制角色
    def draw(self,view_manager,screen):
        direct = self.move

        # 绘制角色站立的位置
        if direct == pv.MOVE_STAND:
            #未进行任何操作的时候,保持最后一次控制的方向
            direct = self.lastmove            

        if direct == pv.MOVE_UP:
            screen.blit(view_manager.monster_body[0],(self.x,self.y))
        if direct == pv.MOVE_DOWN:
            screen.blit(view_manager.monster_body[1],(self.x,self.y))
        if direct == pv.MOVE_LEFT:
            screen.blit(view_manager.monster_body[2],(self.x,self.y))
        if direct == pv.MOVE_RIGHT:
            screen.blit(view_manager.monster_body[3],(self.x,self.y))
                
        #绘制矩形角色血量条
        pygame.draw.rect(screen,pv.COLOR_RED,Rect((self.x + 5 , self.y - 5),(self.hp , 5)))



    #控制
    def work(self,screen,view_manager):

        #角色移动
        self.move_position(view_manager,screen)

        #绘制角色
        self.draw(view_manager,screen)

        #发射炮弹
        self.fire(screen,view_manager)

        #移除已经失效的炮弹
        for b in self.bullets:
            if b.is_effect == False:
                self.bullets.remove(b)

        #绘制角色发射的炮弹
        for b in self.bullets:
            b.move_position(view_manager,screen)
            b.draw(view_manager,screen)



    #炮口的坐标
    def guncenter(self,view_manager): 
        
        if self.lastmove == pv.MOVE_UP :
            bodyrect = view_manager.monster_body[0].get_rect()
            self.guncenterx = self.x + bodyrect.width / 2 - 4
            self.guncentery = self.y
            return

        if self.lastmove == pv.MOVE_DOWN:
            bodyrect = view_manager.monster_body[1].get_rect()
            self.guncenterx = self.x + bodyrect.width / 2 - 4
            self.guncentery = self.y + bodyrect.height
            return

        if self.lastmove == pv.MOVE_LEFT:
            bodyrect = view_manager.monster_body[2].get_rect()
            self.guncenterx = self.x
            self.guncentery = self.y + bodyrect.height / 2 - 4
            return

        if self.lastmove == pv.MOVE_RIGHT:
            bodyrect = view_manager.monster_body[3].get_rect()
            self.guncenterx = self.x + bodyrect.width 
            self.guncentery = self.y + bodyrect.height / 2 - 4
            return

    #发射炮弹
    def fire(self,screen,view_manager):
        #每间隔1秒发射一次
        firepass = (datetime.datetime.now() - self.firetime).seconds
        if firepass < self.firedelay :
            return

        self.firetime = datetime.datetime.now()

        #更新炮口坐标
        self.guncenter(view_manager)

        #创建炮弹 #根据当前的面向设置炮弹从炮口中央发射
        newbullet = Bullet(view_manager,screen,self.guncenterx,self.guncentery,self.lastmove)
        
        #记录炮弹
        self.bullets.append(newbullet)

        #播放音乐:发射
        view_manager.sounds[0].play()

           

python坦克大战(5)战斗处理与炮弹