python飞机大战代码/day14
import pygame
from pygame.locals import *
import random
import time
class HeroBullet(): #制作英雄子弹类
def __init__(self,x,y,windows): #c传入子弹的x,y坐标,和窗口
self.x=x
self.y=y
self.windows=windows
self.pic=pygame.image.load("D:\\王\\day1\\python使用软件\\IT研究院-Python\\New_Stydy\\img\\bullet_1.png") #添加背景图片
def draw(self): #把子弹画在窗口里
self.windows.blit(self.pic,(self.x,self.y)) #画出子弹的初始位置
self.move() #调用子弹,让子弹往上移动
def move(self):
self.y-=5 #让子弹往上移动
class enemyBullet(): #制作英雄子弹类
def __init__(self,x,y,windows): #c传入子弹的x,y坐标,和窗口
self.x=x
self.y=y
self.windows=windows
self.pic=pygame.image.load("D:\\王\\day1\\python使用软件\\IT研究院-Python\\New_Stydy\\img\\bullet2.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) #创建窗口,(480,650),长宽 0,32色深
bg=pygame.image.load("D:\\王\\day1\\python使用软件\\IT研究院-Python\\New_Stydy\\img\\background1.png") #添加背景图片
pygame.display.set_caption("灰机大战") #给游戏起一个名字
icon=pygame.image.load("D:\\王\\day1\\python使用软件\\IT研究院-Python\\New_Stydy\\img\\icon72x72.png") #添加背景图片
pygame.display.set_icon(icon) #更换游戏标头图片
#飞机动态效果实现,不断循环下面两张图片就会实现动态效果
heroPlane1=pygame.image.load("D:\\王\\day1\\python使用软件\\IT研究院-Python\\New_Stydy\\img\\hero1.png") #我方战斗机
heroPlane2=pygame.image.load("D:\\王\\day1\\python使用软件\\IT研究院-Python\\New_Stydy\\img\\hero2.png") #我方战斗机
#加载地方战斗机图片
enemyPlane=pygame.image.load("D:\\王\\day1\\python使用软件\\IT研究院-Python\\New_Stydy\\img\\enemy1.png")#敌方战斗机
#可以让飞机不停移动不用每次都要按一下上下左右,第一次按下的毫秒数,在30毫秒内不抬起键就将继续执行
pygame.key.set_repeat(20,30)
#设置我方飞机初始位置
heroPlaneX=190
heroPlaneY=526
#设置飞机初始循环条件,可以在下面实现飞机的动态效果
heroIndexShift=0
direct="左" #给敌机设置初始的方向值
enemyPlaneX=205 #敌方飞机的X轴坐标
enemyPlaneY=0 #敌方飞机的Y轴坐标
#我方的子弹列表,当调用BiuList.append(oneBiu)时子弹存到列表里,通过遍历子弹列表,然后调用draw() 画出子弹,然后通过remove(biu)让子弹移动。
BiuList=[]
#敌方的子弹列表,当调用BiuList.append(oneBiu)时子弹存到列表里,通过遍历子弹列表,然后调用draw() 画出子弹,然后通过remove(biu)让子弹移动。
enemyBiuList=[]
#敌方飞机被击中时出现的四张图片效果
enemyBombList=["D:\\王\\day1\\python使用软件\\IT研究院-Python\\New_Stydy\\img\\enemy1_down1.png",
"D:\\王\\day1\\python使用软件\\IT研究院-Python\\New_Stydy\\img\\enemy1_down2.png",
"D:\\王\\day1\\python使用软件\\IT研究院-Python\\New_Stydy\\img\\enemy1_down3.png",
"D:\\王\\day1\\python使用软件\\IT研究院-Python\\New_Stydy\\img\\enemy1_down4.png",
]
#我方飞机被击中时出现的四张图片效果
heroBombList=["D:\\王\\day1\\python使用软件\\IT研究院-Python\\New_Stydy\\img\\hero_blowup_n1.png",
"D:\\王\\day1\\python使用软件\\IT研究院-Python\\New_Stydy\\img\\hero_blowup_n2.png",
"D:\\王\\day1\\python使用软件\\IT研究院-Python\\New_Stydy\\img\\hero_blowup_n3.png",
"D:\\王\\day1\\python使用软件\\IT研究院-Python\\New_Stydy\\img\\hero_blowup_n4.png",
]
#设置开始值,敌方子弹开始没被击中,击中后值变为False
enemy_isBomb=False
#设置敌方图片爆炸前的初始值为0
enemy_BombIndex=0
#设置开始值,我方子弹开始没被击中,击中后值变为False
hero_isBomb=False
#设置我方图片爆炸前的初始值为0,然后开始一次轮播图片
hero_BombIndex=0
while True:
windows.blit(bg,(0,0)) #把图片bg贴到windows的窗口上
if direct=="左": #如果敌机的方向为左然后往左走
enemyPlaneX=enemyPlaneX-3
if enemyPlaneX<=0: #当到达左边以后改变方向,向右走
direct ="右"
if direct == "右": #如果敌机的方向为右然后往左走
enemyPlaneX=enemyPlaneX+3
if enemyPlaneX>=480-69: #当到达右边以后改变方向,向左走
direct = "左"
# 敌方战斗机爆炸
if enemy_isBomb==False:
windows.blit(enemyPlane, (enemyPlaneX, enemyPlaneY)) #贴飞敌方机图片
else: #否则执行飞机爆炸的事件
if enemy_BombIndex==len(enemyBiuList): #如果是最后一张飞机爆炸图片,就退出
time.sleep(1)
exit(0) #退出游戏
pic=pygame.image.load(enemyBombList[enemy_BombIndex]) #引入一张飞机爆炸图片
windows.blit(pic,(enemyPlaneX,enemyPlaneY)) #画出飞机以及位置
enemy_BombIndex=enemy_BombIndex+1 #换下一张图片
time.sleep(1)
# 我方飞机爆炸
if hero_isBomb==False: #飞机没爆炸就贴飞敌方机图片
if heroIndexShift == 0: #执行图片切换动态效果
windows.blit(heroPlane1, (heroPlaneX, heroPlaneY))
heroIndexShift = 1
else:
windows.blit(heroPlane2, (heroPlaneX, heroPlaneY))
heroIndexShift = 0
else: #飞机爆炸事件触发,执行飞机爆炸的事件
if hero_BombIndex==len(heroBombList):
time.sleep(1)
exit(0)
pic1=pygame.image.load(heroBombList[hero_BombIndex]) #引入一张飞机爆炸图片
windows.blit(pic1,(heroPlaneX,heroPlaneY)) #画出飞机以及位置
hero_BombIndex=hero_BombIndex+1 #换下一张图片
time.sleep(1)
#我方飞机子弹不断往上移动,到最上面就消失
for biu in BiuList: #设置一个子弹列表,让然后不断遍历子弹
biu.draw() #调用画子弹
BiuList.remove(biu) if biu.y<0 else "" #如果子弹到0位置就从列表中删除,避免列表中子弹过多
# 敌方飞机子弹不断往上移动,到最上面就消失
for biu in enemyBiuList: #设置一个子弹列表,让然后不断遍历子弹
biu.draw() #调用画子弹
enemyBiuList.remove(biu) if biu.y>650 else "" #如果子弹到0位置就从列表中删除,避免列表中子弹过多
for event in pygame.event.get(): #遍历事件
if event.type==QUIT: #如果是退出键
print("关闭了")
exit(0)
if event.type==KEYDOWN and event.type!=K_UP: #如果键按下去
if event.key==K_LEFT: #按左键
heroPlaneX=heroPlaneX-20 if heroPlaneX>5 else 0 #飞机X轴方向位置移动
if event.key==K_RIGHT:
heroPlaneX=heroPlaneX+20 if heroPlaneX<380 else 380
if event.key==K_UP:
heroPlaneY=heroPlaneY-20 if heroPlaneY>20 else 0
if event.key==K_DOWN:
heroPlaneY=heroPlaneY+20 if heroPlaneY<506 else 526
if event.key==K_SPACE: #按空格键发射子弹
oneBiu=HeroBullet(heroPlaneX+50-11,heroPlaneY-22,windows)
BiuList.append(oneBiu) #把子弹的一个个对象传到列表里
#敌机随机发射子弹
x=random.randint(0,50)
if x==6 or x==7:
oneBiu=enemyBullet(enemyPlaneX+69//2-9//2,enemyPlaneY+89,windows) #从敌机飞机机头的方向发射
enemyBiuList.append(oneBiu) #加入到敌机子弹列表
# 我方击中敌方,爆炸检测
dijiRect=Rect(enemyPlaneX,enemyPlaneY,69,89) #敌机x,y坐标,敌方飞机的长宽
for biu in BiuList: #遍历我方飞机的子弹,如果我方和敌方相遇就触发爆炸事假
biuRect=Rect(biu.x,biu.y,22,22) #我方飞机的x轴y轴,我方飞机子弹的长宽
if biuRect.colliderect(dijiRect): #判断我方飞机与对方飞机有没有相撞
BiuList.remove(biu) #删除子弹,只让子弹炸一次,穿过飞机的时候不再连续击中了
enemy_isBomb = True #飞机爆炸
#敌方击中我方
heroRect = Rect(heroPlaneX, heroPlaneY, 98, 124) #敌机x,y坐标,敌方飞机的长宽
for biu in enemyBiuList: #遍历我方飞机的子弹,如果我方和敌方相遇就触发爆炸事假
biuRect = Rect(biu.x, biu.y, 9, 21) #我方飞机的x轴y轴,我方飞机子弹的长宽
if biuRect.colliderect(heroRect): #判断我方飞机与对方飞机有没有相撞
enemyBiuList.remove(biu) #删除子弹,只让子弹炸一次,穿过飞机的时候不再连续击中了
hero_isBomb = True #飞机爆炸
pygame.display.update() #相当于拉开帷幕
#100 124