python飛機大戰

圖片:(5張,子彈是白色,不明顯)

代碼:

"""
__project_ = 'python'
__file_name__ = 'python實戰'
__author__ = 'Administrator'
__time__ = '2019/12/17 8:38'
__product_name = PyCharm

"""

'''
完成“飛機大戰遊戲“以下要求
1.實現背景精靈類和相關邏輯,背景可正常移動,加載合適的資源圖片
2.實現飛機精靈類和相關邏輯,添加飛機發射子彈的方法shoot,加載合適的資源圖片
3.實現普通敵機精靈類和相關邏輯,添加敵機類的生命值屬性,加載合適的資源圖片
4.實現加強版敵機精靈類和相關邏輯,加載合適的資源圖片(圖片可以和飛機圖片相同)
5.實現子彈精靈類和相關邏輯,加載合適的資源圖片
6.實現隨機出現普通敵機或加強版敵機邏輯
7.實現敵機擊毀邏輯:普通敵機遇到子彈被擊毀,加強版敵將遇到5顆子彈被擊毀
8.實現空格鍵一次發射5顆同方向的子彈邏輯
9.實現s鍵一次發送5顆不同方向的子彈邏輯
10.實現遊戲邏輯,可進行遊戲
註釋簡介清晰,編碼規範,程序功能完整,無bug

拓展: 30秒只可以使用8次散彈 步驟9方法
time.clock()計算時間方法 

                '散彈時間機制'
                now_clock = mytime.clock()
                if now_clock - self.fire_h_clock < 30:
                    if self.fire_h_count<8:
                        self.fire_h_count+=1
                        self.myplane.shoot_H()
                    else:
                        pass#     '不能發射子彈'
                else:
                    self.fire_h_clocks = now_clock
                    self.myplane.shoot_H()
                    self.fire_h_count = 1
'''
import pygame
import random

import time as mytime

SCREEN_RECT = pygame.Rect(0, 0, 331,587)  # 遊戲窗口大小
FRAME_PER_SER = 60  # 幀率
CREATE_ENMY_EVENT = pygame.USEREVENT  # 創建敵機事件ID
PLANE_FIRE_EVENT = pygame.USEREVENT + 1  # 自動開火事件ID


# 重寫精靈類
class GameSprite(pygame.sprite.Sprite):

    def __init__(self, image_name, speed=1):
        ''
        super().__init__()
        # 添加圖片屬性image、大小rect和速度 speed屬性
        self.image = pygame.image.load(image_name)
        self.rect = self.image.get_rect()
        self.speed = speed

    def update(self, *args):
        super().update(*args)
        self.rect.y += self.speed


# 實現背景精靈類和相關邏輯,
class Background(GameSprite):
    def __init__(self, is_alt=False):
        super().__init__('bg.png')
        # 背景可正常移動,加載合適的資源圖片
        if is_alt:
            self.rect.y = SCREEN_RECT.height

    def update(self, *args):
        super().update(*args)
        if self.rect.y > SCREEN_RECT.height:
            self.rect.y = -SCREEN_RECT.height  # 完成背景圖滾動


# 實現普通敵機精靈類和相關邏輯,
class Enemy(GameSprite):
    def __init__(self, image_name='dj.png', lives=1):
        #     添加敵機類的生命值屬性,加載合適的資源圖片

        super().__init__(image_name)
        self.speed = random.randint(1, 3)  # 敵機速度,隨機1-3
        self.lives = lives
        # 敵機出現位置
        self.rect.bottom = 0
        max_x = SCREEN_RECT.width - self.rect.width
        self.rect.x = random.randint(0, max_x)

    def update(self, *args):
        super().update(*args)
        # # 實現敵機擊毀邏輯:普通敵機遇到子彈被擊毀,加強版敵將遇到5顆子彈被擊毀
        if self.lives == 0:  # 加強版敵將遇到5顆子彈被擊毀
            self.kill()

        if self.rect.y > SCREEN_RECT.height:
            self.kill()  # 敵機出屏幕銷燬


# 實現飛機精靈類和相關邏輯,
class Myplane(GameSprite):
    def __init__(self):
        super().__init__('fj.png')
        self.rect.centerx = SCREEN_RECT.centerx
        self.rect.bottom = SCREEN_RECT.bottom - 30

        self.bullets = pygame.sprite.Group()

    def update(self, *args):
        # super().update(*args)
        self.rect.x += self.speed
        # 飛機不飛出屏幕
        if self.rect.x < 0:
            self.rect.x = 0
        elif self.rect.right > SCREEN_RECT.right:
            self.rect.right = SCREEN_RECT.right

    # 添加飛機發射子彈的方法shoot,加載合適的資源圖片
    def shoot(self):
        #        '子彈'
        b = Bullet()
        b.rect.bottom = self.rect.y - 20
        b.rect.centerx = self.rect.centerx
        self.bullets.add(b)

    def shoot5(self):
        '''8.實現空格鍵一次發射5顆同方向的子彈邏輯'''
        for i in range(5):
            b = Bullet()
            b.rect.bottom = self.rect.y - 20 * i
            b.rect.centerx = self.rect.centerx
            self.bullets.add(b)

    def shoot_H(self):
        '''9.實現s鍵一次發送5顆不同方向的子彈邏輯'''
        for i in range(-2, 3):
            speed_h = i
            b = Bullet(speed_h=speed_h)
            b.rect.bottom = self.rect.y
            b.rect.centerx = self.rect.centerx - 20 * i
            self.bullets.add(b)


