python實踐——飛機大戰
阿新 • • 發佈:2020-12-09
需求: 我方飛機,敵方飛機,我方子彈,敵方子彈
功能: 我方飛機根據按鍵移動,敵方飛機也可以隨機自動移動
雙方飛機都可以傳送子彈
背景音樂的新增
步驟:
建立一個視窗
建立一個玩家飛機,根據方向鍵左右的移動
給我方飛機添加發射子彈的功能【按空格鍵傳送】
建立一個敵人飛機,敵人飛機可以自由的移動
敵人飛機可以自動的發射子彈
import pygame from pygame.locals import * ##匯入所有東西 def main (): screen=pygame.display.set_mode((700,400),0,32) ##建立一個視窗 backgrond=pygame.image.load('面向過程./feiji/background.jpg') #設定一個背景圖 pygame.display.set_caption('cz大戰zwt') ###新增背景音樂 pygame.mixer.init() pygame.mixer.music.load('./feiji/background.mp3') pygame.mixer.music.set_volume(0.2) #設定音量 pygame.mixer.music.play(-1) ##無限迴圈 ##載入玩家飛機圖片 zwt=pygame.image.load('./feiji/zwt.png') x,y=0,0 while True: screen.blit(backgrond,(0,0)) ##居中顯示背景圖 screen.blit(zwt, (x, y)) ##顯示玩家zwt圖片 ##獲取鍵盤事件 eventlist=pygame.event.get() for event in eventlist: if event.type==QUIT: print('退出') exit()pass elif event.type==KEYDOWN: if event.type==K_a or event.key==K_LEFT: print('left') if x>0: x-=30 elif event.type==K_d or event.key==K_RIGHT: print('right') if x<620: x+=30 elif event.key == K_SPACE: print('k_SPACE') pygame.display.update() ##更新顯示內容 pass if __name__=='__main__': main()
面向過程,程式碼臃腫,不易修改
import pygame import random import time from pygame.locals import * ''' 實現飛機的顯示,控制飛機的移動 ''' class HeroPlane(object): def __init__(self,screen): ##飛機的預設位置 self.x=225 self.y=510 ##設定顯示內容視窗 self.screen=screen ##生成飛機的圖片物件 #elf.imageName='./feiji/zwt.png' self.image=pygame.image.load('./feiji/zwt.png') ##存放子彈列表 self.bulletList=[] #self.image=pygame.image.load(self.imageName) pass def moveleft(self): if self.x>0: self.x-=30 pass def moveright(self): if self.x<380: self.x+=30 pass def display(self): self.screen.blit(self.image,(self.x,self.y)) ##完善子彈展示邏輯 needDelItemList=[] for item in self.bulletList: if item.judge(): needDelItemList.append(item) ###重新遍歷 for i in needDelItemList: self.bulletList.remove(i) for bullet in self.bulletList: bullet.display()##顯示子彈的位置 bullet.move()##讓子彈進行移動,下次再顯示的時候就會看到子彈修改後的位置 pass def sheBullet(self): newBullet=Bullet(self.x,self.y,self.screen) self.bulletList.append(newBullet) pass pass ###建立子彈類物件 class Bullet(object): def __init__(self,x,y,screen): self.x=x+13 self.y=y-20 self.screen=screen self.imgage=pygame.image.load('./feiji/Bullet.png') pass def display(self): self.screen.blit(self.imgage,(self.x,self.y)) def move(self): self.y-=8 def judge(self): ##判斷子彈越界 if self.y<0: return True else: return False ##敵人子彈 class EnemyBullet(object): def __init__(self,x,y,screen): self.x=x self.y=y+60 self.screen=screen self.imgage=pygame.image.load('./feiji/Bullet2.png') pass def display(self): self.screen.blit(self.imgage,(self.x,self.y)) def move(self): self.y+=2 def judge(self): ##判斷子彈越界 if self.y>550: return True else: return False ##建立敵人 class EnemyPlane: def __init__(self, screen): ##m預設設定一個方向 self.direction='right' ##飛機的預設位置 self.x = 0 self.y = 0 ##設定顯示內容視窗 self.screen = screen ##生成飛機的圖片物件 # elf.imageName='./feiji/zwt.png' self.image = pygame.image.load('./feiji/cz.png') self.bulletList=[] pass def display(self): self.screen.blit(self.image,(self.x,self.y)) needDelItemList = [] for item in self.bulletList: if item.judge(): needDelItemList.append(item) ###重新遍歷 for i in needDelItemList: self.bulletList.remove(i) for bullet in self.bulletList: bullet.display() ##顯示子彈的位置 bullet.move() ##讓子彈進行移動,下次再顯示的時候就會看到子彈修改後的位置 def sheBullet(self): ###敵人隨機發射子彈 num=random.randint(1,20) if num==3: newBullet=EnemyBullet(self.x,self.y,self.screen) self.bulletList.append(newBullet) def move(self): ##隨機移動 if self.direction=='right': self.x+=2 elif self.direction=='left': self.x-=2 if self.x>410: self.direction='left' elif self.x<0: self.direction='right' ##控制鍵盤 def key_control(HeroObj): eventlist = pygame.event.get() for event in eventlist: if event.type == QUIT: print('退出') exit() pass elif event.type == KEYDOWN: if event.type == K_a or event.key == K_LEFT: print('left') HeroObj.moveleft() elif event.type == K_d or event.key == K_RIGHT: print('right') HeroObj.moveright() elif event.key == K_SPACE: print('k_SPACE') HeroObj.sheBullet() pass ##主函式 def main (): screen=pygame.display.set_mode((450,550),0,32) ##建立一個視窗 backgrond=pygame.image.load('./feiji/background.jpg') #設定一個背景圖 pygame.display.set_caption('cz大戰zwt') ###新增背景音樂 pygame.mixer.init() pygame.mixer.music.load('./feiji/background.mp3') pygame.mixer.music.set_volume(0.1) #設定音量 pygame.mixer.music.play(-1) ##無限迴圈 ##建立飛機物件 hero=HeroPlane(screen) ##建立敵人 enemyplane=EnemyPlane(screen) while True: screen.blit(backgrond,(0,0)) ##居中顯示背景圖 hero.display() ##顯示我方飛機 enemyplane.display() ##顯示敵人 enemyplane.move()##敵人移動 enemyplane.sheBullet()##敵人發射子彈 key_control(hero) pygame.display.update() ##更新顯示內容 pygame.time.Clock().tick(15)##一秒執行多少次 if __name__=='__main__': main()面向物件
import pygame import random import time from pygame.locals import * ##抽象出來一個飛機的基類 class BasePlane(object): def __init__(self,screen,imagePath): self.screen=screen self.image=pygame.image.load(imagePath) self.bulletList=[] def display(self): self.screen.blit(self.image, (self.x, self.y)) ##完善子彈展示邏輯 needDelItemList = [] for item in self.bulletList: if item.judge(): needDelItemList.append(item) ###重新遍歷 for i in needDelItemList: self.bulletList.remove(i) for bullet in self.bulletList: bullet.display() ##顯示子彈的位置 bullet.move() ##讓子彈進行移動,下次再顯示的時候就會看到子彈修改後的位置 class CommonBullet(object): def __init__(self,x,y,screen,bulletType): self.type=bulletType self.screen=screen if self.type=='hero': self.x=x+13 self.y=y-20 self.imagePath='./feiji/Bullet.png' elif self.type=='enemy': self.x=x self.y=y+60 self.imagePath='./feiji/Bullet2.png' self.image=pygame.image.load(self.imagePath) def move(self): if self.type=='hero': self.y-=2 elif self.type=='enemy': self.y+=2 def display(self): self.screen.blit(self.image,(self.x,self.y)) def judge(self): if self.y>550 or self.y<0: return True else: return False class HeroPlane(BasePlane): def __init__(self,screen): ##飛機的預設位置 self.x=225 self.y=510 super().__init__(screen,'./feiji/zwt.png') def moveleft(self): if self.x>0: self.x-=30 pass def moveright(self): if self.x<380: self.x+=30 pass def sheBullet(self): newBullet=CommonBullet(self.x,self.y,self.screen,'hero') self.bulletList.append(newBullet) pass ##建立敵人 class EnemyPlane(BasePlane): def __init__(self, screen): ##m預設設定一個方向 self.direction='right' ##飛機的預設位置 self.x = 0 self.y = 0 super().__init__(screen,'./feiji/cz.png') pass def sheBullet(self): ###敵人隨機發射子彈 num=random.randint(1,20) if num==3: newBullet=CommonBullet(self.x,self.y,self.screen,'enemy') self.bulletList.append(newBullet) def move(self): ##隨機移動 if self.direction=='right': self.x+=2 elif self.direction=='left': self.x-=2 if self.x>410: self.direction='left' elif self.x<0: self.direction='right' def key_control(HeroObj): eventlist = pygame.event.get() for event in eventlist: if event.type == QUIT: print('退出') exit() pass elif event.type == KEYDOWN: if event.type == K_a or event.key == K_LEFT: print('left') HeroObj.moveleft() elif event.type == K_d or event.key == K_RIGHT: print('right') HeroObj.moveright() elif event.key == K_SPACE: print('k_SPACE') HeroObj.sheBullet() pass def main (): screen=pygame.display.set_mode((450,550),0,32) ##建立一個視窗 backgrond=pygame.image.load('./feiji/background.jpg') #設定一個背景圖 pygame.display.set_caption('cz大戰zwt') ###新增背景音樂 pygame.mixer.init() pygame.mixer.music.load('./feiji/background.mp3') pygame.mixer.music.set_volume(0.1) #設定音量 pygame.mixer.music.play(-1) ##無限迴圈 ##建立飛機物件 hero=HeroPlane(screen) ##建立敵人 enemyplane=EnemyPlane(screen) while True: screen.blit(backgrond,(0,0)) ##居中顯示背景圖 hero.display() ##顯示我方飛機 enemyplane.display() ##顯示敵人 enemyplane.move()##敵人移動 enemyplane.sheBullet()##敵人發射子彈 key_control(hero) pygame.display.update() ##更新顯示內容 pygame.time.Clock().tick(15)##一秒執行多少次 if __name__=='__main__': main()優化結構後