代码如下
import sys
from pygame import *
from os import *
from random import *
chdir(r"C:\Users\Administrator\PycharmProjects\pythonProject\SurfaceWar\resources") # 改变工作目录
init()
screen = display.set_mode((600, 700)) # 窗口大小
display.set_caption("PlaneWar") # 标题
class Player(sprite.Sprite):
def __init__(self, location, blood):
sprite.Sprite.__init__(self)
self.img = image.load("player.png").convert_alpha()
self.rect = self.img.get_rect()
self.rect.center = location
self.moving_right = False # 是否在试图向某个方向移动
self.moving_left = False
self.moving_up = False
self.moving_down = False
self.blood = blood # 血量和分数
self.score = 0
def update(self, *args, **kwargs):
if self.moving_right: # 移动方式
if self.rect.x < 570:
self.rect.x += 1
if self.moving_left:
if self.rect.x > 0:
self.rect.x = self.rect.x - 1
if self.moving_down:
if self.rect.y < 650:
self.rect.y += 1
if self.moving_up:
if self.rect.y > 50:
self.rect.y -= 1
class Enemy(sprite.Sprite):
enemies = [] # 敌人列表,无需精灵组
def __init__(self, location: tuple):
sprite.Sprite.__init__(self)
self.live = True # 是否活着
self.image = image.load("enemy1.png")
self.rect = self.image.get_rect()
self.rect.topleft = location
self.blood = int(game.player.score) / 10 + 1 # 每过10分,血量加1
Enemy.enemies.append(self)
def update(self, *args, **kwargs):
if self.live:
self.rect.y += 1
if len(EnemyBullet.enemy_bullets) < 10 and randint(1, 40) == 3:
EnemyBullet(self)
if self.rect.y > 800:
self.live = False
if self.blood < 0:
self.live = False
screen.blit(self.image, self.rect)
else:
Enemy.enemies.remove(self) # 移除该敌机
class PlayerBullet(sprite.Sprite):
player_bullets = [] # 玩家子弹
def __init__(self, player: Player):
sprite.Sprite.__init__(self)
self.live = True
self.image = image.load("player_bullet.png").convert_alpha()
self.rect = self.image.get_rect()
self.rect.center = player.rect.center
self.player = player
self.sound = mixer.Sound("bullet.wav")
self.sound.set_volume(0.1)
self.sound.play()
PlayerBullet.player_bullets.append(self)
def update(self, *args, **kwargs):
if self.live:
if self.rect.y < 0: # 已出屏幕
self.live = False
else: # 是否撞击到敌人或敌人子弹
for i in Enemy.enemies:
if self.rect.colliderect(i.rect):
i.blood -= 1
self.live = False
self.player.score += 1
for i in EnemyBullet.enemy_bullets:
if self.rect.colliderect(i.rect):
EnemyBullet.enemy_bullets.remove(i)
self.live = False
self.rect.y -= 1
screen.blit(self.image, self.rect)
else:
PlayerBullet.player_bullets.remove(self)
class EnemyBullet(sprite.Sprite):
enemy_bullets = []
def __init__(self, enemy: Enemy):
sprite.Sprite.__init__(self)
self.image = image.load("enemy_bullet.png").convert_alpha()
self.live = True
self.rect = self.image.get_rect()
self.rect.center = enemy.rect.midbottom
self.sound = mixer.Sound("bullet.wav")
EnemyBullet.enemy_bullets.append(self)
def update(self, player: Player):
if self.live:
if self.rect.y > 700: # 参照PlayerBullet
self.live = False
else:
if self.rect.colliderect(player):
player.blood -= 1
self.live = False
else:
self.rect.y += 2
screen.blit(self.image, self.rect)
else:
EnemyBullet.enemy_bullets.remove(self)
class Game: # 游戏类
def __init__(self, player: Player):
self.player = player
self.font = font.SysFont(["方正粗黑宋简体"], 30)
def event(self): # 事件管理
for i in event.get():
if i.type == QUIT:
sys.exit(0)
elif i.type == KEYDOWN:
if i.key == K_LEFT:
self.player.moving_left = True
elif i.key == K_RIGHT:
self.player.moving_right = True
elif i.key == K_UP:
self.player.moving_up = True
elif i.key == K_DOWN:
self.player.moving_down = True
elif i.type == KEYUP:
if i.key == K_LEFT:
self.player.moving_left = False
elif i.key == K_RIGHT:
self.player.moving_right = False
elif i.key == K_UP:
self.player.moving_up = False
elif i.key == K_DOWN:
self.player.moving_down = False
elif i.key == K_SPACE:
if len(PlayerBullet.player_bullets) < 8:
PlayerBullet(self.player)
def render_player_info(self): # 显示分数和血量
screen.blit(self.font.render("Blood:" + str(self.player.blood), 0, "dark blue"), (450, 20))
screen.blit(self.font.render("Score:" + str(self.player.score), 0, "dark blue"), (50, 20))
def show_end(self): # 结束
end_clock = time.Clock()
end_clock.tick(5)
end = self.font.render("Final Score:{}".format(self.player.score), 0, "dark green")
screen.blit(end, (250, 350))
screen.blit(self.font.render("Press any key to cancel the game...", 0, "black", "green"), (10, 625))
display.flip()
while True:
for i in event.get():
if i.type == KEYDOWN:
sys.exit()
elif i.type == QUIT:
sys.exit()
def run(self):
self.event()
self.player.update()
screen.blit(self.player.img, self.player.rect)
for enemy in Enemy.enemies:
enemy.update()
for enemy_bullet in EnemyBullet.enemy_bullets:
enemy_bullet.update(self.player)
for player_bullet in PlayerBullet.player_bullets:
player_bullet.update()
if len(Enemy.enemies) < 7 and randint(1, 40) == 1:
Enemy((randint(25, 575), 10))
self.render_player_info()
game = Game(Player((300, 350), 20))
clock = time.Clock()
mixer.init()
mixer.music.load("Game.wav") # 背景音乐
mixer.music.play(-1)
while game.player.blood > 0:
clock.tick(200)
screen.fill("light green")
game.run()
display.flip()
mixer.music.stop()
game.show_end()