pygame 面向对象版小游戏 飞机大战

 

import sys
import pygame
import random


class Util:  # 点击类
    @staticmethod
    def click_check(sprite):
        if pygame.mouse.get_pressed()[0]:
            if sprite.rect.collidepoint(pygame.mouse.get_pos()):
                return True
        return False


class BossSprite(pygame.sprite.Sprite):
    def __init__(self, name):
        super().__init__()
        self.image = pygame.image.load(name)
        self.rect = self.image.get_rect()


class BulletSprite(BossSprite):
    def __init__(self, name, speed, centerx, y):
        super().__init__(name)
        self.speed = speed
        self.rect.centerx = centerx
        self.rect.top = y

    def update(self):
        self.rect.top += self.speed
        if self.rect.top > 700 or self.rect.top < 0:
            self.kill()


class BgSprite(BossSprite):
    def __init__(self, name, top_left):
        super().__init__(name)
        self.rect.topleft = top_left

    def update(self):
        self.rect.top += 5
        if self.rect.top >= 700:
            self.rect.top = -700


class BgManage:
    def __init__(self, gm):
        self.gm = gm
        self.bg_group = pygame.sprite.Group()
        BgSprite("fjdzimg/bg.png", (0, 0)).add(self.bg_group)
        BgSprite("fjdzimg/bg.png", (0, -700)).add(self.bg_group)

    def update(self):
        self.bg_group.update()
        self.bg_group.draw(self.gm.screen)


class EquipSprite(BossSprite):  # 物资精灵类
    def __init__(self, name, speed, type):
        super().__init__(name)
        self.rect.left = random.randint(0, 500 - self.rect.width)
        self.rect.bottom = 0
        self.speed = speed
        self.equip_bullet_group = pygame.sprite.Group()
        self.type = type

    def update(self):
        self.rect.top += self.speed


class EquipManage:  # 物资管理类
    def __init__(self, gm):
        self.gm = gm
        self.equip_group = pygame.sprite.Group()
        self.time_count = 10

    def generate(self):
        odds = random.random()
        if odds >= 0.7:
            self.equip = EquipSprite("fjdzimg/hp.png", 3, 1000)
            self.equip.add(self.equip_group)
        if 0.35 <= odds < 0.7:
            self.equip = EquipSprite("fjdzimg/bomb_supply.png", 3, 2000)
            self.equip.add(self.equip_group)
        if odds < 0.35:
            self.equip = EquipSprite("fjdzimg/bullet_supply.png", 3, 3000)
            self.equip.add(self.equip_group)

    def update(self):
        self.time_count -= 0.1
        if self.time_count <= 0:
            self.time_count = 10
            self.generate()
        self.equip_group.update()
        self.equip_group.draw(self.gm.screen)


class EnemySprite(BossSprite):  # 敌机精灵类
    def __init__(self, name, speed, gm, hp, type):
        self.gm = gm
        super().__init__(name)
        self.rect.left = random.randint(0, 500 - self.rect.width)
        self.rect.bottom = 0
        self.speed = speed
        self.enemy_bullet_group = pygame.sprite.Group()
        self.shoot_time = 5
        self.max_hp = hp
        self.hp = hp
        self.type = type

    def draw_hp(self):
        pygame.draw.rect(self.gm.screen, (127, 127, 127), (
            self.rect.left + self.rect.width / 2 - self.max_hp / 2, self.rect.top, self.max_hp, 10))
        pygame.draw.rect(self.gm.screen, (0, 255, 0), (
            self.rect.left + self.rect.width / 2 - self.max_hp / 2, self.rect.top, self.hp, 10))

    def shoot(self):
        self.enemy_bullet = BulletSprite("fjdzimg/enemy_bullet.png", 5, self.rect.centerx, self.rect.bottom)
        self.enemy_bullet.add(self.enemy_bullet_group)

    def shoot1(self):
        for i in range(1, 4):
            self.enemy_bullet = BulletSprite("fjdzimg/enemy_bullet.png", 5, self.rect.centerx + 30 - i * 15,
                                             self.rect.bottom)
            self.enemy_bullet.add(self.enemy_bullet_group)

    def shoot2(self):
        for i in range(1, 6):
            self.enemy_bullet = BulletSprite("fjdzimg/enemy_bullet.png", 5, self.rect.centerx + 60 - i * 20,
                                             self.rect.bottom)
            self.enemy_bullet.add(self.enemy_bullet_group)

    def update(self):
        self.draw_hp()
        self.rect.top += self.speed
        if self.rect.top > 700:
            self.kill()
        self.shoot_time -= 0.1
        if self.shoot_time <= 0:
            self.shoot_time = 5
            if self.type == 100:
                self.shoot2()
            if self.type == 200:
                self.shoot1()
            if self.type == 300 or self.type == 400:
                self.shoot()
        self.enemy_bullet_group.update()
        self.enemy_bullet_group.draw(self.gm.screen)


