python飞机大战

import pygame
from plane import *
from pygame.locals import *
import bullet
import bullets

pygame.init()
bg_size=width,height=480,800
screen=pygame.display.set_mode(bg_size)
backgruond=pygame.image.load("./feiji/background.png").convert()
gameover=pygame.image.load("./feiji/gameover.png").convert()
gameover_rect=gameover.get_rect()
black=(0,0,0)
green=(0,255,0)
red=(255,0,0)
def add_small_enemies(group1,group2,num):
for i in range(num):
e1=bullet.SmallEnemy(bg_size)
group1.add(e1)
group2.add(e1)
def add_mid_enemies(group1,group2,num):
for i in range(num):
e2=bullet.MidEnemy(bg_size)
group1.add(e2)
group2.add(e2)
def add_big_enemies(group1,group2,num):
for i in range(num):
e3=bullet.BigEnemy(bg_size)
group1.add(e3)
group2.add(e3)
def start():#开始游戏
#生成我方飞机
myplan=Myplan(bg_size)
enemies=pygame.sprite.Group()
#生成敌人小型飞机
small_enemies=pygame.sprite.Group()
add_small_enemies(small_enemies,enemies,15)
#中型
mid_enemies = pygame.sprite.Group()
add_mid_enemies(mid_enemies, enemies, 5)
#大型
big_enemies = pygame.sprite.Group()
add_big_enemies(big_enemies, enemies, 2)
#生成子弹
bullet1=[]
bullet1_index=0
BULLET1_NUM=4
for i in range(BULLET1_NUM):
bullet1.append(bullets.Bullet(myplan.rect.midtop))

#中弹图片索引
e1_destory_index=0
e2_destory_index = 0
e3_destory_index = 0
me_destory_index = 0
colock=pygame.time.Clock()
#用于延迟
delay=100
runing=True
#用于切换图片
switch_image=True
while runing:
    for event in pygame.event.get():
        if event.type == QUIT:
            print('exit')
            exit()
        elif event.type == KEYDOWN:
            if event.key == K_a or event.key == K_LEFT:
                print('left')
                myplan.move_left()
            elif event.key == K_d or event.key == K_RIGHT:
                print('right')
                myplan.move_right()
            elif event.key == K_w or event.key==K_UP:
                print('up')
                myplan.move_up()
            elif event.key==K_s or event.key==K_DOWN:
                print("down")
                myplan.move_down()
    screen.blit(backgruond,(0,0))
    #发射子弹
    if not delay%10:
        bullet1[bullet1_index].reset(myplan.rect.midtop)
        bullet1_index=(bullet1_index+1)%BULLET1_NUM
    #检测子弹是否击中敌机
    for b in bullet1:
        if b.active:
            b.move()
            screen.blit(b.image,b.rect)
            enemy_hit=pygame.sprite.spritecollide(b,enemies,False,pygame.sprite.collide_mask)
            if enemy_hit:
                b.active=False
                for e in enemy_hit:
                    if e in mid_enemies or e in big_enemies:
                        e.energy-=1
                        if e.energy==0:
                            e.active=False
                    else:
                        e.active=False
    #绘制大型飞机
    for each in big_enemies:
        if each.active:
            each.move()
            if each.hit:
                screen.blit(each.image_hit,each.rect)
                each.hit=False
            else:
                if switch_image:
                    screen.blit(each.image1,each.rect)
                else:
                    screen.blit(each.image2,each.rect)
                #绘制血槽
                pygame.draw.line(screen,black,\
                                 (each.rect.left,each.rect.top-5),\
                                 (each.rect.right,each.rect.top-5),\
                                 2
                                 )
                #当生命值大于%20显示绿色,否则显示红色
                energy_remain=each.energy/bullet.BigEnemy.energy
                if energy_remain>0.2:
                    energy_color=green
                else:
                    energy_color=red
                pygame.draw.line(screen,energy_color,\
                                 (each.rect.left,each.rect.top-5),\
                                 (each.rect.left+each.rect.width*energy_remain,\
                                  each.rect.top-5),2
                                 )
                #毁灭
        else:
            if not(delay%3):
                screen.blit(each.destory_image[e3_destory_index],each.rect)
                e3_destory_index=(e3_destory_index+1)%6
                if e3_destory_index==0:
                    each.reset()
    #绘制中型飞机
        for each in mid_enemies:
            if each.active:
                each.move()
                if each.hit:
                    screen.blit(each.image_hit,each.rect)
                    each.hit=False
                else:
                    screen.blit(each.image,each.rect)
                screen.blit(each.image,each.rect)
                # 绘制血槽
                pygame.draw.line(screen, black, \
                                 (each.rect.left, each.rect.top - 5), \
                                 (each.rect.right, each.rect.top - 5), \
                                 2
                                 )
                # 当生命值大于%20显示绿色,否则显示红色
                energy_remain = each.energy / bullet.MidEnemy.energy
                if energy_remain > 0.2:
                    energy_color = green
                else:
                    energy_color = red
                pygame.draw.line(screen, energy_color, \
                                 (each.rect.left, each.rect.top - 5), \
                                 (each.rect.left + each.rect.width * energy_remain, \
                                  each.rect.top - 5), 2
                                 )
                #毁灭
            else:
                if not (delay % 3):
                    screen.blit(each.destory_image[e2_destory_index], each.rect)
                    e2_destory_index = (e2_destory_index + 1) % 4
                    if e3_destory_index == 0:
                        each.reset()
    #绘制小型飞机
    for each in small_enemies:
        if each.active:
            each.move()
            screen.blit(each.image,each.rect)
            # 绘制血槽
            pygame.draw.line(screen, black, \
                             (each.rect.left, each.rect.top - 5), \
                             (each.rect.right, each.rect.top - 5), \
                             2
                             )
            # 当生命值大于%20显示绿色,否则显示红色
            energy_remain = each.energy / bullet.SmallEnemy.energy
            if energy_remain > 0.2:
                energy_color = green
            else:
                energy_color = red
            pygame.draw.line(screen, energy_color,\
                             (each.rect.left, each.rect.top - 5), \
                             (each.rect.left + each.rect.width * energy_remain, \
                              each.rect.top - 5), 2
                             )
            #毁灭
        else:
            if not (delay % 3):
                screen.blit(each.destory_image[e1_destory_index], each.rect)
                e1_destory_index = (e1_destory_index + 1) % 4
                if e1_destory_index == 0:
                    each.reset()
    #检测我方飞机是否被撞
    enemies_down=pygame.sprite.spritecollide(myplan,enemies,False,pygame.sprite.collide_mask)
    if enemies_down:
        myplan.active=False
        for e in enemies_down:
            e.ative=False
    #绘制我方飞机
    if myplan.active:
        if switch_image:
            screen.blit(myplan.image1,myplan.rect)
        else:
            screen.blit(myplan.image2, myplan.rect)
    else:
        #毁灭
            if not (delay % 3):
                screen.blit(myplan.destory_image[me_destory_index], myplan.rect)
                me_destory_index = (me_destory_index + 1) % 4
                if e1_destory_index == 0:
                    print("game over")
                    screen.blit(gameover,gameover_rect)
                    runing=False



            #用于切换图片
    delay-=1
    if not delay:
        delay=100
    if not(delay%5==0):
        switch_image = not switch_image
    pygame.display.flip()
    colock.tick(60)

