python--python語言實現飛機大戰,附完整代碼,可直接運行~


前不久因為疫情的原因在家幾個月,閑着無聊便開始學習python編程入門了python這門語言,在學習到面向對象的時候,最后的案例是開發一個飛機大戰的項目游戲

因此試着開發了一下還不錯,故獻上源代碼和所需要的圖片素材,想要試試開發的朋友可以直接下載到IDE上運行即可。

配置要求

  1. 安裝 python的游戲包 pygame 包
  2. python版本為3.0以上(安裝介紹:https://www.cnblogs.com/wqb123/articles/12433427.html

文件要求

  1. 先新建一個文件夾命名:py_飛機大戰
  2. 命名2個文件:plane_main.py(主控程序文件) 和plane_sprites.py(輔助工具文件)

代碼如下:

(plane_main.py文件)

  1 import pygame
  2 from plane_sprites import *
  3 
  4 
  5 class PlaneGame(object):
  6     """飛機大戰主游戲"""
  7 
  8     def __init__(self):
  9         print("游戲初始化..")
 10 
 11         # 1.創建游戲窗口
 12         self.screen = pygame.display.set_mode(SCREEN_RECT.size)
 13         # 2.創建游戲的時鍾
 14         self.clock = pygame.time.Clock()
 15         # 3.調用私有方法,精靈和精靈組的創建
 16         self.__create_sprites()
 17         # 4.設置定時器--創建敵機出現 1s
 18         pygame.time.set_timer(CREATE_ENEMY_EVENT, 1000)
 19 
 20     def __create_sprites(self):
 21         """創建精靈和精靈組"""
 22         # 1.創建背景精靈和精靈組
 23         bg1 = Background()
 24         bg2 = Background(True)
 25         bg2.rect.y = -bg2.rect.height
 26         self.back_group = pygame.sprite.Group(bg1, bg2)
 27         # 2.創建敵機精靈組
 28         self.enemy_group = pygame.sprite.Group()
 29         # 3.創建英雄精靈組
 30         self.hero = Hero()
 31         self.hero_group = pygame.sprite.Group(self.hero)
 32 
 33     def start_game(self):
 34         print("游戲開始...")
 35         while True:
 36             # 1.設置刷新幀率
 37             self.clock.tick(FRAME_PER_SEC)
 38             # 2.事件監聽
 39             self.__event_handle()
 40             # 3.碰撞檢測
 41             self.__check_collide()
 42             # 4.更新精靈組
 43             self.__update_sprites()
 44             # 5.更新屏幕顯示
 45             pygame.display.update()
 46 
 47     def __event_handle(self):
 48         """事件監聽"""
 49 
 50         for event in pygame.event.get():
 51             # 監聽游戲是否退出
 52             if event.type == pygame.QUIT:
 53                 PlaneGame.__game_over()
 54             # 監聽敵機的出現
 55             elif event.type == CREATE_ENEMY_EVENT:
 56                 print("敵機出場...")
 57                 # 創建敵機精靈
 58                 enemy = Enemy()
 59                 self.enemy_group.add(Enemy())
 60             # 讓英雄發射子彈
 61             elif event.type == Hero_FIRE_EVENT:
 62                 self.hero.fire()
 63         # 獲取用戶按鍵
 64         keys_pressed = pygame.key.get_pressed()
 65         if keys_pressed[pygame.K_RIGHT]:
 66             self.hero.speed = 2
 67         elif keys_pressed[pygame.K_LEFT]:
 68             self.hero.speed = -2
 69         else:
 70             self.hero.speed = 0
 71 
 72     def __check_collide(self):
 73         """碰撞檢測"""
 74         # 1.設置子彈摧毀敵機
 75         pygame.sprite.groupcollide(self.hero.bullets,
 76                                    self.enemy_group, True, True)
 77         # 2.敵機摧毀英雄
 78         enemies = pygame.sprite.spritecollide(self.hero,
 79                                               self.enemy_group, True)
 80         # 2.1判斷列表是否有內容
 81         if len(enemies) > 0:
 82             # 讓英雄犧牲
 83             self.hero.kill()
 84             # 結束游戲
 85             PlaneGame.__game_over()
 86 
 87     def __update_sprites(self):
 88         """更新精靈組"""
 89         # 1.背景更新渲染顯示
 90         self.back_group.update()
 91         self.back_group.draw(self.screen)
 92         # 2.敵機渲染更新顯示
 93         self.enemy_group.update()
 94         self.enemy_group.draw(self.screen)
 95         # 3.英雄渲染更新顯示
 96         self.hero_group.update()
 97         self.hero_group.draw(self.screen)
 98         # 4.子彈渲染更新顯示
 99         self.hero.bullets.update()
100         self.hero.bullets.draw(self.screen)
101 
102     @staticmethod
103     def __game_over():
104         """游戲結束"""
105         print("游戲結束")
106         pygame.quit()
107         exit()
108 
109 if __name__ == '__main__':
110         # 創建游戲對象
111         game = PlaneGame()
112         # 開始游戲
113         game.start_game()

(plane_sprites.py文件)

import random
import pygame
# 游戲屏幕的尺寸
SCREEN_RECT = pygame.Rect(0, 0, 480, 700)
# 游戲的刷新幀率
FRAME_PER_SEC = 60
# 敵機的定時器常量
CREATE_ENEMY_EVENT = pygame.USEREVENT
# 英雄發射子彈事件
Hero_FIRE_EVENT = pygame.USEREVENT + 1


class GameSprite(pygame.sprite.Sprite):
    """游戲精靈基類"""
    def __init__(self, image_name, speed=1):
        # 調用父類的初始方法
        super().__init__()
        self.image = pygame.image.load(image_name)
        self.rect = self.image.get_rect()
        # 記錄速度
        self.speed = speed

    def update(self, *args):
        # 默認在垂直方向移動
        self.rect.y += self.speed


class Background(GameSprite):
    """游戲背景精靈"""

    def __init__(self, is_alt=False):

        # 1.調用父類方法實現精靈的創建(image/rect/speed)
        image_name = "./images/background.png"
        super().__init__(image_name)
        # 2.判斷是否交替圖片,如果是,將圖片設置到屏幕頂部
        if is_alt:
            self.rect.y = -self.rect.height

    def update(self, *args):

        # 1.調用父類方法實現
        super().update()
        # 2.判斷是否移出屏幕,如移出,將圖像設置到屏幕上方
        if self.rect.y >= SCREEN_RECT.height:
            self.rect.y = -self.rect.height


class Enemy(GameSprite):
    """敵機精靈"""
    def __init__(self):
        # 1.調用父類方法創建敵機精靈,並指定敵機圖像
        super().__init__("./images/enemy1.png")
        # 2.設置敵機的隨機速度(初始) 1~3
        self.speed = random.randint(1, 3)
        # 3.設置敵機的隨機位置(初始)水平方向
        self.rect.bottom = 0
        max_x = SCREEN_RECT.width - self.rect.width
        self.rect.x = random.randint(0, max_x)

    def update(self, *args):
        # 1.調用父類讓敵機在垂直方向移動
        super().update()
        # 2.判斷是否飛出屏幕,如果是,需將敵機刪除
        if self.rect.y >= SCREEN_RECT.height:
            print("敵機飛出屏幕...")
        # 3.將精靈從所有組中刪除
            self.kill()

    def __del__(self):
        print("敵機掛了 %s" % self.rect)


class Hero(GameSprite):
    """英雄精靈"""
    def __init__(self):
        super().__init__("./images/me1.png", 0)
        # 設置初始位置
        self.rect.centerx = SCREEN_RECT.centerx
        self.rect.bottom = SCREEN_RECT.bottom - 120
        # 每隔 0.5s 發射一次子彈
        pygame.time.set_timer(Hero_FIRE_EVENT, 500)
        # 1.創建子彈的精靈組
        self.bullets = pygame.sprite.Group()

    def update(self, *args):
        # 英雄飛機在水平方向運動
        self.rect.x += self.speed
        # 判斷屏幕邊界
        if self.rect.left < 0:
            self.rect.left = 0
        if self.rect.right > SCREEN_RECT.right:
            self.rect.right = SCREEN_RECT.right

    def fire(self):
        print("發射子彈...")
        # 實現一次發射三枚子彈
        for i in (1, 2, 3):
            # 1.創建子彈精靈
            bullet = Bullet()
            # 2.設置子彈精靈位置
            bullet.rect.bottom = self.rect.y - i * 20
            bullet.rect.centerx = self.rect.centerx
            # 3.將子彈精靈添加到精靈組
            self.bullets.add(bullet)


class Bullet(GameSprite):
    """子彈精靈"""
    def __init__(self):
        super().__init__("./images/bullet1.png", -2)

    def update(self, *args):
        super().update()
        # 判斷是否飛出屏幕,飛出刪除
        if self.rect.bottom < 0:
            self.kill()

涉及的素材圖

1.背景

2.敵機

3.主飛機

4.子彈

 

運行圖

 

 

 

可以試着運行玩一下效果,感受一下用python完成一次面向對象的小案例把~

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM