前不久因為疫情的原因在家幾個月,閑着無聊便開始學習python編程入門了python這門語言,在學習到面向對象的時候,最后的案例是開發一個飛機大戰的項目游戲
因此試着開發了一下還不錯,故獻上源代碼和所需要的圖片素材,想要試試開發的朋友可以直接下載到IDE上運行即可。
配置要求
- 安裝 python的游戲包 pygame 包
- python版本為3.0以上(安裝介紹:https://www.cnblogs.com/wqb123/articles/12433427.html)
文件要求
- 先新建一個文件夾命名:py_飛機大戰
- 命名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完成一次面向對象的小案例把~