飞机大战 简化版
程序员文章站
2022-03-23 14:20:50
...
import pygame
from pygame.locals import *
import random
import time
class herobullet():
def __init__(self,x,y,windows):
self.x=x
self.y=y
self.windows=windows
self.pic=pygame.image.load('d:\\Desktop\\IT研究院-Python\\New_Stydy\\img\\bullet.png')
def draw(self):
self.windows.blit(self.pic,(self.x,self.y))
self.move()
def move(self):
self.y=self.y-5
class dijibullet():
def __init__(self,x,y,windows):
self.x=x
self.y=y
self.windows=windows
self.pic=pygame.image.load('d:\\Desktop\\IT研究院-Python\\New_Stydy\\img\\bullet1.png')
def draw(self):
self.windows.blit(self.pic,(self.x,self.y))
self.move()
def move(self):
self.y+=5
windows=pygame.display.set_mode((480,650),0,32)#建立窗口 0,32 为固定值
beijingtu=pygame.image.load('d:\\Desktop\\IT研究院-Python\\New_Stydy\\img\\1.png')#导入背景图
pygame.display.set_caption('飞机大战(小小争520)')#给窗口命名
icon=pygame.image.load('d:\\Desktop\\IT研究院-Python\\New_Stydy\\img\\liuzheng.png')#左上角可更改图片
pygame.display.set_icon(icon)#显示背景图
heroplane1=pygame.image.load('d:\\Desktop\\IT研究院-Python\\New_Stydy\\img\\hero1.png')#导入我方战机
heroplane2=pygame.image.load('d:\\Desktop\\IT研究院-Python\\New_Stydy\\img\\hero2.png')#为了使我方战机能够动态展示,再次导入一次其它相同战机
dijiplane=pygame.image.load('d:\\Desktop\\IT研究院-Python\\New_Stydy\\img\\666.png')#导入敌方战机
dijiplanelist=['d:\\Desktop\\IT研究院-Python\\New_Stydy\\img\\enemy1_down1.png',
'd:\\Desktop\\IT研究院-Python\\New_Stydy\\img\\enemy1_down2.png',
'd:\\Desktop\\IT研究院-Python\\New_Stydy\\img\\enemy1_down3.png',
'd:\\Desktop\\IT研究院-Python\\New_Stydy\\img\\enemy1_down4.png'
] #将敌方战机消灭动态放在敌方战机列表里,分别显示4个不同状态
pygame.key.set_repeat(50,10)#为了能够使按键持续按动
heroplaneX=190#我方战机在X轴坐标 从左上角开始
heroplaneY=526#我方战机在Y轴坐标
heroindexshift=0#切换照片用来显示动态效果
dijiplaneX=205.5#敌方战机在X轴坐标
dijiplaneY=0#敌方战机在Y轴坐标
direct='左'#敌方战机初始值方向 从左开始
biulist=[]#将我方发出的无数子弹放在一个列表里
dijibiulist=[]#将敌方发出的无数子弹放在一个列表里
dijiplanebomb=False #敌方飞机发射子弹开始不发射
dijiplanebombindex=0 #敌方飞机放在列表里 下标索引 初始值为0
while True:
windows.blit(beijingtu,(0,0))#将背景图贴到窗口
if heroindexshift==0:#刚要动的时候(动态效果刚开始时)
windows.blit(heroplane1,(heroplaneX,heroplaneY))
heroindexshift+=1
else:
windows.blit(heroplane2,(heroplaneX,heroplaneY))
heroindexshift=0
#我方两架战机叠加在一起来显示动态效果,一架飞机不可以显示动态,当闪动的时候说明叠加在一起
if direct=='左':#调整敌机方向 并不是指从左或右 开始 也可以用1,0表示 此时敌机只有左右移动
dijiplaneX-=3#敌方战机移动三个坐标值
if dijiplaneX<=0:#当敌机走到左侧临界窗口时,只能往右方向走 相反同理
direct='右'
if direct=='右':
dijiplaneX+=3
if dijiplaneX>=480-69:#敌机走到右侧临界窗口
direct='左' #此时敌机会折返往左走
if dijiplanebomb == False:#敌机还没有爆炸
windows.blit(dijiplane,(dijiplaneX,dijiplaneY))#还是原图
else:
if dijiplanebombindex==len(dijiplanelist):#否则 敌机爆炸
time.sleep(1)
exit()
pic=pygame.image.load(dijiplanelist[dijiplanebombindex])#4张以导入的敌机状态 用来显示爆炸后的状态
windows.blit(pic,(dijiplaneX,dijiplaneY))#敌机爆炸状态一一显示出来
dijiplanebombindex+=1# 0,1,2,3 这几张图片一一显示
time.sleep(0.5)#爆炸间隔0.5秒
for biu in biulist:#将我方发射的子弹从子弹库里提取出来
biu.draw()#将我方子弹画出来
biulist.remove(biu) if biu.y<0 else '' #当我方发射的子弹到达上边界时 移除子弹
for biu in dijibiulist:
biu.draw()
dijibiulist.remove(biu) if biu.y>650-69//2 else ''
for event in pygame.event.get():
if event.type==QUIT:
print('关闭了')
exit()
if event.type == KEYDOWN:
if event.key==K_LEFT:
print('向左')
heroplaneX=heroplaneX-5 if heroplaneX>=5 else 0
if event.key==K_RIGHT:
print('向右')
heroplaneX=heroplaneX+5 if heroplaneX<=375 else 380
if event.key==K_UP:
print('向上')
heroplaneY=heroplaneY-5 if heroplaneY>=5 else 0
if event.key==K_DOWN:
print('向下')
heroplaneY=heroplaneY+5 if heroplaneY<=521 else 526
if event.key==K_SPACE:
onebiu=herobullet(heroplaneX+50-11,heroplaneY-22,windows)
biulist.append(onebiu)#将每次按键发射的子弹加到子弹列表里
#对我方战机方向进行设定 上下左右,不能出边界 ,调用类函数 发射子弹位置在飞机中间:注意子弹也有长宽
x=random.randint(0,100)#
if x==12 or x==29:#让子弹随机发射 任意数均可
onebiu=dijibullet(dijiplaneX+69//2-9//2,dijiplaneY+89,windows)#敌机发射第一课子弹在飞机正中间
dijibiulist.append(onebiu)
dijiRect=Rect(dijiplaneX,dijiplaneY,69,69)#敌机看成矩形方便碰撞检测
for biu in biulist:
biuRect=Rect(biu.x,biu.y,22,22)#我方子弹看成矩形方便和敌机碰撞检测
if biuRect.colliderect(dijiRect):#碰撞检测
print('爆炸')
dijiplanebomb=True
biulist.remove(biu)
pygame.display.update()
下一篇: python创建进程fork用法