class EnemyManage:  # 敌机管理类
    def __init__(self, gm):
        self.gm = gm
        self.enemy_group = pygame.sprite.Group()
        self.time_count = 7

    def generate(self):
        odds = random.random()
        if odds >= 0.92:
            self.enemy = EnemySprite("fjdzimg/enemy_aircraft20.png", 3, self.gm, 140, 100)
            self.enemy.add(self.enemy_group)
        if 0.75 <= odds < 0.92:
            self.enemy = EnemySprite("fjdzimg/enemy_aircraft1.png", 3, self.gm, 80, 200)
            self.enemy.add(self.enemy_group)
        if 0.45 <= odds < 0.75:
            self.enemy = EnemySprite("fjdzimg/enemy_aircraft2.png", 2, self.gm, 40, 300)
            self.enemy.add(self.enemy_group)
        if odds < 0.45:
            self.enemy = EnemySprite("fjdzimg/enemy_aircraft3.png", 1, self.gm, 20, 400)
            self.enemy.add(self.enemy_group)

    def update(self):
        self.time_count -= 0.1
        if self.time_count <= 0:
            self.time_count = 7
            self.generate()
        self.enemy_group.update()
        self.enemy_group.draw(self.gm.screen)


class PlayerSprite(BossSprite):  # 玩家精灵类
    def __init__(self, name, center, gm):
        super().__init__(name)
        self.gm = gm
        self.rect.center = center
        self.my_bullet_group = pygame.sprite.Group()
        self.shoot_time = 1
        self.max_hp = 100
        self.hp = 100
        self.foot2_time = 0
        self.score = 0

    def draw_hp(self):
        pygame.draw.rect(self.gm.screen, (127, 127, 127), (
            self.rect.left + self.rect.width / 2 - 50, self.rect.bottom - 10, 100, 10))
        pygame.draw.rect(self.gm.screen, (0, 255, 0), (
            self.rect.left + self.rect.width / 2 - 50, self.rect.bottom - 10, self.hp, 10))

    def my_score(self):
        self.font = pygame.font.Font("font/simkai.ttf", 20)
        self.textImage = self.font.render(f"分数:{self.score}", True, (0, 255, 255))
        self.gm.screen.blit(self.textImage, (400, 30))

    def shoot(self):
        self.my_bullet = BulletSprite("fjdzimg/my_bullet.png", -10, self.rect.centerx, self.rect.top + 15)
        self.my_bullet.add(self.my_bullet_group)

    def shoot2(self):
        for i in range(1, 4):
            self.my_bullet = BulletSprite("fjdzimg/my_bullet.png", -10, self.rect.centerx + 60 - i * 30,
                                          self.rect.top + 15)
            self.my_bullet.add(self.my_bullet_group)

    def update(self):
        self.my_score()
        self.draw_hp()
        key_pressed = pygame.key.get_pressed()
        if key_pressed[pygame.K_LEFT] and self.rect.left > 0:
            self.rect.left -= 5
        if key_pressed[pygame.K_RIGHT] and self.rect.right < 500:
            self.rect.right += 5
        if key_pressed[pygame.K_UP] and self.rect.top > 0:
            self.rect.top -= 5
        if key_pressed[pygame.K_DOWN] and self.rect.bottom < 700:
            self.rect.bottom += 5
        self.shoot_time -= 0.2
        if self.shoot_time <= 0:
            self.shoot_time = 1
            self.foot2_time -= 1
            if self.foot2_time <= 0:
                self.shoot()
            else:
                self.shoot2()
        self.my_bullet_group.update()
        self.my_bullet_group.draw(self.gm.screen)


class PlayerManage:  # 玩家管理类
    def __init__(self, gm):
        self.gm = gm
        self.player_group = pygame.sprite.Group()

    def born(self):
        odds = random.random()
        self.score = 0
        if 0.75 < odds:
            self.player = PlayerSprite("fjdzimg/my_aircraft1.png", (250, 630), self.gm)
            self.player.add(self.player_group)
        if 0.5 < odds <= 0.75:
            self.player = PlayerSprite("fjdzimg/my_aircraft2.png", (250, 630), self.gm)
            self.player.add(self.player_group)
        if 0.25 < odds <= 0.5:
            self.player = PlayerSprite("fjdzimg/my_aircraft3.png", (250, 630), self.gm)
            self.player.add(self.player_group)
        if odds <= 0.25:
            self.player = PlayerSprite("fjdzimg/my_aircraft4.png", (250, 630), self.gm)
            self.player.add(self.player_group)

    def die(self):
        self.player_group.empty()
        self.gm.state = "end"

    def update(self):
        self.player_group.update()
        self.player_group.draw(self.gm.screen)


class UISprite(BossSprite):  # ui精灵类
    def __init__(self, name, center):
        super().__init__(name)
        self.rect.center = center