# 實現子彈精靈類和相關邏輯,
class Bullet(GameSprite):

    def __init__(self, speed_h=0):
        super().__init__('zd.png', -2)  # 加載合適的資源圖片
        self.speed_h = speed_h

    def update(self, *args):
        super().update(*args)
        if self.speed_h != 0:
            self.rect.x -= self.speed_h

        if self.rect.bottom < 0:
            self.kill()  # 移出屏幕銷燬


class PlaneGame(object):  # 遊戲類
    def __init__(self):
        self.screen = pygame.display.set_mode(SCREEN_RECT.size)

        self.clock = pygame.time.Clock()
        self.fire_h_clock = mytime.clock()
        self.fire_h_count = 0

        # 創建精靈
        self.__create_sprites()
        # 監聽
        pygame.time.set_timer(CREATE_ENMY_EVENT, 1000)
        pygame.time.set_timer(PLANE_FIRE_EVENT, 500)
        # 設置標題-沒考覈
        pygame.display.set_caption('飛機大戰-初級版')

    def __create_sprites(self):
        bg0 = Background()
        bg1 = Background(True)
        self.back_group = pygame.sprite.Group(bg0, bg1)

        self.enemy_group = pygame.sprite.Group()
        self.myplane = Myplane()
        self.myplane_group = pygame.sprite.Group(self.myplane)

    def start_game(self):
        while True:
            self.clock.tick(FRAME_PER_SER)  # 刷新幀率
            # 事件監聽
            self.__event_handler()
            # 檢查碰撞
            self.__check_collid()
            # 更新繪製
            self.__update_sprites()

            pygame.display.update()

    def __event_handler(self):
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                # PlaneGame.del結束遊戲
                PlaneGame.game_over()
                quit()
            elif event.type == CREATE_ENMY_EVENT:
                # 實現隨機出現普通敵機或加強版敵機邏輯
                is_enemy = random.randint(0, 5)
                if is_enemy < 4:
                    enemy = Enemy()
                    self.enemy_group.add(enemy)
                else:
                    enemy = Enemy(image_name='fj0.png', lives=5)
                    self.enemy_group.add(enemy)

            elif event.type == PLANE_FIRE_EVENT:
                self.myplane.shoot()
            keys = pygame.key.get_pressed()
            if keys[32] and event.type == pygame.KEYDOWN:
                '實現空格鍵一次發射5顆同方向的子彈邏輯'
                self.myplane.shoot5()
            elif keys[115] and event.type == pygame.KEYDOWN:
                # '9.實現s鍵一次發送5顆不同方向的子彈邏輯'
                #self.myplane.shoot_H()
                #''''散彈時間機制'
                now_clock = mytime.clock()
                if now_clock - self.fire_h_clock < 30:
                    if self.fire_h_count<8:
                        self.fire_h_count+=1
                        self.myplane.shoot_H()
                    else:
                        pass#     '不能發射子彈'
                else:
                    self.fire_h_clock = now_clock
                    self.myplane.shoot_H()
                    self.fire_h_count = 1#'''

            if keys[pygame.K_RIGHT]:
                self.myplane.speed = 2
            elif keys[pygame.K_LEFT]:
                self.myplane.speed = -2
            else:
                self.myplane.speed = 0

    def __check_collid(self):
        # 實現敵機擊毀邏輯:普通敵機遇到子彈被擊毀,
        res_dict = pygame.sprite.groupcollide(self.enemy_group, self.myplane.bullets, False, True)
        for i in res_dict.keys():
            count = len(res_dict[i])
            i.lives -= count
        enemies = pygame.sprite.spritecollide(self.myplane, self.enemy_group, True)
        if len(enemies) > 0:
            self.myplane.kill()
            PlaneGame.game_over()

    def __update_sprites(self):
        self.back_group.update()
        self.back_group.draw(self.screen)
        self.enemy_group.update()
        self.enemy_group.draw(self.screen)
        self.myplane_group.update()
        self.myplane_group.draw(self.screen)
        self.myplane.bullets.update()
        self.myplane.bullets.draw(self.screen)

    @staticmethod
    def game_over():
        pygame.quit()
        exit()


if __name__ == '__main__':
    g = PlaneGame()
    g.start_game()

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章