python实践——飞机大战
需求: 我方飞机,敌方飞机,我方子弹,敌方子弹
功能: 我方飞机根据按键移动,敌方飞机也可以随机自动移动
双方飞机都可以发送子弹
背景音乐的添加
步骤:
创建一个窗口
创建一个玩家飞机,根据方向键左右的移动
给我方飞机添加发射子弹的功能【按空格键发送】
创建一个敌人飞机,敌人飞机可以自由的移动
敌人飞机可以自动的发射子弹
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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()
面向过程,代码臃肿,不易修改
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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()
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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()