irpas技术客

Python飞机大战_Bayesian小孙

未知 4912

需求的描述:

存在四个对象: 我方飞机、敌方飞机、我方子弹、敌方子弹 功能:

背景音乐的添加

我方飞机可以移动【根据按键来控制的】 敌方飞机也可以移动【随机的自动移动】

双方飞机都可以发送子弹

步骤: 1.创建一个窗口 2.创建一个我方飞机 根据方向键左右的移动 3.给我方飞机添加发射子弹的功能【按下空格键去发送】 4.创建一个敌人飞机 5.敌人飞机可以自由的移动 6.敌人飞机可以自动的发射子弹

安装pygame过程中,使用命令pip install pygame -i Simple Index --trusted-host pypi.douban.com

问题:在安装第三方库时出现报错"These Packages Do Not Match The Hashes From The Requirements File." 原因:通常是因为网速问题导致的下载错误,导致对应的哈希值不匹配。

1.搭建界面 import pygame from pygame import * ## *表示导入包里面所有的内容(方法/属性等) def main(): # 首先创建一个窗口来显示内容 screen = pygame.display.set_mode((350, 500),depth=32) # 设定一个背景图片对象 background = pygame.image.load('./feiji/background.png') ##设定要显示的内容 while True: screen.blit(background, (0, 0)) ##(0,0)表示窗口位置居中 pygame.display.update() ##更新显示内容 pass if __name__=='__main__': ## main() 2.键盘检测 def main(): # 首先创建一个窗口来显示内容 screen = pygame.display.set_mode((350, 500), depth=32) # 设定一个背景图片对象 background = pygame.image.load('./feiji/background.png') ##设定要显示的内容 ##设置一个标题title pygame.mixer.init() pygame.mixer.music.load('./feiji/background.mp3') pygame.mixer.music.set_volume(0.2) ##设置音量大小 pygame.mixer.music.play(-1) ##-1表示循环播放音乐 ##载入玩家的飞机图片 hero=pygame.image.load('./feiji.png') #初始化玩家的位置 x,y=0,0 while True: screen.blit(background,(0,0)) ##显示玩家飞机的图片 screen.blit(hero,(x,y)) #显示玩家飞机的位置 screen.blit(background, (0, 0)) ##(0,0)表示窗口位置居中 eventList = pygame.event.get() for event in eventList: if event.type == QUIT: print('退出') exit() elif event.type == KEYDOWN: if event.type == K_a or event.type == K_LEFT: print('左键') elif event.type == K_d or event.type == K_RIGHT: print('右键') pass elif event.key == K_SPACE: print('空格键') pygame.display.update() ##更新显示内容 pass

接下来,通过面向对象来实现程序。

import pygame #引用第三方的模块 import random #随机产生数据的对象 import time from pygame.locals import * ''' 1: 实现飞机的显示 并且可以控制飞机的移动【面向对象】 ''' class HeroPlane(object): def __init__(self,screen): ''' 初始化函数 :param screen: 主窗体对象 ''' # 飞机的默认位置 self.x=150 self.y=450 # 设置要显示内容的窗口 self.screen=screen # 生成飞机的图片对象 self.imageName='./feiji/hero.png' self.image=pygame.image.load(self.imageName) # 用来存放子弹的列表 self.bulletList=[] pass def moveleft(self): ''' 左移动 :return: ''' if self.x>0: self.x-=10 pass def moveright(self): ''' 右移动 :return: ''' if self.x<350-40: self.x+=10 pass def display(self): ''' 在主窗口中显示飞机 :return: ''' self.screen.blit(self.image,(self.x,self.y)) # 完善子弹的展示逻辑 needDelItemList=[] for item in self.bulletList: if item.judge(): needDelItemList.append(item) pass pass # 重新遍历一下 for i in needDelItemList: self.bulletList.remove(i) pass 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): ''' :param x: :param y: :param 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)) pass def move(self): self.y-=2 pass def judge(self): ''' 判断子弹是否越界 :return: ''' if self.y<0: return True else: return False pass pass # 创建敌机类 class EnemyPlane: def __init__(self,screen): # 默认设置一个方向 self.direction='right' # 飞机的默认位置 self.x = 0 self.y = 0 # 设置要显示内容的窗口 self.screen = screen self.bulletList=[] # 生成飞机的图片对象 self.imageName = './feiji/enemy0.png' self.image = pygame.image.load(self.imageName) pass def display(self): ''' 显示敌机以及位置子弹的信息 :return: ''' self.screen.blit(self.image,(self.x,self.y)) # 完善子弹的展示逻辑 needDelItemList = [] for item in self.bulletList: if item.judge(): needDelItemList.append(item) pass pass # 重新遍历一下 for i in needDelItemList: self.bulletList.remove(i) pass for bullet in self.bulletList: bullet.display() # 显示子弹的位置 bullet.move() # 让这个子弹进行移动 下次再显示的时候就会看到子弹在修改后的位置 pass pass def sheBullet(self): ''' 敌机随机的发射子弹 :return: ''' num=random.randint(1,50) if num==3: newBullet=EnemyBullet(self.x,self.y,self.screen) self.bulletList.append(newBullet) pass def move(self): ''' 敌机移动 随机进行的 :return: ''' if self.direction=='right': self.x+=2 pass elif self.direction=='left': self.x-=2 pass if self.x>350-20: self.direction='left' pass elif self.x<0: self.direction='right' pass pass #敌机的子弹类 class EnemyBullet(object): def __init__(self,x,y,screen): ''' :param x: :param y: :param screen: ''' self.x=x self.y=y+10 self.screen=screen self.imgage=pygame.image.load('./feiji/bullet1.png') pass def display(self): self.screen.blit(self.imgage,(self.x,self.y)) pass def move(self): self.y+=2 pass def judge(self): ''' 判断子弹是否越界 :return: ''' if self.y>500: return True else: return False pass pass def key_control(HeroObj): ''' 定义普通的函数 用来实现键盘的检测 :param HeroObj: 可控制检测的对象 :return: ''' 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() #调用函数实现左移动 pass elif event.type == K_d or event.key == K_RIGHT: print('right') HeroObj.moveright() #调用函数实现右移动 pass elif event.key == K_SPACE: print('按下了空格键 space 发射子弹') HeroObj.sheBullet() pass def main(): #首先创建一个窗口 用来显示内容 screen=pygame.display.set_mode((350,500),depth=32) # 创建一个背景图片对象 background=pygame.image.load('./feiji/background.png') # 设置一个title pygame.display.set_caption('阶段总结-飞机小游戏') # 添加背景音乐 pygame.mixer.init() pygame.mixer.music.load('./feiji/background.mp3') pygame.mixer.music.set_volume(0.2) pygame.mixer.music.play(-1) #循环次数 -1表示无限循环 # 创建一个飞机对象了 hero=HeroPlane(screen) # 创建一个敌人飞机的对象 enemyplane=EnemyPlane(screen) # 设定要显示的内容 while True: screen.blit(background,(0,0)) # 显示玩家飞机的图片 hero.display() enemyplane.display() #显示敌机 enemyplane.move() #敌机移动 enemyplane.sheBullet()#敌机随机发送子弹 # 获取键盘事件 key_control(hero) # 更新显示内容 pygame.display.update() # time.sleep(1) #休眠一秒钟 pygame.time.Clock().tick(15) pass if __name__=='__main__': main()


1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,会注明原创字样,如未注明都非原创,如有侵权请联系删除!;3.作者投稿可能会经我们编辑修改或补充;4.本站不提供任何储存功能只提供收集或者投稿人的网盘链接。

标签: #python飞机大战 #install #Pygame #i #simple #inde