import sys
import pygame
import random
class Util: # 点击类
@staticmethod
def click_check(sprite):
if pygame.mouse.get_pressed()[0]:
if sprite.rect.collidepoint(pygame.mouse.get_pos()):
return True
return False
class BossSprite(pygame.sprite.Sprite):
def __init__(self, name):
super().__init__()
self.image = pygame.image.load(name)
self.rect = self.image.get_rect()
class BulletSprite(BossSprite):
def __init__(self, name, speed, centerx, y):
super().__init__(name)
self.speed = speed
self.rect.centerx = centerx
self.rect.top = y
def update(self):
self.rect.top += self.speed
if self.rect.top > 700 or self.rect.top < 0:
self.kill()
class BgSprite(BossSprite):
def __init__(self, name, top_left):
super().__init__(name)
self.rect.topleft = top_left
def update(self):
self.rect.top += 5
if self.rect.top >= 700:
self.rect.top = -700
class BgManage:
def __init__(self, gm):
self.gm = gm
self.bg_group = pygame.sprite.Group()
BgSprite("fjdzimg/bg.png", (0, 0)).add(self.bg_group)
BgSprite("fjdzimg/bg.png", (0, -700)).add(self.bg_group)
def update(self):
self.bg_group.update()
self.bg_group.draw(self.gm.screen)
class EquipSprite(BossSprite): # 物资精灵类
def __init__(self, name, speed, type):
super().__init__(name)
self.rect.left = random.randint(0, 500 - self.rect.width)
self.rect.bottom = 0
self.speed = speed
self.equip_bullet_group = pygame.sprite.Group()
self.type = type
def update(self):
self.rect.top += self.speed
class EquipManage: # 物资管理类
def __init__(self, gm):
self.gm = gm
self.equip_group = pygame.sprite.Group()
self.time_count = 10
def generate(self):
odds = random.random()
if odds >= 0.7:
self.equip = EquipSprite("fjdzimg/hp.png", 3, 1000)
self.equip.add(self.equip_group)
if 0.35 <= odds < 0.7:
self.equip = EquipSprite("fjdzimg/bomb_supply.png", 3, 2000)
self.equip.add(self.equip_group)
if odds < 0.35:
self.equip = EquipSprite("fjdzimg/bullet_supply.png", 3, 3000)
self.equip.add(self.equip_group)
def update(self):
self.time_count -= 0.1
if self.time_count <= 0:
self.time_count = 10
self.generate()
self.equip_group.update()
self.equip_group.draw(self.gm.screen)
class EnemySprite(BossSprite): # 敌机精灵类
def __init__(self, name, speed, gm, hp, type):
self.gm = gm
super().__init__(name)
self.rect.left = random.randint(0, 500 - self.rect.width)
self.rect.bottom = 0
self.speed = speed
self.enemy_bullet_group = pygame.sprite.Group()
self.shoot_time = 5
self.max_hp = hp
self.hp = hp
self.type = type
def draw_hp(self):
pygame.draw.rect(self.gm.screen, (127, 127, 127), (
self.rect.left + self.rect.width / 2 - self.max_hp / 2, self.rect.top, self.max_hp, 10))
pygame.draw.rect(self.gm.screen, (0, 255, 0), (
self.rect.left + self.rect.width / 2 - self.max_hp / 2, self.rect.top, self.hp, 10))
def shoot(self):
self.enemy_bullet = BulletSprite("fjdzimg/enemy_bullet.png", 5, self.rect.centerx, self.rect.bottom)
self.enemy_bullet.add(self.enemy_bullet_group)
def shoot1(self):
for i in range(1, 4):
self.enemy_bullet = BulletSprite("fjdzimg/enemy_bullet.png", 5, self.rect.centerx + 30 - i * 15,
self.rect.bottom)
self.enemy_bullet.add(self.enemy_bullet_group)
def shoot2(self):
for i in range(1, 6):
self.enemy_bullet = BulletSprite("fjdzimg/enemy_bullet.png", 5, self.rect.centerx + 60 - i * 20,
self.rect.bottom)
self.enemy_bullet.add(self.enemy_bullet_group)
def update(self):
self.draw_hp()
self.rect.top += self.speed
if self.rect.top > 700:
self.kill()
self.shoot_time -= 0.1
if self.shoot_time <= 0:
self.shoot_time = 5
if self.type == 100:
self.shoot2()
if self.type == 200:
self.shoot1()
if self.type == 300 or self.type == 400:
self.shoot()
self.enemy_bullet_group.update()
self.enemy_bullet_group.draw(self.gm.screen)
class EnemyManage: # 敌机管理类
def __init__(self, gm):
self.gm = gm
self.enemy_group = pygame.sprite.Group()
self.time_count = 7
def generate(self):
odds = random.random()
if odds >= 0.92:
self.enemy = EnemySprite("fjdzimg/enemy_aircraft20.png", 3, self.gm, 140, 100)
self.enemy.add(self.enemy_group)
if 0.75 <= odds < 0.92:
self.enemy = EnemySprite("fjdzimg/enemy_aircraft1.png", 3, self.gm, 80, 200)
self.enemy.add(self.enemy_group)
if 0.45 <= odds < 0.75:
self.enemy = EnemySprite("fjdzimg/enemy_aircraft2.png", 2, self.gm, 40, 300)
self.enemy.add(self.enemy_group)
if odds < 0.45:
self.enemy = EnemySprite("fjdzimg/enemy_aircraft3.png", 1, self.gm, 20, 400)
self.enemy.add(self.enemy_group)
def update(self):
self.time_count -= 0.1
if self.time_count <= 0:
self.time_count = 7
self.generate()
self.enemy_group.update()
self.enemy_group.draw(self.gm.screen)
class PlayerSprite(BossSprite): # 玩家精灵类
def __init__(self, name, center, gm):
super().__init__(name)
self.gm = gm
self.rect.center = center
self.my_bullet_group = pygame.sprite.Group()
self.shoot_time = 1
self.max_hp = 100
self.hp = 100
self.foot2_time = 0
self.score = 0
def draw_hp(self):
pygame.draw.rect(self.gm.screen, (127, 127, 127), (
self.rect.left + self.rect.width / 2 - 50, self.rect.bottom - 10, 100, 10))
pygame.draw.rect(self.gm.screen, (0, 255, 0), (
self.rect.left + self.rect.width / 2 - 50, self.rect.bottom - 10, self.hp, 10))
def my_score(self):
self.font = pygame.font.Font("font/simkai.ttf", 20)
self.textImage = self.font.render(f"分数:{self.score}", True, (0, 255, 255))
self.gm.screen.blit(self.textImage, (400, 30))
def shoot(self):
self.my_bullet = BulletSprite("fjdzimg/my_bullet.png", -10, self.rect.centerx, self.rect.top + 15)
self.my_bullet.add(self.my_bullet_group)
def shoot2(self):
for i in range(1, 4):
self.my_bullet = BulletSprite("fjdzimg/my_bullet.png", -10, self.rect.centerx + 60 - i * 30,
self.rect.top + 15)
self.my_bullet.add(self.my_bullet_group)
def update(self):
self.my_score()
self.draw_hp()
key_pressed = pygame.key.get_pressed()
if key_pressed[pygame.K_LEFT] and self.rect.left > 0:
self.rect.left -= 5
if key_pressed[pygame.K_RIGHT] and self.rect.right < 500:
self.rect.right += 5
if key_pressed[pygame.K_UP] and self.rect.top > 0:
self.rect.top -= 5
if key_pressed[pygame.K_DOWN] and self.rect.bottom < 700:
self.rect.bottom += 5
self.shoot_time -= 0.2
if self.shoot_time <= 0:
self.shoot_time = 1
self.foot2_time -= 1
if self.foot2_time <= 0:
self.shoot()
else:
self.shoot2()
self.my_bullet_group.update()
self.my_bullet_group.draw(self.gm.screen)
class PlayerManage: # 玩家管理类
def __init__(self, gm):
self.gm = gm
self.player_group = pygame.sprite.Group()
def born(self):
odds = random.random()
self.score = 0
if 0.75 < odds:
self.player = PlayerSprite("fjdzimg/my_aircraft1.png", (250, 630), self.gm)
self.player.add(self.player_group)
if 0.5 < odds <= 0.75:
self.player = PlayerSprite("fjdzimg/my_aircraft2.png", (250, 630), self.gm)
self.player.add(self.player_group)
if 0.25 < odds <= 0.5:
self.player = PlayerSprite("fjdzimg/my_aircraft3.png", (250, 630), self.gm)
self.player.add(self.player_group)
if odds <= 0.25:
self.player = PlayerSprite("fjdzimg/my_aircraft4.png", (250, 630), self.gm)
self.player.add(self.player_group)
def die(self):
self.player_group.empty()
self.gm.state = "end"
def update(self):
self.player_group.update()
self.player_group.draw(self.gm.screen)
class UISprite(BossSprite): # ui精灵类
def __init__(self, name, center):
super().__init__(name)
self.rect.center = center
class UIManage: # ui管理类
def __init__(self, gm):
self.gm = gm
# 开始
self.ready_group = pygame.sprite.Group()
self.begin_btn = UISprite("fjdzimg/ks.png", (250, 350))
self.begin_btn.add(self.ready_group)
# 重开
# 退出
self.end_group = pygame.sprite.Group()
self.replay_btn = UISprite("fjdzimg/again.png", (250, 200))
self.replay_btn.add(self.end_group)
self.exit_btn = UISprite("fjdzimg/exit.png", (250, 350))
self.exit_btn.add(self.end_group)
# 暂停
self.suspend_group = pygame.sprite.Group()
self.suspend_btn = UISprite("fjdzimg/stop.png", (250, 350))
self.suspend_btn.add(self.suspend_group)
def update(self):
if self.gm.state == "ready":
self.ready_group.draw(self.gm.screen)
if Util.click_check(self.begin_btn):
self.gm.state = "gaming"
self.gm.player_manage.born()
elif self.gm.state == "gaming":
pass
elif self.gm.state == "end":
self.end_group.draw(self.gm.screen)
if Util.click_check(self.replay_btn):
self.gm.state = "gaming" # 状态设为gaming 重新开始
self.gm.player_manage.born()
if Util.click_check(self.exit_btn):
pygame.quit()
sys.exit()
elif self.gm.state == "suspend":
self.suspend_group.draw(self.gm.screen)
if Util.click_check(self.suspend_btn):
self.gm.state = "gaming"
class GameManage: # 游戏管理类
def __init__(self, name):
pygame.init()
self.clock = pygame.time.Clock()
self.state = "ready"
self.screen = pygame.display.set_mode((500, 700))
self.screen.fill("#FFFACD")
pygame.display.set_caption(name)
self.bg_manage = BgManage(self)
self.ui_manage = UIManage(self)
self.player_manage = PlayerManage(self)
self.enemy_manage = EnemyManage(self)
self.equip_manage = EquipManage(self)
def check_event(self): # 事件检测
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
if event.type == pygame.KEYUP:
if event.key == pygame.K_SPACE:
self.state = "end"
self.enemy_manage.enemy_group.empty()
self.equip_manage.equip_group.empty()
self.player_manage.player_group.empty()
if event.key == pygame.K_LALT:
self.state = "suspend"
if event.key == pygame.K_RALT:
self.state = "gaming"
def check_collider(self): # 碰撞检测
player_bullet_enemy = pygame.sprite.groupcollide(self.player_manage.player.my_bullet_group,
self.enemy_manage.enemy_group, True, False)
if player_bullet_enemy:
for enemys in player_bullet_enemy.values():
# print(player_bullet_enemy.values())
# print(enemys)
for enemy in enemys:
# print(enemy)
enemy.hp -= 10
if enemy.hp <= 0:
if enemy.type == 100:
self.player_manage.player.score += 10
if enemy.type == 200:
self.player_manage.player.score += 5
if enemy.type == 300:
self.player_manage.player.score += 3
if enemy.type == 400:
self.player_manage.player.score += 1
enemy.kill()
player_equip = pygame.sprite.groupcollide(self.player_manage.player_group, self.equip_manage.equip_group, False,
True)
if player_equip:
for equips in player_equip.values():
for equip in equips:
if equip.type == 1000:
self.player_manage.player.hp += 10
if self.player_manage.player.hp >= 100:
self.player_manage.player.hp = 100
if equip.type == 2000:
self.enemy_manage.enemy_group.empty()
if equip.type == 3000:
self.player_manage.player.foot2_time = 11
for enemy in self.enemy_manage.enemy_group.sprites():
if pygame.sprite.groupcollide(enemy.enemy_bullet_group, self.player_manage.player_group, True, False):
self.player_manage.player.hp -= 10
if self.player_manage.player.hp <= 0:
self.state = "end"
self.player_manage.player_group.empty()
self.enemy_manage.enemy_group.empty()
self.equip_manage.equip_group.empty()
if pygame.sprite.groupcollide(self.player_manage.player_group, self.enemy_manage.enemy_group, False, True):
self.player_manage.player.hp -= 50
self.player_manage.player.score -= 5
if self.player_manage.player.hp <= 0 or self.player_manage.player.score < 0:
self.state = "end"
self.player_manage.player_group.empty()
self.enemy_manage.enemy_group.empty()
self.equip_manage.equip_group.empty()
for enemy in self.enemy_manage.enemy_group.sprites():
pygame.sprite.groupcollide(enemy.enemy_bullet_group, self.player_manage.player.my_bullet_group, True,
True) # pengzh #
def run(self): # 调用刷新启动
while True:
self.clock.tick(24)
self.check_event() # 调用检查事件
self.screen.fill("#B0E0E6")
self.ui_manage.update()
if self.state == "gaming":
self.bg_manage.update()
self.player_manage.update()
self.enemy_manage.update()
self.equip_manage.update()
self.check_collider()
pygame.display.flip()
gm = GameManage("飞机大战")
gm.run()