plane.py
import pygame
class Plane:#管理飞机的类
def __init__(self,pw):
self.screen=pw.screen#获得屏幕
self.screen_rect =pw.screen.get_rect()
self.image = pygame.image.load('images/myplane.png')
self.rect = self.image.get_rect()
self.rect.midbottom = self.screen_rect.midbottom
self.moving_left = False
self.moving_right = False
self.moving_up = False
self.moving_down = False
def update(self):
if self.moving_left and self.rect.left > 0:
self.rect.x -= 2
elif self.moving_right and self.rect.right < self.screen_rect.right:
self.rect.x += 2
if self.moving_up and self.rect.top > 0:
self.rect.y -= 2
elif self.moving_down and self.rect.bottom < self.screen_rect.bottom:
self.rect.y += 2
def draw_place(self):
self.screen.blit(self.image,self.rect)
bullet.py
import pygame
from pygame.sprite import Sprite
class Bullet(Sprite):
def __init__(self,pw):
super().__init__()
self.screen=pw.screen
self.image=pygame.image.load('images/bullet.png')
self.rect=self.image.get_rect()
self.speed=5
self.rect.midtop=pw.plane.rect.midtop
def update(self):
self.rect.y-=self.speed
enemy.py
import random
import pygame
from pygame.sprite import Sprite
class Enemy(Sprite):
def __init__(self, pw):
super().__init__()
self.screen = pw.screen
self.screen_rect = pw.screen.get_rect()
self.frame = None
self.image = None
self.rect = None
self.life = None
self.speed = None
self.bullet_num = None
self.direction = None
self.dead = False
self.curr_frame = None
self.count = 0
def burning(self):
pass
def beshot(self):
print(self.life)
if not self.dead:
self.life -= 1
if self.life <= 0:
self.dead = True
def update(self):
if self.direction:
self.rect.x += self.speed
if self.rect.right >= self.screen_rect.right:
self.direction = False
else:
self.rect.x -= self.speed
if self.rect.left <= 0:
self.direction = True
self.rect.y += 1
class Enemy_small(Enemy):
def __init__(self, pw):
super().__init__(pw)
# 加载爆炸动画图集
self.frame = pygame.image.load('images/small_frame.png').convert_alpha()
self.curr_frame = 0
# 显示第一帧
self.image = self.frame.subsurface(0, 0, 25, 20)
# pygame.image.load('images/small.png')
self.rect = self.image.get_rect()
self.rect.x = random.random() * (self.screen_rect.width - 100) + 50
self.life = 2
self.speed = 3
self.bullet_num = 1
self.direction = True if random.random() > 0.5 else False
def burning(self):
# 因为主程序刷新太快,这里使用计数
self.count += 1
if self.count >= 6:
self.count = 0
if self.curr_frame <= 4:
self.curr_frame += 1
self.image = self.frame.subsurface(0, self.curr_frame * 20, 25, 20)
class Enemy_middle(Enemy):
def __init__(self, pw):
super().__init__(pw)
self.frame = pygame.image.load('images/middle_frame.png').convert_alpha()
self.curr_frame = 0
self.image = self.frame.subsurface(0, 0, 40, 50)
# pygame.image.load('images/middle.png')
self.rect = self.image.get_rect()
self.rect.x = random.random() * (self.screen_rect.width - 100) + 50
self.life = 5
self.speed = 2
self.bullet_num = 1
self.direction = True if random.random() > 0.5 else False
def burning(self):
# 因为主程序刷新太快,这里使用计数
self.count += 1
if self.count >= 6:
self.count = 0
if self.curr_frame <= 5:
self.curr_frame += 1
self.image = self.frame.subsurface(0, self.curr_frame * 50, 40, 50)
class Enemy_big(Enemy):
def __init__(self, pw):
super().__init__(pw)
self.frame = pygame.image.load('images/big_frame.png').convert_alpha()
self.curr_frame = 0
self.image = self.frame.subsurface(0, 0, 50, 80)
# pygame.image.load('images/big.png')
self.rect = self.image.get_rect()
self.rect.x = random.random() * (self.screen_rect.width - 100) + 50
self.life = 10
self.speed = 1
self.bullet_num = 1
self.direction = True if random.random() > 0.5 else False
def burning(self):
# 因为主程序刷新太快,这里使用计数
self.count += 1
if self.count >= 6:
self.count = 0
if self.curr_frame <= 6:
self.curr_frame += 1
self.image = self.frame.subsurface(0, self.curr_frame * 80, 50, 80)
main.py
import sys
import time
import pygame
from plane import Plane
from enemy import *
from bullet import *
class PlaneWar:
# 主场景的类
def __init__(self):
pygame.init() # 游戏环境的初始化
self.screen = pygame.display.set_mode((480, 800))
self.screen.fill('#C2C7C8')
pygame.display.set_caption('**保卫祖国**')
# 定义背景图和初始位置
self.background = pygame.image.load('images/bg.jpg')
self.position = -1600
self.shoot_sound = pygame.mixer.Sound('images/shoot.mp3')
self.small_sound = pygame.mixer.Sound('images/explosion1.mp3')
self.middle_sound = pygame.mixer.Sound('images/explosion2.wav')
self.big_sound = pygame.mixer.Sound('images/explosion3.wav')
self.plane = Plane(self) # 定义飞机类
self.enemies=pygame.sprite.Group()#定义敌机数组
self.bullets=pygame.sprite.Group()
self.time_count=0
bullet=Bullet(self)
self.bullets.add(bullet)
def _create_enemy(self):
if len(self.enemies)%10==9:
big=Enemy_big(self)
self.enemies.add(big)
elif len(self.enemies)%5==4:
middle=Enemy_middle(self)
self.enemies.add(middle)
else:
small=Enemy_small(self)
self.enemies.add(small)
def run_game(self):
while True:
self.time_count+=1
if self.time_count>=100 and len(self.enemies)<=50:
self._create_enemy()
self.time_count=0
self.check_events()
self.plane.update()
self.update_screen()
time.sleep(0.01) # 每0.01s循环一次
def check_events(self):
for event in pygame.event.get(): # 检测用户的动作
if event.type == pygame.QUIT: # 用户点击退出
pygame.quit()
sys.exit()
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_RIGHT:
self.plane.moving_right = True
elif event.key == pygame.K_LEFT:
self.plane.moving_left = True
if event.key == pygame.K_UP:
self.plane.moving_up = True
elif event.key == pygame.K_DOWN:
self.plane.moving_down = True
elif event.key==pygame.K_SPACE:
bullet=Bullet(self)
self.bullets.add(bullet)
elif event.type == pygame.KEYUP:
if event.key == pygame.K_RIGHT:
self.plane.moving_right = False
elif event.key == pygame.K_LEFT:
self.plane.moving_left = False
if event.key == pygame.K_UP:
self.plane.moving_up = False
elif event.key == pygame.K_DOWN:
self.plane.moving_down = False
# 游戏启动
def update_screen(self):
# 背景图向下移动,当图移到窗口位置,从头开始
self.position = (self.position + 1) if self.position < 0 else -1600
self.screen.blit(self.background, (0, self.position))
self.plane.update()
self.plane.draw_place()
self.enemies.update()
for b1 in self.bullets.copy():
if b1.rect.y<=0:
self.bullets.remove(b1)
self.bullets.update()
#pygame.sprite.groupcollide(self.bullets,self.enemies,True,True)
for enemy in self.enemies:
if not enemy.dead:
if pygame.sprite.spritecollide(enemy,self.bullets,True):
enemy.beshot()
if enemy.life <= 0:
if enemy.__class__.__name__ == 'Enemy_small':
self.small_sound.play()
elif enemy.__class__.__name__ == 'Enemy_middle':
self.middle_sound.play()
elif enemy.__class__.__name__ == 'Enemy_big':
self.big_sound.play()
else:
enemy.burning()
self.enemies.draw(self.screen)
self.bullets.draw(self.screen)
pygame.display.update() # 窗口刷新
if __name__ == '__main__':
pw = PlaneWar()
pw.run_game()
文件提取:
打开后将整个文件夹放入一个目录



