37,743
社区成员




- import pygame #引用第三方的模块
- import random #随机产生数据对象
- import time
- from pygame.locals import *
- pygame.init()
- #实现飞机的显示,并且可以控制飞机的移动{面向对象}
- class Mypiane(object):
- def __init__(self,screen):
- #设置默认的窗口初始化
- self.screen=screen #进行初始化
- #飞机的默认位置
- self.x=200 #飞机的横坐标
- self.y=600 #飞机的纵坐标
- #生成飞机的图片对象
- self.myimagenaem='./picture(图片)/plane.png' #插入飞机图片
- self.image=pygame.image.load(self.myimagenaem) #加载飞机
- #存放子弹的列表
- self.Shebullet=[]
- pass
- def moveleft(self): #左移动
- if self.x>0:
- self.x-=5
- pass
- def moverigth(self): #右移动
- if self.x<400:
- self.x+=5
- pass
- def moveup(self): #上移动
- if self.y<640:
- self.y-=5
- def movedown(self): #下移动
- if self.y>0:
- self.y+=5
- def display(self): #显示飞机
- self.screen.blit(self.image,(self.x,self.y))
- #完善子弹的展示逻辑
- needlist=[]
- for itme in self.Shebullet:
- if itme.judge():
- needlist.append(itme)
- pass
- pass
- for i in needlist:
- self.Shebullet.remove(i)
- pass
- for itmeA in self.Shebullet:
- itmeA.display() #显示子弹的位置
- bullet.move() #让子弹进行移动下次显示时候会看到子弹在修改后的位置
- pass
- #发射子弹
- def shebullet(self):
- #创建一个新的子弹对象
- newshebullet=bullet(self.x,self.y,self.screen)
- self.Shebullet.append(newshebullet)
- pass
- pass
- #创建我方子弹
- class bullet(object):
- def __init__(self,x,y,screen):
- self.x=x+10
- self.y=y-20
- self.screen=screen
- self.image=pygame.image.load("./picture(图片)/780.png")
- pass
- def disply(self): #调用子弹并调整初始位置
- self.screen.blit(self.image,(self.x,self.y))
- pass
- def move(self): #设置子弹的速度
- self.y-=2
- pass
- def judge(self): #判断子弹是否越界
- if self.y<0:
- return True
- else:
- return False
- #创建敌方飞机
- class enemypiane(object):
- def __init__(self,screen):
- #默认设置一个方向
- self.direction="right"
- # 设置默认的窗口初始化
- self.screen = screen # 进行初始化
- # 飞机的默认位置
- self.x = 0 # 飞机的横坐标
- self.y = 0 # 飞机的纵坐标
- # 生成飞机的图片对象
- self.myimagenaem = './picture(图片)/enemy.png' # 插入飞机图片
- self.image = pygame.image.load(self.myimagenaem) # 加载飞机
- self.Shebullet=[]
- pass
- #显示敌方飞机以及位置子弹信息
- def display(self):
- self.screen.blit(self.image,(self.x,self.y))
- needlist = []
- for itme in self.Shebullet:
- if itme.judge():
- needlist.append(itme)
- pass
- pass
- for i in needlist:
- self.Shebullet.remove(i)
- pass
- for itmeA in self.Shebullet:
- itmeA.display() # 显示子弹的位置
- bullet.move() # 让子弹进行移动下次显示时候会看到子弹在修改后的位置
- pass
- pass
- #敌方飞机随机发射
- def shebullet(self):
- num=random.randint(1,51)
- if num==3:
- newbullet=enemybullet(self.x,self.y)
- self.Shebullet.append(newbullet)
- pass
- #敌方飞机移动,随机进行的
- def enemymove(self):
- if self.direction=="rigth":
- self.x+=10
- pass
- elif self.direction=="left":
- self.x-=10
- pass
- if self.x>450-49:
- self.direction="left"
- pass
- elif self.x<0:
- self.direction="rigth"
- pass
- #创建敌方子弹
- class enemybullet(object):
- def __init__(self, x, y, screen):
- self.x = x
- self.y = y +5
- self.screen = screen
- self.image = pygame.image.load("./picture(图片)/enemybullet.png")
- pass
-
- def disply(self): # 调用子弹并调整初始位置
- self.screen.blit(self.image, (self.x, self.y))
- pass
-
- def move(self): # 设置子弹的速度
- self.y += 2
- pass
-
- def judge(self): # 判断子弹是否越界
- if self.y >700 :
- return True
- else:
- return False
-
- #检测键盘
- def key_boaed(Myobj): #定义普通的函数用来控制检测的对象
- evention=pygame.event.get()
- for even in evention: # 从队列中获取事件,并从队列中删除该事件
- if even.type == QUIT: # 按下x退出窗口
- print("退出")
- exit() #结束一个进程
- pass
- elif even.type == KEYDOWN:
- if even.type == K_a or even.type == K_LEFT: # 键盘按下a健或者是左键
- print("left")
- Myobj.moveleft() #调用函数左移动
- pass
- elif even.type == K_d or even.type == K_RIGHT: # 键盘按下d健或者是右键
- print("right")
- Myobj.moverigth() #调用函数右移动
- pass
- elif even.type==K_w or even.type==K_UP:
- print("up")
- Myobj.moveup() #调用函数上移动
- pass
- elif even.type==K_s or even.type==K_DOWN:
- print("down")
- Myobj.down() #调用函数下移动
- pass
- elif even.type == K_SPACE: # #键盘按下空格键
- print("按下 space ,发射子弹")
- Myobj.Shebullet()
- # 更新显示的内容
- pygame.display.update() # 更新软件的显示部分
- pass
-
- def main():
- #首先创建一个窗口,用来显示内容
- screen=pygame.display.set_mode((450,700))#初始化窗口或者屏幕以供显示
- #设定一个背景图片对象
- background=pygame.image.load('./picture(图片)/background(背景).png')#设置图片大小加载图片
- #设置标题(title)
- pygame.display.set_caption("阶段总结飞机")#设置当前题目
- #添加背景音乐
- pygame.mixer.init() #初始化mixer(声音)模块
- pygame.mixer.music.load('./picture(图片)/backgroundmusic.mp3')#导入音乐加载音乐
- pygame.mixer.music.set_volume((0.2)) #设置音量。参数0~1之间的浮点数
- pygame.mixer.music.play(-1) #开始播放音乐(循环次数),默认是0,设置为-1可不确定的重复播放
- #载入飞机图片
- plane=Mypiane(screen) #加载我方飞机
- #加载敌方飞机对象
- enemy=enemypiane(screen)
- #设定需要显示的内容
- while True:
- screen.blit(background,(0,0)) #调用并显示居中
- plane.display() #调用并显示居中我方飞机
- enemy.display() #显示调用敌方飞机
- #获取键盘事件
- key_boaed(plane)
- #更新显示的内容
- pygame.display.update()#更新软件的显示部分
- pass
- if __name__=="__main__":
- main()
-
执行出来:我方和敌方飞机不动,也不发射子弹,敲击键盘我方飞机不动
函数key_boade的代码后面不要加
pass
应该能解决问题。
或者
把事件循环好好的放在游戏循环里
这个没必要弄, 没有意义,