天天看點

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)戰鬥處理與炮彈