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

猜你喜欢

转载自blog.csdn.net/qq_39112101/article/details/88314176
今日推荐