python面向物件實戰應用:打飛機
阿新 • • 發佈:2019-02-13
抽象出基類:#coding=utf-8 import pygame from pygame.locals import * import time import random class HeroPlane(object): def __init__(self,screen): # 飛機預設位置 self.x=230 self.y=600 # 設定要顯示內容的視窗 self.screen=screen # 儲存飛機圖片名字 self.imageName='./plane/hero.gif' # 生成飛機 self.image=pygame.image.load(self.imageName).convert() # 英雄飛機子彈儲存 self.bulletList=[] def display(self): self.screen.blit(self.image,(self.x,self.y)) # 子彈顯示 needDelItemList = [] for i in self.bulletList: if i.judge(): needDelItemList.append(i) for i in needDelItemList: self.bulletList.remove(i) # 更新飛機子彈發射所有子彈位置 for bullet in self.bulletList: bullet.display() bullet.move() def moveLedt(self): self.x -=10 def moveRight(self): self.x +=10 # def sheBullet(self): newBullet = Bullet(self.x,self.y,self.screen) self.bulletList.append(newBullet) class Bullet(object): """docx,y,screening for Bullet""" def __init__(self, x,y,screen): self.x = x+40 self.y = y-20 self.screen = screen self.image =pygame.image.load('./plane/bullet-3.gif').convert() def move(self): self.y -= 2 def display(self): self.screen.blit(self.image,(self.x,self.y)) def judge(self): if self.y<0: return True else: return False class EnemyPlane(object): """docstring for EnemyPlane""" def __init__(self, screen): # 敵人飛機預設位置 self.x = 0 self.y = 0 self.screen =screen self.imageName ='plane/enemy-1.gif' self.image = pygame.image.load(self.imageName).convert() # 敵人子彈列表 self.bulletList = [] # 敵機預設位置 self.direction = 'right' def display(self): self.screen.blit(self.image,(self.x,self.y)) needDelItemList = [] for i in self.bulletList: if i.judge(): needDelItemList.append(i) for i in needDelItemList: self.bulletList.remove(i) for bullet in self.bulletList: bullet.display() bullet.move() # 如果碰到了右邊的邊界,那麼就往左走,如果碰到了左邊的邊界,那麼就往右走 def move(self): if self.direction == 'right': self.x += 2 elif self.direction == 'left': self.x -= 2 if self.x > 480-50: self.direction ='left' elif self.x < 0: self.direction = 'right' def sheBullet(self): num =random.randint(1,100) if num ==2: newBullet = EnemyBullet(self.x,self.y,self.screen) self.bulletList.append(newBullet) class EnemyBullet(object): def __init__(self,x,y,screen): self.x = x+30 self.y = y+30 self.screen =screen self.image =pygame.image.load('./plane/bullet-1.gif').convert() def move(self): self.y +=2 def display(self): self.screen.blit(self.image,(self.x,self.y)) def judge(self): if self.y> 890: return True else: return False # 搭建介面,視窗和背景圖顯示 if __name__=='__main__': # 建立視窗內容顯示 screen = pygame.display.set_mode((480,890),0,32) # 視窗背景 background = pygame.image.load('./plane/background.png') # 建立飛機物件 heroPlane = HeroPlane(screen) # 建立敵人飛機 enemyPlane = EnemyPlane(screen) # 背景放入視窗 while True: screen.blit(background,(0,0)) # 螢幕顯示飛機位置 heroPlane.display() enemyPlane.move() enemyPlane.sheBullet() enemyPlane.display() # 按鍵檢測 for event in pygame.event.get(): if event.type == QUIT: print('exit') exit() elif event.type == KEYDOWN: if event.key == K_a or event.key == K_LEFT: print('left') # x +=5 heroPlane.moveLedt() elif event.key == K_d or event.key == K_RIGHT: print('right') # x -=5 heroPlane.moveRight() elif event.key ==K_SPACE: print('space') heroPlane.sheBullet() # 延時模組,降低while的迴圈時間 time.sleep(0.01) # 更新螢幕 pygame.display.update()
#coding=utf-8 import time import random import pygame from pygame.locals import * class Base(object): def __init__(self,screen,name): self.name = name #設定要顯示內容的視窗 self.screen = screen class Plane(Base): def __init__(self,screen,name): super().__init__(screen,name) self.image = pygame.image.load(self.imageName).convert() #用來儲存英雄飛機發射的所有子彈 self.bulletList = [] def display(self): #更新飛機的位置 self.screen.blit(self.image,(self.x,self.y)) #判斷一下子彈的位置是否越界,如果是,那麼就要刪除這顆子彈 # #這種方法會漏掉很多需要刪除的資料 # for i in self.bulletList: # if i.y<0: # self.bulletList.remove(i) #存放需要刪除的物件資訊 needDelItemList = [] for i in self.bulletList: if i.judge(): needDelItemList.append(i) for i in needDelItemList: self.bulletList.remove(i) # del needDelItemList #更新及這架飛機發射出的所有子彈的位置 for bullet in self.bulletList: bullet.display() bullet.move() #修改所有子彈的位置 # for bullet in self.bulletList: # bullet.y -= 2 def sheBullet(self): newBullet = PublicBullet(self.x,self.y,self.screen,self.name) self.bulletList.append(newBullet) class HeroPlane(Plane): def __init__(self,screen,name): #設定飛機預設的位置 self.x = 230 self.y = 600 self.imageName = "./plane/hero.gif" super().__init__(screen,name) def moveLeft(self): self.x -= 10 def moveRight(self): self.x += 10 class EnemyPlane(Plane): #重寫父類的__init_-方法 def __init__(self,screen,name): #設定飛機預設的位置 self.x = 0 self.y = 0 self.imageName = "./plane/enemy-1.gif" #呼叫父類的__init__方法 super().__init__(screen,name) self.direction = "right" def move(self): #如果碰到了右邊的邊界,那麼就往左走,如果碰到了左邊的邊界,那麼就往右走 if self.direction == "right": self.x += 2 elif self.direction == "left": self.x -= 2 if self.x>480-50: self.direction = "left" elif self.x<0: self.direction = "right" def sheBullet(self): num = random.randint(1,100) if num == 88: super().sheBullet() class PublicBullet(Base): def __init__(self,x,y,screen,planeName): super().__init__(screen,planeName) if self.name == "hero": self.x = x+40 self.y = y-20 imageName = "./plane/bullet-3.gif" elif self.name == "enemy": self.x = x+30 self.y = y+30 imageName = "./plane/bullet-1.gif" self.image = pygame.image.load(imageName).convert() def move(self): if self.name == "hero": self.y -= 2 elif self.name == "enemy": self.y += 2 def display(self): self.screen.blit(self.image,(self.x,self.y)) def judge(self): if self.y>890 or self.y<0: return True else: return False if __name__ == "__main__": #1. 建立一個視窗,用來顯示內容 screen = pygame.display.set_mode((480,890),0,32) #2. 建立一個和視窗大小的圖片,用來充當背景 background = pygame.image.load("./plane/background.png").convert() #3. 建立一個飛機物件 heroPlane = HeroPlane(screen,"hero") #4. 建立一個敵人飛機 enemyPlane = EnemyPlane(screen,"enemy") #3. 把背景圖片放到視窗中顯示 while True: screen.blit(background,(0,0)) heroPlane.display() enemyPlane.move() enemyPlane.sheBullet() enemyPlane.display() #判斷是否是點選了退出按鈕 for event in pygame.event.get(): # print(event.type) if event.type == QUIT: print("exit") exit() elif event.type == KEYDOWN: if event.key == K_a or event.key == K_LEFT: print('left') heroPlane.moveLeft() #控制飛機讓其向左移動 elif event.key == K_d or event.key == K_RIGHT: print('right') heroPlane.moveRight() elif event.key == K_SPACE: print("space") heroPlane.sheBullet() time.sleep(0.01) pygame.display.update()