开始挑战30天从零开始———>python全栈工程师
Day2:飞机大战小程序
花了点时间Debug总体效果还行,有一点点进步,下一步异常检测
#飞机大战小游戏 import time import pygame from pygame.locals import * import sys import random #玩家类 #属性:显示窗口、位置、图片、子弹列表、移动状态 #方法:显示、移动、开火 class Player(): def __init__(self,screen): self.screen=screen#将一个窗口对象作为了属性值,表示玩家对象显示的窗口 self.x=150 self.y=500 self.img=pygame.image.load(r"C:\Users\************************************************\feiji\hero1.png") self.bulletList=[]#子弹列表 self.moveLeftState=0#0--不移动 1--移动 self.moveRightState=0 self.moveUpstate=0 self.moveDownstate=0 def display(self): self.screen.blit(self.img,(self.x,self.y)) for b in self.bulletList: #便利每一个子弹对象,并显示 b.display() b.move() if b.y<0: #子弹移动到边缘时被清除 self.bulletList.remove(b) def move(self): if self.moveLeftState==1 and self.x>-50: self.x-=5 if self.moveRightState==1 and self.x<250: self.x+=5 if self.moveUpstate==1 and self.y>-50: self.y-=5 if self.moveDownstate==1 and self.y<550: self.y+=5 def fire(self): b=PlayerBullet(self.screen,self.x,self.y) self.bulletList.append(b) #玩家子弹类: #属性:显示窗口、位置、图片 #方法:显示、移动 class PlayerBullet(): def __init__(self,screen,x,y): self.screen=screen#将一个窗口对象作为了属性值,表示玩家对象显示的窗口 self.x=x+40 #子弹初始位置,需要跟随飞机✈ self.y=y-20 self.img=pygame.image.load(r"C:\Users\****************************************\feiji\bullet.png") self.bulletList=[]#子弹列表 self.moveLeftState=0#0--不移动 1--移动 self.moveRightState=0 def display(self): self.screen.blit(self.img,(self.x,self.y)) def move(self): self.y-=20 #敌机类 #属性:显示窗口、位置、图片、子弹列表、移动状态、被击中次数 #方法:显示、移动、开火 class Enemy(): def __init__(self,screen): self.screen=screen#将一个窗口对象作为了属性值,表示玩家对象显示的窗口 self.x=0 self.y=0 self.img=pygame.image.load(r"C:\Users\**************************\feiji\enemy0.png") self.bulletList=[]#子弹列表 self.moveState=1#0--左移 1--右移 def display(self): self.screen.blit(self.img,(self.x,self.y)) #显示所有子弹 for b in self.bulletList: #便利每一个子弹对象,并显示 b.display() b.move() if b.y>=600: #子弹移动到边缘时被清除 self.bulletList.remove(b) def move(self): if self.moveState==1: self.x+=5#向右移动5个像素 elif self.moveState==0: self.x-=5#向左移动5个像素 if self.x<0: self.moveState=1 elif self.x>250: self.moveState=0 def fire(self):#在子弹列表中增加一个子弹对象 b=EnemyBullet(self.screen,self.x,self.y) self.bulletList.append(b) #敌机子弹类 #属性:显示窗口、位置、图片、子弹列表、移动状态、被击中次数 #方法:显示、移动、开火 class EnemyBullet(): def __init__(self,screen,x,y): self.screen=screen#将一个窗口对象作为了属性值,表示玩家对象显示的窗口 self.x=x+20 self.y=y+30 self.img=pygame.image.load(r"C:\Users\************************************************\feiji\bullet2.png") self.bulletList=[]#子弹列表 self.moveLeftState=0#0--不移动 1--移动 self.moveRightState=0 def display(self): self.screen.blit(self.img,(self.x,self.y)) def move(self): self.y+=20 #键盘监控 def Key_control(player): for event in pygame.event.get(): if event.type==QUIT: print("正在退出!") sys.exit(0)#强制退出 elif event.type==KEYDOWN:#键盘键入 if event.key==K_LEFT: print("玩家向左!") player.moveLeftState=1 # player.moveRightState=0 # # player.x-=10 if event.key==K_RIGHT: # player.x+=10 print("玩家向右!") player.moveRightState=1 # player.moveLeftState=0 if event.key==K_UP: print("玩家向上!") player.moveUpstate=1 if event.key==K_DOWN: print("玩家向下!") player.moveDownstate=1 if event.key==K_SPACE:#捕捉空格键 print("玩家开火!") player.fire() elif event.type==KEYUP:#键盘释放 if event.key==K_LEFT:#释放左键 print("停止向左...") player.moveLeftState=0 if event.key==K_RIGHT:#释放右键 print("停止向右...") player.moveRightState=0 if event.key==K_UP: print("玩家向上!") player.moveUpstate=0 if event.key==K_DOWN: print("玩家向下!") player.moveDownstate=0 #main()方法 def main(): screen=pygame.display.set_mode((300,600))#创建窗口对象 #获取背景 background=pygame.image.load(r"C:\Users\**************************************************\feiji\background.png") #创建玩家对象,并传入显示窗口 player=Player(screen) #创建敌机对象,并传入显示窗口 enemy=Enemy(screen) #在循环中显示所有对象并刷新 while 1==1: screen.blit(background,(0,0))#显示背景 player.display()#显示玩家 enemy.display()#显示敌机 enemy.move()#敌机移动 player.move() r=random.randint(1,15) if r==1: enemy.fire()#敌机开火 Key_control(player)#捕获用户操作 pygame.display.update()#刷新窗口 time.sleep(0.05) #------------------------------------------------------------------- if __name__=='__main__': main()
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,请务用于商业用途!
3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员!
8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载
声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性