pygame之《飞机大战》(二)

前言:

继《飞机大战》(一)后,本次对其进行扩展及优化。

扩展内容:
  1. 判断以及删除越界子弹
  2. hero的按键持续移动
  3. 敌机发射子弹

编程代码:

1 - hero子弹越界判断及删除越界子弹

class HeroPlane(object):
    def __init__(self, screen_temp):
        self.x = 195
        self.y = 700
        self.screen = screen_temp
        self.image = pygame.image.load("./feiji/hero1.png")
        self.bullet_list = [] #存储发射出去的子弹的引用

    def display(self):
        self.screen.blit(self.image, (self.x, self.y))
        bullet_list_temp = []#保存越界的子弹
        for bullet in self.bullet_list:
            bullet.display()
            bullet.move()
            if bullet.judge():#判断子弹是否越界
                bullet_list_temp.append(bullet)

        for bullet in bullet_list_temp:
            self.bullet_list.remove(bullet)

    def move_left(self):
        self.x -= 5

    def move_right(self):
        self.x += 5

    def fire(self):
        self.bullet_list.append(Bullet(self.screen, self.x, self.y))
分析代码:

**为何用bullet_list_temp列表存储越界的子弹,再在self.bullet_list中删除与其相同的子弹引用?
因为:直接在self.bullet_list.remove(bullet)会导致其下一个子弹(移动到上一个子弹的位置,但循环已经指向下一个位置,即漏删。由于main()是循环调用,即循环删除,本代码中不使用bullet_list_temp也能够实现。为使代码严谨,故在此使用中间变量。)不能被删除。

2 - Bullet类添加判断越界方法

    def judge(self):
        if self.y < 0:
            return True
        else:
            return False

3 - 敌机发射子弹

class EnemyPlane(object):
    """敌机的类"""
    def __init__(self, screen_temp):
        self.x = 0
        self.y = 0
        self.screen = screen_temp
        self.image = pygame.image.load("./feiji/enemy0.png")
        self.bullet_list = [] #存储发射出去的子弹的引用
        self.direction = "right" #用来存储飞机默认显示方向

    def display(self):
        self.screen.blit(self.image, (self.x, self.y))
        bullet_list_out = [] 
        for bullet in self.bullet_list:
            bullet.display()
            bullet.move()
            if bullet.judge():
                bullet_list_out.append(bullet)
        for bullet in bullet_list_out:
            self.bullet_list.remove(bullet)

    def move(self):

        if self.direction == "right":
            self.x += 5
        elif self.direction == "left":
            self.x -= 5

        if self.x > 480-50:
            self.direction ="left"
        elif self.x < 0:
            self.direction = "right"


    def fire(self):
        random_num = random.randint(1, 100)#随机的发射子弹
        if random_num == 8 or random_num == 20:
            self.bullet_list.append(EnemyBullet(self.screen, self.x, self.y))

4 - 敌机子弹类

class EnemyBullet(object):
    def __init__(self, screen_temp, x, y):
        self.x = x + 25
        self.y = y + 40
        self.screen = screen_temp
        self.image = pygame.image.load("./feiji/bullet1.png")

    def display(self):
        self.screen.blit(self.image, (self.x, self.y))


    def move(self):
        self.y += 5

    def judge(self):
        if self.y > 852:
            return True
        else:
            return False

5 - 填充main()函数

def main():
    #1. 创建窗口
    screen = pygame.display.set_mode((480,852),0,32)

    #2. 创建一个背景图片
    background = pygame.image.load("./feiji/background.png")

    #3. 创建一个飞机对象
    hero = HeroPlane(screen)

    #4. 创建一个敌机
    enemy = EnemyPlane(screen)


    while True:
        screen.blit(background, (0,0))

        hero.display()

        enemy.move() #控制敌机的移动

        enemy.fire() #敌机开火

        enemy.display()

        pygame.display.update()

        key_control(hero)

        time.sleep(0.01)

if __name__ == "__main__":
    main() 
运行截图:

这里写图片描述

本章结束:

下一章将进行基类的抽取。

猜你喜欢

转载自blog.csdn.net/qq_38038143/article/details/80041913