pygame 简陋版飞机大战
看完90讲后借用小甲鱼老师的素材先试着写了一下,待完善……import pygame as py
import random
from threading import Thread
#小飞机类
class Small_plane(py.sprite.Sprite):
def __init__(self,name,down1,down2,down3,down4,speed):
super().__init__()
self._image = py.image.load(name).convert_alpha()
self._down1 = py.image.load(down1).convert_alpha()
self._down2 = py.image.load(down2).convert_alpha()
self._down3 = py.image.load(down3).convert_alpha()
self._down4 = py.image.load(down4).convert_alpha()
self._speed = speed
self.rect = self._image.get_rect()
self.rect.left,self.rect.top = random.randint(0,423),-43
self._collide = False
def move(self):
self.rect = self.rect.move(self._speed)
#中飞机类
class Middle_plane(py.sprite.Sprite):
def __init__(self,name,name1,down1,down2,down3,down4,speed):
super().__init__()
self._image = py.image.load(name).convert_alpha()
self._image1 = py.image.load(name1).convert_alpha()
self._down1 = py.image.load(down1).convert_alpha()
self._down2 = py.image.load(down2).convert_alpha()
self._down3 = py.image.load(down3).convert_alpha()
self._down4 = py.image.load(down4).convert_alpha()
self._speed = speed
self.rect = self._image.get_rect()
self.rect.left,self.rect.bottom = random.randint(0,411),0
self._collide = False
self._hit = 0
def move(self):
self.rect = self.rect.move(self._speed)
def blood(self,screen):
width = 11.5 * (6 - self._hit)
if self._hit == 0:
py.draw.rect(screen,(0,255,0),(self.rect.left,self.rect.top - 5,width,5),0)
elif self._hit == 6:
py.draw.rect(screen,(255,0,0),(self.rect.left,self.rect.top - 5,width,5),0)
else:
py.draw.rect(screen,(0,255,0),(self.rect.left,self.rect.top - 5,width,5),0)
py.draw.rect(screen,(255,0,0),(self.rect.left + width,self.rect.top - 5,69 - width,5),0)
pass
#大飞机类
class Large_plane(py.sprite.Sprite):
def __init__(self,name,name1,name2,down1,down2,down3,down4,down5,down6,speed):
super().__init__()
self._image = py.image.load(name).convert_alpha()
self._image1 = py.image.load(name1).convert_alpha()
self._image2 = py.image.load(name2).convert_alpha()
self._down1 = py.image.load(down1).convert_alpha()
self._down2 = py.image.load(down2).convert_alpha()
self._down3 = py.image.load(down3).convert_alpha()
self._down4 = py.image.load(down4).convert_alpha()
self._down5 = py.image.load(down5).convert_alpha()
self._down6 = py.image.load(down6).convert_alpha()
self._speed = speed
self.rect = self._image.get_rect()
self.rect.left,self.rect.bottom = random.randint(0,315),0
self._collide = False
self._hit = 0
def move(self):
self.rect = self.rect.move(self._speed)
def blood(self,screen):
width = 16.5 * (10 - self._hit)
if self._hit == 0:
py.draw.rect(screen,(0,255,0),(self.rect.left,self.rect.top - 5,width,5),0)
elif self._hit == 10:
py.draw.rect(screen,(255,0,0),(self.rect.left,self.rect.top - 5,width,5),0)
else:
py.draw.rect(screen,(0,255,0),(self.rect.left,self.rect.top - 5,width,5),0)
py.draw.rect(screen,(255,0,0),(self.rect.left + width,self.rect.top - 5,165 - width,5),0)
pass
#自己飞机类
class My_plane(py.sprite.Sprite):
def __init__(self,name,name1,destroy1,destroy2,destroy3,destroy4,size):
super().__init__()
self._image = py.image.load(name).convert_alpha()
self._image1 = py.image.load(name1).convert_alpha()
self._destroy1 = py.image.load(destroy1).convert_alpha()
self._destroy2 = py.image.load(destroy2).convert_alpha()
self._destroy3 = py.image.load(destroy3).convert_alpha()
self._destroy4 = py.image.load(destroy4).convert_alpha()
self.rect = self._image.get_rect()
self._size = size
self.rect.left,self.rect.bottom = (self._size - self.rect.width) / 2,self._size - 57
self._collide = False
self._live = True
self._protect = True
self._pause = True
def move(self,speed):
self.rect = self.rect.move(speed)
#边界处理
if self.rect.left <= 0:
self.rect.left = 0
if self.rect.right >= self._size:
self.rect.right = self._size
if self.rect.top <= 0:
self.rect.top = 0
if self.rect.bottom >= self._size - 57:
self.rect.bottom = self._size - 57
pass
#子弹类
class Bullet(py.sprite.Sprite):
def __init__(self,name,other):
super().__init__()
self._image = py.image.load(name).convert_alpha()
self.rect = self._image.get_rect()
self.rect.left,self.rect.top = other.rect.left + (other.rect.width - self.rect.width) / 2 + 1,\
other.rect.top - self.rect.height + 50
def move(self):
self.rect = self.rect.move()
def existence(self):
if self.rect.top > 0:
return True
else:
return False
class Supply(py.sprite.Sprite):
def __init__(self,name):
super().__init__()
self._image = py.image.load(name).convert_alpha()
self.rect = self._image.get_rect()
self.rect.left,self.rect.bottom = random.randint(0,(480 - self.rect.width)),0
def move(self):
self.rect = self.rect.move()
def out(self):
if self.rect.top >= 700:
return False
else:
return True
class Bullet_dubble1(py.sprite.Sprite):
def __init__(self,name,other):
super().__init__()
self._image = py.image.load(name).convert_alpha()
self.rect = self._image.get_rect()
self.rect.left,self.rect.top = other.rect.left + 20 ,\
other.rect.top - self.rect.height + 50
def move(self):
self.rect = self.rect.move()
def existence(self):
if self.rect.top > 0:
return True
else:
return False
class Bullet_dubble2(py.sprite.Sprite):
def __init__(self,name,other):
super().__init__()
self._image = py.image.load(name).convert_alpha()
self.rect = self._image.get_rect()
self.rect.left,self.rect.top = other.rect.left + 77 ,\
other.rect.top - self.rect.height + 50
def move(self):
self.rect = self.rect.move()
def existence(self):
if self.rect.top > 0:
return True
else:
return False
import pygame as py
import sys
import random
import traceback
from class_def import Small_plane,Middle_plane,Large_plane,My_plane,Bullet,Supply,Bullet_dubble1,Bullet_dubble2
def plane_list_init(*args):
list1 = list(args)
list1.empty()
list1.empty()
list1.empty()
list1.empty()
list1.clear()
list1.clear()
list1.clear()
list1.clear()
list1.clear()
#初始化,窗口大小
def main():
py.init()
py.mixer.init()
#游戏音频导入
bg_music_name = 'sound\\game_music.ogg'
bullet_name = 'sound\\bullet.wav'
supply_name = 'sound\\supply.wav'
supply_bomb = 'sound\\get_bomb.wav'
supply_bullet = 'sound\\get_bullet.wav'
myplane_collide_name = 'sound\\me_down.wav'
bomb_name = 'sound\\use_bomb.wav'
middle_down_name = 'sound\\enemy2_down.wav'
large_down_name = 'sound\\enemy3_down.wav'
large_move_name = 'sound\\enemy3_flying.wav'
py.mixer.music.load(bg_music_name)
py.mixer.music.set_volume(0.1)
py.mixer.music.play()
bullet_sound = py.mixer.Sound(bullet_name)
bullet_sound.set_volume(0.3)
supply_sound = py.mixer.Sound(supply_name)
supply_sound.set_volume(0.2)
supply_bomb_sound = py.mixer.Sound(supply_bomb)
supply_bomb_sound.set_volume(0.2)
supply_bullet_sound = py.mixer.Sound(supply_bullet)
supply_bullet_sound.set_volume(0.2)
myplane_collide_sound = py.mixer.Sound(myplane_collide_name)
myplane_collide_sound.set_volume(0.2)
bomb_sound = py.mixer.Sound(bomb_name)
bomb_sound.set_volume(0.2)
middle_down_sound = py.mixer.Sound(middle_down_name)
middle_down_sound.set_volume(0.2)
large_down_sound = py.mixer.Sound(large_down_name)
large_down_sound.set_volume(0.2)
large_move_sound = py.mixer.Sound(large_move_name)
large_move_sound.set_volume(0.1)
#游戏所需图片导入
bg_image_name = 'images\\background.png'
bomb_name = 'images\\bomb.png'
life_name = 'images\\life.png'
small_plane_name_1 = 'images\\enemy1.png'
small_plane_name_2 = 'images\\enemy1_down1.png'
small_plane_name_3 = 'images\\enemy1_down2.png'
small_plane_name_4 = 'images\\enemy1_down3.png'
small_plane_name_5 = 'images\\enemy1_down4.png'
middle_plane_name_1 = 'images\\enemy2.png'
middle_plane_name_2 = 'images\\enemy2_hit.png'
middle_plane_name_3 = 'images\\enemy2_down1.png'
middle_plane_name_4 = 'images\\enemy2_down2.png'
middle_plane_name_5 = 'images\\enemy2_down3.png'
middle_plane_name_6 = 'images\\enemy2_down4.png'
large_plane_name_1 = 'images\\enemy3_n1.png'
large_plane_name_2 = 'images\\enemy3_n2.png'
large_plane_name_3 = 'images\\enemy3_hit.png'
large_plane_name_4 = 'images\\enemy3_down1.png'
large_plane_name_5 = 'images\\enemy3_down2.png'
large_plane_name_6 = 'images\\enemy3_down3.png'
large_plane_name_7 = 'images\\enemy3_down4.png'
large_plane_name_8 = 'images\\enemy3_down5.png'
large_plane_name_9 = 'images\\enemy3_down6.png'
my_plane_name_1 = 'images\\me1.png'
my_plane_name_2 = 'images\\me2.png'
my_plane_name_3 = 'images\\me_destroy_1.png'
my_plane_name_4 = 'images\\me_destroy_2.png'
my_plane_name_5 = 'images\\me_destroy_3.png'
my_plane_name_6 = 'images\\me_destroy_4.png'
bullet_name_1 = 'images\\bullet1.png'
bullet_name_2 = 'images\\bullet2.png'
supply_name_1 = 'images\\bomb_supply.png'
supply_name_2 = 'images\\bullet_supply.png'
again_name = 'images\\again.png'
gameover_name = 'images\\gameover.png'
pause_name_1 = 'images\\pause_nor.png'
pause_name_2 = 'images\\pause_pressed.png'
resume_name_1 = 'images\\resume_nor.png'
resume_name_2 = 'images\\resume_pressed.png'
size = width,height = 480,700
screen = py.display.set_mode(size)
py.display.set_caption('Aircraft Wars')
bg_image = py.image.load(bg_image_name).convert_alpha()
bomb_image = py.image.load(bomb_name).convert_alpha()
life_image = py.image.load(life_name).convert_alpha()
again_image = py.image.load(again_name).convert_alpha()
again_image_rect = again_image.get_rect()
again_image_rect.left,again_image_rect.top = 90,300
gameover_image = py.image.load(gameover_name).convert_alpha()
gameover_image_rect = gameover_image.get_rect()
gameover_image_rect.left,gameover_image_rect.top = 90,400
#文字设置
font1 = py.font.SysFont('行书',40)
font1.set_bold(True)
font2 = py.font.SysFont('行书',60)
scorestext1 = 0000
num1text1 = 1
#实例化飞机
myplane = My_plane(my_plane_name_1,my_plane_name_2,my_plane_name_3,my_plane_name_4,my_plane_name_5,my_plane_name_6,size)
#存储敌方飞机
allplanes_group = py.sprite.Group()
smallplane_list = []
smallplane_destroylist = []
smallplane_group = py.sprite.Group()
middleplane_list = []
middleplane_destroylist = []
middleplane_hitlist = []
middleplane_group = py.sprite.Group()
largeplane_list = []
largeplane_destroylist = []
largeplane_hitlist = []
largeplane_group = py.sprite.Group()
#存储己方飞机发射的子弹
bullet_list= []
bullet_group = py.sprite.Group()
#存储补给
supply_group = py.sprite.Group()
#设置按键不断响应
#py.key.set_repeat(1,10)
Music_bg = py.USEREVENT
GameSupply = py.USEREVENT + 1
py.mixer.music.set_endevent(Music_bg)
flag_left,flag_right,flag_up,flag_down,flag_space = 0,0,0,0,0
#子弹的移动生成标志,己方飞机的显示标志,敌方飞机被击落标志
flag_bullet = 0
#敌方飞机的生成和移动标志
flag_enemyplane = 0
#己方飞机被击落标志
flag_destroyplane = 1
#毁灭动画显示控制标志
i,j,m,n = 0,0,0,0
#敌方中大飞机出现标志
start,start1,start2 =0,0,0
#补给标志
supply_bomb,supply_bullet,supply_get,supply_bullet_time,supply_time= 0,0,0,0,0
#生命条
life_num = 3
life_list = [(434,643) ,(388,643) ,(342,643)]
speed_list = [(0,1),(0,1.5),(0,2),(0,2.5),(0,3)]
smallcreate_list =
middlecreate_list =
largecreate_list =
speed_index = 0
protect_time = 0 #保护时间
flag_pause,flag_resume= 1,0 #暂停切换标志
clock = py.time.Clock()
while True:
for event in py.event.get():
if event.type == py.QUIT:
py.quit()
sys.exit()
if event.type == py.MOUSEBUTTONDOWN:
if event.button == 1:
pos = event.pos
#重新开始,设置重启
if 90<= pos <= 390 and 300 <= pos <= 341:
myplane._live = True
myplane._collide = False
myplane.rect.left,myplane.rect.bottom = (myplane._size - myplane.rect.width) / 2,myplane._size - 57
life_num = 3
start,start1,start2 =0,0,0
flag_enemyplane,flag_bullet= 0,0
flag_destroyplane = 1
num1text1 = 1
scorestext1 = 0000
if 90<= pos <= 390 and 400 <= pos <= 440:
py.quit()
sys.exit()
#暂停
if 420<= pos <= 480 and 0 <= pos <= 45 and flag_pause:
py.mixer.music.pause()
flag_resume = 1
myplane._pause = False
if 420<= pos <= 480 and 0 <= pos <= 45 and not flag_pause:
flag_resume = 0
py.mixer.music.unpause()
flag_pause = 1
myplane._pause = True
#己方飞机操作设置
if event.type == py.KEYDOWN:
if event.key == py.K_a or event.key == py.K_LEFT:
flag_left = 1
if event.key == py.K_d or event.key == py.K_RIGHT:
flag_right = 1
if event.key == py.K_w or event.key == py.K_UP:
flag_up = 1
if event.key == py.K_s or event.key == py.K_DOWN:
flag_down = 1
if event.key == py.K_SPACE:
flag_space = 1
if event.type == py.KEYUP:
if event.key == py.K_a or event.key == py.K_LEFT:
flag_left = 0
if event.key == py.K_d or event.key == py.K_RIGHT:
flag_right = 0
if event.key == py.K_w or event.key == py.K_UP:
flag_up = 0
if event.key == py.K_s or event.key == py.K_DOWN:
flag_down = 0
if event.type == Music_bg:
py.mixer.music.play()
if myplane._live and myplane._pause:
#敌方小飞机生成与移动
#随着分数增加难度上升
if scorestext1 < 40000:
speed_index = 0
elif scorestext1 < 100000:
speed_index = 1
elif scorestext1 < 250000:
speed_index = 2
elif scorestext1 < 450000:
speed_index = 3
else:
speed_index = 4
flag_enemyplane += 1
if smallplane_group:
for each in smallplane_group:
each.move()
if middleplane_group:
for each in middleplane_group:
each.move()
if largeplane_group:
for each in largeplane_group:
large_move_sound.play()
each.move()
if flag_enemyplane == smallcreate_list:
flag_enemyplane = 0
small_plane = Small_plane(small_plane_name_1,small_plane_name_2,small_plane_name_3,small_plane_name_4,small_plane_name_5,speed_list)
while py.sprite.spritecollide(small_plane,allplanes_group,False):
small_plane.rect.left,small_plane.rect.bottom =random.randint(0,423),0
smallplane_list.append(small_plane)
smallplane_group.add(small_plane)
allplanes_group.add(small_plane)
start += 1
if start == 300:
start1 = 1
if start > 300:
if start == create_time1:
start1 = 1
if start == 1200:
start2 = 1
if start > 1200:
if start == create_time2:
start2 = 1
if start1:
middle_plane = Middle_plane(middle_plane_name_1,middle_plane_name_2,middle_plane_name_3,middle_plane_name_4,middle_plane_name_5,middle_plane_name_6,speed_list)
while py.sprite.spritecollide(middle_plane,allplanes_group,False):
middle_plane.rect.left,middle_plane.rect.bottom = random.randint(0,411),0
middleplane_list.append(middle_plane)
middleplane_group.add(middle_plane)
allplanes_group.add(middle_plane)
middleplane_hitlist.append(0)
start1 = 0
create_time1 = start + middlecreate_list
if start2:
large_plane = Large_plane(large_plane_name_1,large_plane_name_2,large_plane_name_3,large_plane_name_4,large_plane_name_5,large_plane_name_6,large_plane_name_7,large_plane_name_8,large_plane_name_9,speed_list)
while py.sprite.spritecollide(large_plane,allplanes_group,False):
large_plane.rect.left,large_plane.rect.bottom = random.randint(0,315),0
largeplane_list.append(large_plane)
largeplane_group.add(large_plane)
allplanes_group.add(large_plane)
largeplane_hitlist.append(0)
start2 = 0
create_time2 = start + largecreate_list
#myplane 方向控制
if flag_left:
myplane.move([-10,0])
if flag_right:
myplane.move()
if flag_up:
myplane.move()
if flag_down:
myplane.move()
#投放炸弹清屏
if flag_space and num1text1:
bomb_sound.play()
flag_space = 0
num1text1 -= 1
scorestext1 += (len(smallplane_group) * 1000 + len(middleplane_group) * 5000 + len(largeplane_group) * 10000)
smallplane_destroylist = smallplane_list.copy()
middleplane_destroylist = middleplane_list.copy()
largeplane_destroylist = largeplane_list.copy()
plane_list_init(allplanes_group,smallplane_group,middleplane_group,largeplane_group,\
smallplane_list,middleplane_list,largeplane_list,middleplane_hitlist,largeplane_hitlist )
#分数/炸弹数显示
scorestext2 = 'SCORES:%04d'%scorestext1
scores = font1.render(scorestext2,False,(255,255,255))
num1text2 = 'X%d'%num1text1
num1 = font2.render(num1text2,False,(255,255,255))
num1_rect = num1.get_rect()
num1_rect.left,num1_rect.top = 70,653
#显示
screen.blit(bg_image,(0,0))
screen.blit(bomb_image,(0,643))
for vol in range(life_num):
screen.blit(life_image,life_list)
screen.blit(scores,(0,0))
screen.blit(num1,num1_rect)
#补给
if not flag_destroyplane % 50:
supply_time += 1
if supply_time == 20:
supply_time = 0
supply_type = random.randint(0,1)
if supply_type:
supply = Supply(supply_name_1)
supply_bomb = 1
else:
supply = Supply(supply_name_2)
supply_bullet = 1
supply_sound.play()
supply_group.add(supply)
if supply_group:
for each in supply_group:
if each.out():
each.move()
else:
supply_group.empty()
screen.blit(each._image,each.rect)
#己方飞机显示
if not flag_bullet % 5 and not myplane._collide:
screen.blit(myplane._image,myplane.rect)
if flag_bullet % 5 and not myplane._collide:
screen.blit(myplane._image1,myplane.rect)
#己方飞机子弹的生成与移动
if supply_bullet and supply_get:
if not flag_bullet % 12:
supply_bullet_time += 1
bullet1 = Bullet_dubble1(bullet_name_2,myplane)
bullet2 = Bullet_dubble2(bullet_name_2,myplane)
bullet_sound.play()
if flag_up:
bullet1.rect.top -= 50
bullet2.rect.top -= 50
bullet_list.append(bullet1)
bullet_list.append(bullet2)
bullet_group.add(bullet1)
bullet_group.add(bullet2)
if supply_bullet_time == 60:
supply_bullet_time = 0
supply_bullet = 0
supply_get = 0
if not flag_bullet % 3 and bullet_group:
for each in bullet_group:
if each.existence():
each.move()
else:
bullet_group.remove(each)
bullet_list.remove(each)
else:
if not flag_bullet % 12:
bullet = Bullet(bullet_name_1,myplane)
bullet_sound.play()
if flag_up:
bullet.rect.top -= 50
bullet_list.append(bullet)
bullet_group.add(bullet)
if not flag_bullet % 3 and bullet_group:
for each in bullet_group:
if each.existence():
each.move()
else:
bullet_group.remove(each)
bullet_list.remove(each)
#检测己方飞机与敌方小飞机是否发生碰撞
if life_num == 0:
myplane._live = False
if myplane._protect:
if py.sprite.spritecollide(myplane,allplanes_group,False):
myplane_collide_sound.play()
myplane._collide = True
myplane._protect = False
life_num -= 1
#重生保护
else:
protect_time += 1
if protect_time == 300:
protect_time = 0
myplane._protect = True
if py.sprite.spritecollide(myplane,supply_group,True):
supply_get = 1
if supply_bullet:
supply_bullet_sound.play()
else:
supply_bomb_sound.play()
for each in smallplane_group:
if py.sprite.collide_rect(each,myplane):
each._collide = True
for each in middleplane_group:
if py.sprite.collide_rect(each,myplane):
each._collide = True
for each in largeplane_group:
if py.sprite.collide_rect(each,myplane):
each._collide = True
#轰炸次数
if supply_get and supply_bomb:
supply_bomb = 0
supply_get = 0
if num1text1 < 3:
num1text1 += 1
#己方飞机坠毁
if myplane._collide:
down =
if not flag_destroyplane % 6:
screen.blit(down,myplane.rect)
j += 1
if not j % 4:
j = 0
myplane.rect.left,myplane.rect.bottom = (myplane._size - myplane.rect.width) / 2,myplane._size - 57
myplane._collide = False
#检测飞机是否被击落
for each in smallplane_group:
if py.sprite.spritecollide(each,bullet_group,True):
each._collide = True
scorestext1 += 1000
for each in middleplane_group:
if py.sprite.spritecollide(each,bullet_group,True):
middleplane_hitlist += 1
each._hit += 1
if middleplane_hitlist == 6:
each._collide = True
scorestext1 += 5000
for each in largeplane_group:
if py.sprite.spritecollide(each,bullet_group,True):
largeplane_hitlist += 1
each._hit += 1
if largeplane_hitlist == 10:
each._collide = True
scorestext1 += 10000
#显示子弹轨迹
for each in bullet_group:
screen.blit(each._image,each.rect)
#被击落飞机生成动画
for each in smallplane_group:
if each._collide:
smallplane_group.remove(each)
allplanes_group.remove(each)
smallplane_destroylist.append(smallplane_list.pop(smallplane_list.index(each)))
screen.blit(each._image,each.rect)
if smallplane_destroylist:
vol = smallplane_destroylist
if not flag_bullet % 3:
down =
screen.blit(down,vol.rect)
i += 1
if not i % 4:
i = 0
smallplane_destroylist.pop(0)
for each in middleplane_group:
if each._collide:
middle_down_sound.play()
middleplane_group.remove(each)
allplanes_group.remove(each)
index = middleplane_list.index(each)
middleplane_destroylist.append(middleplane_list.pop(index))
middleplane_hitlist.pop(index)
screen.blit(each._image,each.rect)
each.blood(screen)
if middleplane_destroylist:
vol = middleplane_destroylist
if not flag_bullet % 3:
down =
screen.blit(down,vol.rect)
m += 1
if not m % 4:
m = 0
middleplane_destroylist.pop(0)
for each in largeplane_group:
if each._collide:
large_down_sound.play()
largeplane_group.remove(each)
allplanes_group.remove(each)
index1 = largeplane_list.index(each)
largeplane_destroylist.append(largeplane_list.pop(index1))
largeplane_hitlist.pop(index1)
screen.blit(each._image,each.rect)
each.blood(screen)
if largeplane_destroylist:
vol = largeplane_destroylist
if not flag_bullet % 3:
down =
screen.blit(down,vol.rect)
n += 1
if not n % 6:
n = 0
largeplane_destroylist.pop(0)
if not myplane._live:
screen.blit(bg_image,(0,0))
screen.blit(bomb_image,(0,643))
screen.blit(scores,(0,0))
screen.blit(num1,num1_rect)
screen.blit(again_image,again_image_rect)
screen.blit(gameover_image,gameover_image_rect)
plane_list_init(allplanes_group,smallplane_group,middleplane_group,largeplane_group,\
smallplane_list,middleplane_list,largeplane_list,middleplane_hitlist,largeplane_hitlist )
bullet_group.empty()
bullet_list.clear()
pos = py.mouse.get_pos()
smallplane_destroylist.clear()
middleplane_destroylist.clear()
largeplane_destroylist.clear()
supply_bomb,supply_bullet,supply_get,supply_bullet_time,supply_time= 0,0,0,0,0
#暂停
pause1 = py.image.load(pause_name_1).convert_alpha()
pause2 = py.image.load(pause_name_2).convert_alpha()
pause1_rect = pause1.get_rect()
pause1_rect.right,pause1_rect.top = 480,0
pause_pos = py.mouse.get_pos()
resume1 = py.image.load(resume_name_1).convert_alpha()
resume2 = py.image.load(resume_name_2).convert_alpha()
if flag_pause:
if pause1_rect.left <= pause_pos <= 480 and \
0 <= pause_pos <= pause1_rect.height:
screen.blit(pause2,pause1_rect)
else:
screen.blit(pause1,pause1_rect)
if flag_resume:
flag_pause = 0
screen.blit(bg_image,(0,0))
if pause1_rect.left <= pause_pos <= 480 and \
0 <= pause_pos <= pause1_rect.height:
screen.blit(resume2,pause1_rect)
else:
screen.blit(resume1,pause1_rect)
flag_bullet += 1
flag_destroyplane += 1
if flag_bullet == 90:
flag_bullet = 0
if flag_destroyplane == 90:
flag_destroyplane = 0
py.display.flip()
clock.tick(60)
if __name__ == '__main__':
try:
main()
except SystemExit:
pass
except:
traceback.print_exc()
py.quit() import pygame
import sys
import traceback
import myplane
import enemy
import bullet
import supply
from pygame.locals import *
from random import *
pygame.init()
pygame.mixer.init()
bg_size = width, height = 480, 700
screen = pygame.display.set_mode(bg_size)
pygame.display.set_caption("飞机大战")
background = pygame.image.load("images/background.png").convert()
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
GREEN = (0, 255, 0)
RED = (255, 0, 0)
# 载入游戏音乐
pygame.mixer.music.load("sound/game_music.ogg")
pygame.mixer.music.set_volume(0.2)
bullet_sound = pygame.mixer.Sound("sound/bullet.wav")
bullet_sound.set_volume(0.2)
bomb_sound = pygame.mixer.Sound("sound/use_bomb.wav")
bomb_sound.set_volume(0.2)
supply_sound = pygame.mixer.Sound("sound/supply.wav")
supply_sound.set_volume(0.2)
get_bomb_sound = pygame.mixer.Sound("sound/get_bomb.wav")
get_bomb_sound.set_volume(0.2)
get_bullet_sound = pygame.mixer.Sound("sound/get_bullet.wav")
get_bullet_sound.set_volume(0.2)
upgrade_sound = pygame.mixer.Sound("sound/upgrade.wav")
upgrade_sound.set_volume(0.2)
enemy3_fly_sound = pygame.mixer.Sound("sound/enemy3_flying.wav")
enemy3_fly_sound.set_volume(0.2)
enemy1_down_sound = pygame.mixer.Sound("sound/enemy1_down.wav")
enemy1_down_sound.set_volume(0.2)
enemy2_down_sound = pygame.mixer.Sound("sound/enemy2_down.wav")
enemy2_down_sound.set_volume(0.2)
enemy3_down_sound = pygame.mixer.Sound("sound/enemy3_down.wav")
enemy3_down_sound.set_volume(0.5)
me_down_sound = pygame.mixer.Sound("sound/me_down.wav")
me_down_sound.set_volume(0.2)
def add_small_enemies(group1, group2, num):
for i in range(num):
e1 = enemy.SmallEnemy(bg_size)
group1.add(e1)
group2.add(e1)
def add_mid_enemies(group1, group2, num):
for i in range(num):
e2 = enemy.MidEnemy(bg_size)
group1.add(e2)
group2.add(e2)
def add_big_enemies(group1, group2, num):
for i in range(num):
e3 = enemy.BigEnemy(bg_size)
group1.add(e3)
group2.add(e3)
def inc_speed(target, inc):
for each in target:
each.speed += inc
def main():
pygame.mixer.music.play(-1)
# 生成我方飞机
me = myplane.MyPlane(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, 4)
# 生成敌方大型飞机
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(bullet.Bullet1(me.rect.midtop))
# 生成超级子弹
bullet2 = []
bullet2_index = 0
BULLET2_NUM = 8
for i in range(BULLET2_NUM//2):
bullet2.append(bullet.Bullet2((me.rect.centerx-33, me.rect.centery)))
bullet2.append(bullet.Bullet2((me.rect.centerx+30, me.rect.centery)))
clock = pygame.time.Clock()
# 中弹图片索引
e1_destroy_index = 0
e2_destroy_index = 0
e3_destroy_index = 0
me_destroy_index = 0
# 统计得分
score = 0
score_font = pygame.font.Font("font/font.ttf", 36)
# 标志是否暂停游戏
paused = False
pause_nor_image = pygame.image.load("images/pause_nor.png").convert_alpha()
pause_pressed_image = pygame.image.load("images/pause_pressed.png").convert_alpha()
resume_nor_image = pygame.image.load("images/resume_nor.png").convert_alpha()
resume_pressed_image = pygame.image.load("images/resume_pressed.png").convert_alpha()
paused_rect = pause_nor_image.get_rect()
paused_rect.left, paused_rect.top = width - paused_rect.width - 10, 10
paused_image = pause_nor_image
# 设置难度级别
level = 1
# 全屏炸弹
bomb_image = pygame.image.load("images/bomb.png").convert_alpha()
bomb_rect = bomb_image.get_rect()
bomb_font = pygame.font.Font("font/font.ttf", 48)
bomb_num = 3
# 每20秒发放一个补给包
bullet_supply = supply.Bullet_Supply(bg_size)
bomb_supply = supply.Bomb_Supply(bg_size)
SUPPLY_TIME = USEREVENT
pygame.time.set_timer(SUPPLY_TIME, 20 * 1000)
# 超级子弹定时器
DOUBLE_BULLET_TIME = USEREVENT + 1
# 标志是否使用超级子弹
is_double_bullet = False
# 解除我方无敌状态定时器
INVINCIBLE_TIME = USEREVENT + 2
# 生命数量
life_image = pygame.image.load("images/life.png").convert_alpha()
life_rect = life_image.get_rect()
life_num = 3
# 用于阻止重复打开记录文件
recorded = False
# 游戏结束画面
gameover_font = pygame.font.Font("font/font.TTF", 48)
again_image = pygame.image.load("images/again.png").convert_alpha()
again_rect = again_image.get_rect()
gameover_image = pygame.image.load("images/gameover.png").convert_alpha()
gameover_rect = gameover_image.get_rect()
# 用于切换图片
switch_image = True
# 用于延迟
delay = 100
running = True
while running:
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
elif event.type == MOUSEBUTTONDOWN:
if event.button == 1 and paused_rect.collidepoint(event.pos):
paused = not paused
if paused:
pygame.time.set_timer(SUPPLY_TIME, 0)
pygame.mixer.music.pause()
pygame.mixer.pause()
else:
pygame.time.set_timer(SUPPLY_TIME, 30 * 1000)
pygame.mixer.music.unpause()
pygame.mixer.unpause()
elif event.type == MOUSEMOTION:
if paused_rect.collidepoint(event.pos):
if paused:
paused_image = resume_pressed_image
else:
paused_image = pause_pressed_image
else:
if paused:
paused_image = resume_nor_image
else:
paused_image = pause_nor_image
elif event.type == KEYDOWN:
if event.key == K_SPACE:
if bomb_num:
bomb_num -= 1
bomb_sound.play()
for each in enemies:
if each.rect.bottom > 0:
each.active = False
elif event.type == SUPPLY_TIME:
supply_sound.play()
if choice():
bomb_supply.reset()
else:
bullet_supply.reset()
elif event.type == DOUBLE_BULLET_TIME:
is_double_bullet = False
pygame.time.set_timer(DOUBLE_BULLET_TIME, 0)
elif event.type == INVINCIBLE_TIME:
me.invincible = False
pygame.time.set_timer(INVINCIBLE_TIME, 0)
# 根据用户的得分增加难度
if level == 1 and score > 50000:
level = 2
upgrade_sound.play()
# 增加3架小型敌机、2架中型敌机和1架大型敌机
add_small_enemies(small_enemies, enemies, 3)
add_mid_enemies(mid_enemies, enemies, 2)
add_big_enemies(big_enemies, enemies, 1)
# 提升小型敌机的速度
inc_speed(small_enemies, 1)
elif level == 2 and score > 300000:
level = 3
upgrade_sound.play()
# 增加5架小型敌机、3架中型敌机和2架大型敌机
add_small_enemies(small_enemies, enemies, 5)
add_mid_enemies(mid_enemies, enemies, 3)
add_big_enemies(big_enemies, enemies, 2)
# 提升小型敌机的速度
inc_speed(small_enemies, 1)
inc_speed(mid_enemies, 1)
elif level == 3 and score > 600000:
level = 4
upgrade_sound.play()
# 增加5架小型敌机、3架中型敌机和2架大型敌机
add_small_enemies(small_enemies, enemies, 5)
add_mid_enemies(mid_enemies, enemies, 3)
add_big_enemies(big_enemies, enemies, 2)
# 提升小型敌机的速度
inc_speed(small_enemies, 1)
inc_speed(mid_enemies, 1)
elif level == 4 and score > 1000000:
level = 5
upgrade_sound.play()
# 增加5架小型敌机、3架中型敌机和2架大型敌机
add_small_enemies(small_enemies, enemies, 5)
add_mid_enemies(mid_enemies, enemies, 3)
add_big_enemies(big_enemies, enemies, 2)
# 提升小型敌机的速度
inc_speed(small_enemies, 1)
inc_speed(mid_enemies, 1)
screen.blit(background, (0, 0))
if life_num and not paused:
# 检测用户的键盘操作
key_pressed = pygame.key.get_pressed()
if key_pressed or key_pressed:
me.moveUp()
if key_pressed or key_pressed:
me.moveDown()
if key_pressed or key_pressed:
me.moveLeft()
if key_pressed or key_pressed:
me.moveRight()
# 绘制全屏炸弹补给并检测是否获得
if bomb_supply.active:
bomb_supply.move()
screen.blit(bomb_supply.image, bomb_supply.rect)
if pygame.sprite.collide_mask(bomb_supply, me):
get_bomb_sound.play()
bomb_num += 1
bomb_supply.active = False
# 绘制超级子弹补给并检测是否获得
if bullet_supply.active:
bullet_supply.move()
screen.blit(bullet_supply.image, bullet_supply.rect)
if pygame.sprite.collide_mask(bullet_supply, me):
get_bullet_sound.play()
is_double_bullet = True
pygame.time.set_timer(DOUBLE_BULLET_TIME, 18 * 1000)
bullet_supply.active = False
# 发射子弹
if not(delay % 10):
bullet_sound.play()
if is_double_bullet:
bullets = bullet2
bullets.reset((me.rect.centerx-33, me.rect.centery))
bullets.reset((me.rect.centerx+30, me.rect.centery))
bullet2_index = (bullet2_index + 2) % BULLET2_NUM
else:
bullets = bullet1
bullets.reset(me.rect.midtop)
bullet1_index = (bullet1_index + 1) % BULLET1_NUM
# 检测子弹是否击中敌机
for b in bullets:
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.hit = True
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 / enemy.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)
# 即将出现在画面中,播放音效
if each.rect.bottom == -50:
enemy3_fly_sound.play(-1)
else:
# 毁灭
if not(delay % 3):
if e3_destroy_index == 0:
enemy3_down_sound.play()
screen.blit(each.destroy_images, each.rect)
e3_destroy_index = (e3_destroy_index + 1) % 6
if e3_destroy_index == 0:
enemy3_fly_sound.stop()
score += 10000
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)
# 绘制血槽
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 / enemy.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):
if e2_destroy_index == 0:
enemy2_down_sound.play()
screen.blit(each.destroy_images, each.rect)
e2_destroy_index = (e2_destroy_index + 1) % 4
if e2_destroy_index == 0:
score += 6000
each.reset()
# 绘制小型敌机:
for each in small_enemies:
if each.active:
each.move()
screen.blit(each.image, each.rect)
else:
# 毁灭
if not(delay % 3):
if e1_destroy_index == 0:
enemy1_down_sound.play()
screen.blit(each.destroy_images, each.rect)
e1_destroy_index = (e1_destroy_index + 1) % 4
if e1_destroy_index == 0:
score += 1000
each.reset()
# 检测我方飞机是否被撞
enemies_down = pygame.sprite.spritecollide(me, enemies, False, pygame.sprite.collide_mask)
if enemies_down and not me.invincible:
me.active = False
for e in enemies_down:
e.active = False
# 绘制我方飞机
if me.active:
if switch_image:
screen.blit(me.image1, me.rect)
else:
screen.blit(me.image2, me.rect)
else:
# 毁灭
if not(delay % 3):
if me_destroy_index == 0:
me_down_sound.play()
screen.blit(me.destroy_images, me.rect)
me_destroy_index = (me_destroy_index + 1) % 4
if me_destroy_index == 0:
life_num -= 1
me.reset()
pygame.time.set_timer(INVINCIBLE_TIME, 3 * 1000)
# 绘制全屏炸弹数量
bomb_text = bomb_font.render(" X %d" % bomb_num, True, WHITE)
text_rect = bomb_text.get_rect()
screen.blit(bomb_image, (10, height - 10 - bomb_rect.height))
screen.blit(bomb_text, (20 + bomb_rect.width, height - 5 - text_rect.height))
# 绘制剩余生命数量
if life_num:
for i in range(life_num):
screen.blit(life_image, \
(width-10-(i+1)*life_rect.width, \
height-10-life_rect.height))
# 绘制得分
score_text = score_font.render("Score : %s" % str(score), True, WHITE)
screen.blit(score_text, (10, 5))
# 绘制游戏结束画面
elif life_num == 0:
# 背景音乐停止
pygame.mixer.music.stop()
# 停止全部音效
pygame.mixer.stop()
# 停止发放补给
pygame.time.set_timer(SUPPLY_TIME, 0)
if not recorded:
recorded = True
# 读取历史最高得分
with open("record.txt", "r") as f:
record_score = int(f.read())
# 如果玩家得分高于历史最高得分,则存档
if score > record_score:
with open("record.txt", "w") as f:
f.write(str(score))
# 绘制结束画面
record_score_text = score_font.render("Best : %d" % record_score, True, (255, 255, 255))
screen.blit(record_score_text, (50, 50))
gameover_text1 = gameover_font.render("Your Score", True, (255, 255, 255))
gameover_text1_rect = gameover_text1.get_rect()
gameover_text1_rect.left, gameover_text1_rect.top = \
(width - gameover_text1_rect.width) // 2, height // 3
screen.blit(gameover_text1, gameover_text1_rect)
gameover_text2 = gameover_font.render(str(score), True, (255, 255, 255))
gameover_text2_rect = gameover_text2.get_rect()
gameover_text2_rect.left, gameover_text2_rect.top = \
(width - gameover_text2_rect.width) // 2, \
gameover_text1_rect.bottom + 10
screen.blit(gameover_text2, gameover_text2_rect)
again_rect.left, again_rect.top = \
(width - again_rect.width) // 2, \
gameover_text2_rect.bottom + 50
screen.blit(again_image, again_rect)
gameover_rect.left, gameover_rect.top = \
(width - again_rect.width) // 2, \
again_rect.bottom + 10
screen.blit(gameover_image, gameover_rect)
# 检测用户的鼠标操作
# 如果用户按下鼠标左键
if pygame.mouse.get_pressed():
# 获取鼠标坐标
pos = pygame.mouse.get_pos()
# 如果用户点击“重新开始”
if again_rect.left < pos < again_rect.right and \
again_rect.top < pos < again_rect.bottom:
# 调用main函数,重新开始游戏
main()
# 如果用户点击“结束游戏”
elif gameover_rect.left < pos < gameover_rect.right and \
gameover_rect.top < pos < gameover_rect.bottom:
# 退出游戏
pygame.quit()
sys.exit()
# 绘制暂停按钮
screen.blit(paused_image, paused_rect)
# 切换图片
if not(delay % 5):
switch_image = not switch_image
delay -= 1
if not delay:
delay = 100
pygame.display.flip()
clock.tick(60)
if __name__ == "__main__":
try:
main()
except SystemExit:
pass
except:
traceback.print_exc()
pygame.quit()
input()
页:
[1]