if name==“main”:
start()

#定义我方飞机
import pygame
import random
class Myplan(pygame.sprite.Sprite):
def init(self,bg_size):
pygame.sprite.Sprite.init(self)
self.image1=pygame.image.load("./feiji/hero1.png").convert_alpha()#倒入飞机图片
self.image2 = pygame.image.load("./feiji/hero2.png").convert_alpha() # 倒入飞机图片
self.destory_image=[]#把飞机毁灭图片存入列表
self.destory_image.extend([
pygame.image.load("./feiji/hero_blowup_n1.png").convert_alpha(),#导入飞机毁灭图片
pygame.image.load("./feiji/hero_blowup_n2.png").convert_alpha(),
pygame.image.load("./feiji/hero_blowup_n3.png").convert_alpha(),
pygame.image.load("./feiji/hero_blowup_n4.png").convert_alpha()
])
self.rect=self.image1.get_rect()
self.width,self.height=bg_size[0],bg_size[1]
#我方飞机初始化位置
self.rect.left,self.rect.top=
(self.width-self.rect.width)//2,
self.height-self.rect.height-60
self.speed=50#速度
self.mask=pygame.mask.from_surface(self.image1)
self.active = True # 判断是否存活
def move_up(self):#移动方法
if self.rect.top>0:
self.rect.top-=self.speed
else:
self.rect.top=0
def move_down(self):
if self.rect.bottom<self.height-60:
self.rect.bottom+=self.speed
else:
self.rect.bottom=self.height-60
def move_left(self):
if self.rect.left>0:
self.rect.left-=self.speed
else:
self.rect.left=0
def move_right(self):
if self.rect.right<self.width:
self.rect.right+=self.speed
else:
self.rect.right=self.width

