欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

飞机大战 简化版

程序员文章站 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()