1. 程式人生 > >python開發飛機大戰

python開發飛機大戰

ner ace fire test 技術分享 設置背景圖片 wid 面向對象 super

1.使用pygame包,使用Python3.5版本
2.達到的效果是:
  出現一個窗口,顯示一張背景圖片,出現一架敵機和一架自己的飛機
  敵機在最上面,左右移動,隨機發子彈,自己的飛機使用鍵盤左右鍵左右移動,使用空格鍵發子彈
  當自己的飛機發出的子彈碰到敵機發出的子彈時,敵機的子彈消失
  當自己的飛機發出的子彈碰到敵機時,敵機原地摧毀後,再次出現開始遊戲
  當敵機發出的子彈碰到自己的飛機時,飛機原地摧毀,並退出遊戲

3.主要涉及,飛機運動,子彈檢測,子彈碰撞檢測等,使用面向對象的思路

技術分享

import pygame
from pygame.locals import *
import
time import random # 創建飛機的基類 class BasePlane(object): def __init__(self, screen, x, y, image): self.x = x self.y = y self.screen = screen self.image = pygame.image.load(image) self.is_hit = False # 此標誌用來表示飛機是否被擊中了 self.bullets = [] def test(self, bullets):
# 檢測飛機被擊中,子彈處於飛機的上 for bullet in bullets: if self.x < bullet.x < self.x + self.image.get_width() and self.y < bullet.y < self.y + self.image.get_height(): self.is_hit = True # 檢測子彈碰撞 for item in self.bullets: for bullet in bullets:
if item.x < bullet.x < item.x + item.image.get_width() and item.y < bullet.y < item.y + item.image.get_height(): item.isHit = True bullet.isHit = True # 創建我方飛機 class HeroPlane(BasePlane): def __init__(self, screen, image="./feiji/hero1.png"): super().__init__(screen, 210, 700, image) # 控制飛機移動的函數 def keyHander(self, keyValue): if keyValue == left: self.x -= 20 if self.x <= 0: self.x = 0 elif keyValue == right: self.x += 20 if self.x >= 380: self.x = 380 elif keyValue == "space": self.bullets.append(HeroBullet(self.screen, self.x + 40, self.y - 15)) def display(self): self.screen.blit(self.image, (self.x, self.y)) for bullet in self.bullets: if bullet.isHit: self.bullets.remove(bullet) else: bullet.display() bullet.move() if bullet.y <= 0: self.bullets.remove(bullet) # 創建敵機類 class EnermyPlane(BasePlane): def __init__(self, screen, ): self.direciton = "right" self.bullets = [] super().__init__(screen, 250, 0, "./feiji/enemy0.png") def display(self): self.screen.blit(self.image, (self.x, self.y)) for item in self.bullets: if item.isHit: self.bullets.remove(item) else: item.display() item.move() if item.y > 852: self.bullets.remove(item) def move(self): if self.direciton == "right": self.x += 3 elif self.direciton == "left": self.x -= 3 if self.x > 430: self.direciton = "left" elif self.x <= 0: self.direciton = "right" def fire(self): num = random.randint(0, 150) if num in [0, 75]: self.bullets.append(EnermyBullet(self.screen, self.x + 25, self.y + 20)) # 創建子彈基類 class BaseBullet(object): def __init__(self, screen, x, y, image): self.x = x self.y = y self.screen = screen self.isHit = False self.image = pygame.image.load(image) def display(self): self.screen.blit(self.image, (self.x, self.y)) # 創建我方子彈類 class HeroBullet(BaseBullet): def __init__(self, screen, x, y): super().__init__(screen, x, y, "./feiji/bullet.png") def move(self): self.y -= 5 # 創建敵機子彈類 class EnermyBullet(BaseBullet): def __init__(self, screen, x, y): super().__init__(screen, x, y, "./feiji/bullet1.png") def move(self): self.y += 5 # 鍵盤控制飛機的坐標 def key_control(hero): for event in pygame.event.get(): if event.type == QUIT: print("退出") exit() elif event.type == KEYDOWN: if event.key == K_a or event.key == K_LEFT: hero.keyHander("left") print("left") elif event.key == K_d or event.key == K_RIGHT: hero.keyHander("right") print("right") elif event.key == K_SPACE: hero.keyHander("space") print("space") def main(): # 創建一個窗口 screen = pygame.display.set_mode((480, 852), 0, 32) # 設置背景圖片 bgImageFile = "./feiji/background.png" background = pygame.image.load(bgImageFile) pygame.display.set_caption(飛機大戰) hero = HeroPlane(screen) enermy = EnermyPlane(screen) ‘‘ hero_nums = 0 enermy_nums = 0 while True: screen.blit(background, (0, 0)) # 顯示我方飛機 hero.display() hero.test(enermy.bullets) if hero.is_hit: hero_nums += 1 if hero_nums == 10: hero.image = pygame.image.load("./feiji/hero_blowup_n1.png") elif hero_nums == 20: hero.image = pygame.image.load("./feiji/hero_blowup_n2.png") elif hero_nums == 30: hero.image = pygame.image.load("./feiji/hero_blowup_n3.png") elif hero_nums == 40: hero.image = pygame.image.load("./feiji/hero_blowup_n4.png") elif hero_nums > 50: break # 顯示敵機 enermy.display() enermy.test(hero.bullets) if enermy.is_hit: enermy_nums += 1 if enermy_nums == 10: enermy.image = pygame.image.load("./feiji/enemy0_down1.png") elif enermy_nums == 20: enermy.image = pygame.image.load("./feiji/enemy0_down2.png") elif enermy_nums == 30: enermy.image = pygame.image.load("./feiji/enemy0_down3.png") elif enermy_nums == 40: enermy.image = pygame.image.load("./feiji/enemy0_down4.png") elif enermy_nums > 50: enermy = EnermyPlane(screen) enermy_nums = 0 else: enermy.move() enermy.fire() # 控制飛機的飛行方向 key_control(hero) pygame.display.update() time.sleep(0.01) if __name__ == __main__: main()

python開發飛機大戰