class UIManage:  # ui管理类
    def __init__(self, gm):
        self.gm = gm
        # 开始
        self.ready_group = pygame.sprite.Group()
        self.begin_btn = UISprite("fjdzimg/ks.png", (250, 350))
        self.begin_btn.add(self.ready_group)
        # 重开
        # 退出
        self.end_group = pygame.sprite.Group()
        self.replay_btn = UISprite("fjdzimg/again.png", (250, 200))
        self.replay_btn.add(self.end_group)
        self.exit_btn = UISprite("fjdzimg/exit.png", (250, 350))
        self.exit_btn.add(self.end_group)
        # 暂停
        self.suspend_group = pygame.sprite.Group()
        self.suspend_btn = UISprite("fjdzimg/stop.png", (250, 350))
        self.suspend_btn.add(self.suspend_group)

    def update(self):
        if self.gm.state == "ready":
            self.ready_group.draw(self.gm.screen)
            if Util.click_check(self.begin_btn):
                self.gm.state = "gaming"
                self.gm.player_manage.born()
        elif self.gm.state == "gaming":
            pass
        elif self.gm.state == "end":
            self.end_group.draw(self.gm.screen)
            if Util.click_check(self.replay_btn):
                self.gm.state = "gaming"  # 状态设为gaming 重新开始
                self.gm.player_manage.born()
            if Util.click_check(self.exit_btn):
                pygame.quit()
                sys.exit()
        elif self.gm.state == "suspend":
            self.suspend_group.draw(self.gm.screen)
            if Util.click_check(self.suspend_btn):
                self.gm.state = "gaming"


class GameManage:  # 游戏管理类
    def __init__(self, name):
        pygame.init()
        self.clock = pygame.time.Clock()
        self.state = "ready"
        self.screen = pygame.display.set_mode((500, 700))
        self.screen.fill("#FFFACD")
        pygame.display.set_caption(name)
        self.bg_manage = BgManage(self)
        self.ui_manage = UIManage(self)
        self.player_manage = PlayerManage(self)
        self.enemy_manage = EnemyManage(self)
        self.equip_manage = EquipManage(self)

    def check_event(self):  # 事件检测
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()

            if event.type == pygame.KEYUP:
                if event.key == pygame.K_SPACE:
                    self.state = "end"
                    self.enemy_manage.enemy_group.empty()
                    self.equip_manage.equip_group.empty()
                    self.player_manage.player_group.empty()
                if event.key == pygame.K_LALT:
                    self.state = "suspend"
                if event.key == pygame.K_RALT:
                    self.state = "gaming"

    def check_collider(self):  # 碰撞检测
        player_bullet_enemy = pygame.sprite.groupcollide(self.player_manage.player.my_bullet_group,
                                                         self.enemy_manage.enemy_group, True, False)
        if player_bullet_enemy:
            for enemys in player_bullet_enemy.values():
                # print(player_bullet_enemy.values())
                # print(enemys)
                for enemy in enemys:
                    # print(enemy)
                    enemy.hp -= 10
                    if enemy.hp <= 0:
                        if enemy.type == 100:
                            self.player_manage.player.score += 10
                        if enemy.type == 200:
                            self.player_manage.player.score += 5
                        if enemy.type == 300:
                            self.player_manage.player.score += 3
                        if enemy.type == 400:
                            self.player_manage.player.score += 1
                        enemy.kill()
        player_equip = pygame.sprite.groupcollide(self.player_manage.player_group, self.equip_manage.equip_group, False,
                                                  True)
        if player_equip:
            for equips in player_equip.values():
                for equip in equips:
                    if equip.type == 1000:
                        self.player_manage.player.hp += 10
                        if self.player_manage.player.hp >= 100:
                            self.player_manage.player.hp = 100
                    if equip.type == 2000:
                        self.enemy_manage.enemy_group.empty()
                    if equip.type == 3000:
                        self.player_manage.player.foot2_time = 11
        for enemy in self.enemy_manage.enemy_group.sprites():
            if pygame.sprite.groupcollide(enemy.enemy_bullet_group, self.player_manage.player_group, True, False):
                self.player_manage.player.hp -= 10
                if self.player_manage.player.hp <= 0:
                    self.state = "end"
                    self.player_manage.player_group.empty()
                    self.enemy_manage.enemy_group.empty()
                    self.equip_manage.equip_group.empty()
        if pygame.sprite.groupcollide(self.player_manage.player_group, self.enemy_manage.enemy_group, False, True):
            self.player_manage.player.hp -= 50
            self.player_manage.player.score -= 5
            if self.player_manage.player.hp <= 0 or self.player_manage.player.score < 0:
                self.state = "end"
                self.player_manage.player_group.empty()
                self.enemy_manage.enemy_group.empty()
                self.equip_manage.equip_group.empty()
        for enemy in self.enemy_manage.enemy_group.sprites():
            pygame.sprite.groupcollide(enemy.enemy_bullet_group, self.player_manage.player.my_bullet_group, True,
                                       True)  # pengzh  #

    def run(self):  # 调用刷新启动
        while True:
            self.clock.tick(24)
            self.check_event()  # 调用检查事件
            self.screen.fill("#B0E0E6")
            self.ui_manage.update()
            if self.state == "gaming":
                self.bg_manage.update()
                self.player_manage.update()
                self.enemy_manage.update()
                self.equip_manage.update()
                self.check_collider()
            pygame.display.flip()


gm = GameManage("飞机大战")
gm.run()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值