#定义敌人飞机
import random
import pygame
class SmallEnemy(pygame.sprite.Sprite):#生成小型敌机
energy=1
def init(self,bg_size):
pygame.sprite.Sprite.init(self)
self.image=pygame.image.load("./feiji/enemy0.png").convert_alpha()#导入敌机图片
self.destory_image=[]
self.destory_image.extend([
pygame.image.load("./feiji/enemy0_down1.png").convert_alpha(),#导入敌机毁灭图片
pygame.image.load("./feiji/enemy0_down2.png").convert_alpha(),
pygame.image.load("./feiji/enemy0_down3.png").convert_alpha(),
pygame.image.load("./feiji/enemy0_down4.png").convert_alpha()
])
self.rect=self.image.get_rect()
self.width,self.height=bg_size[0],bg_size[1]
self.speed=2#敌机速度
self.active = True # 判断是否存活
self.rect.left,self.rect.top=
random.randint(0,self.width-self.rect.width),
random.randint(-5self.height,0)
self.mask = pygame.mask.from_surface(self.image)
self.energy=SmallEnemy.energy
def move(self):
if self.rect.top<self.height:
self.rect.top+=self.speed
else:
self.reset()
def reset(self):
self.energy = SmallEnemy.energy
self.active = True # 判断是否存活
self.rect.left,self.rect.top=
random.randint(0, self.width - self.rect.width),
random.randint(-5 * self.height, 0)
class MidEnemy(pygame.sprite.Sprite):
energy=8
def init(self,bg_size):
pygame.sprite.Sprite.init(self)
self.image=pygame.image.load("./feiji/enemy1.png").convert_alpha()
self.image_hit=pygame.image.load("./feiji/enemy1_hit.png").convert_alpha()
self.destory_image=[]
self.destory_image.extend([
pygame.image.load("./feiji/enemy1_down1.png"),
pygame.image.load("./feiji/enemy1_down2.png"),
pygame.image.load("./feiji/enemy1_down3.png"),
pygame.image.load("./feiji/enemy1_down4.png")
])
self.mask = pygame.mask.from_surface(self.image)
self.rect=self.image.get_rect()
self.width,self.height=bg_size[0],bg_size[1]
self.speed=1#敌机速度
self.active = True # 判断是否存活
self.rect.left,self.rect.top=
random.randint(0,self.width-self.rect.width),
random.randint(-10
self.height,-self.height)
self.energyMidEnemy.energy
self.hit=True
def move(self):
if self.rect.top<self.height:
self.rect.top+=self.speed
else:
self.reset()
def reset(self):
self.energy
MidEnemy.energy
self.active = True # 判断是否存活
self.rect.left,self.rect.top=
random.randint(0, self.width - self.rect.width),
random.randint(-10 * self.height, -self.height)
class BigEnemy(pygame.sprite.Sprite):
energy=20
def init(self,bg_size):
pygame.sprite.Sprite.init(self)
self.image1=pygame.image.load("./feiji/enemy2_hit.png").convert_alpha()
self.image2 = pygame.image.load("./feiji/enemy-3.gif").convert_alpha()
self.image_hit=pygame.image.load("./feiji/enemy2_hit.png").convert_alpha()
self.destory_image=[]
self.destory_image.extend([
pygame.image.load("./feiji/enemy2_down1.png").convert_alpha(),
pygame.image.load("./feiji/enemy2_down2.png").convert_alpha(),
pygame.image.load("./feiji/enemy2_down3.png").convert_alpha(),
pygame.image.load("./feiji/enemy2_down4.png").convert_alpha(),
pygame.image.load("./feiji/enemy2_down5.png").convert_alpha(),
pygame.image.load("./feiji/enemy2_down6.png").convert_alpha()
])
self.mask = pygame.mask.from_surface(self.image1)
self.rect=self.image1.get_rect()
self.width,self.height=bg_size[0],bg_size[1]
self.speed=1#敌机速度
self.active=True#判断是否存活
self.rect.left,self.rect.top=
random.randint(0,self.width-self.rect.width),
random.randint(-15self.height,-5self.height)
self.energy=BigEnemy.energy
self.hit=True
def move(self):
if self.rect.top<self.height:
self.rect.top+=self.speed
else:
self.reset()
def reset(self):
self.energy = BigEnemy.energy
self.active = True # 判断是否存活
self.rect.left,self.rect.top=
random.randint(0, self.width - self.rect.width),
random.randint(-15 * self.height, -5*self.height)

#定义子弹类
import pygame
class Bullet(pygame.sprite.Sprite):
def init(self,posstion):
pygame.sprite.Sprite.init(self)
#导入子弹图片
self.image= pygame.image.load("./feiji/bullet.png").convert_alpha()
self.rect=self.image.get_rect()
self.left,self.top=posstion#子弹生成位置
self.speed=12
self.active=True#判断子弹是否出界
self.mask=pygame.sprite.from_surface(self.image)
def move(self):
self.rect.top-=self.speed
if self.top<0:
self.active=False
def reset(self,posstion):
self.rect.left,self.rect.top=posstion
self.active=True

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值