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(-10self.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.energyMidEnemy.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