在这里我为您提供一个基于 Python 和 Pygame 库写的飞机大战游戏完整代码,具体实现内容如下:
建议使用 Python 3 及以上版本以及 Pygame 库的最新版本进行编译。
import pygame
import random
# 初始化 Pygame 库并创建屏幕对象
pygame.init()
SCREEN_WIDTH, SCREEN_HEIGHT = 480, 800
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
pygame.display.set_caption("飞机大战")
# 加载背景音乐和音效
pygame.mixer.music.load("assets/background.mp3")
pygame.mixer.music.set_volume(0.5)
bullet_sound = pygame.mixer.Sound("assets/bullet.wav")
bullet_sound.set_volume(0.3)
explosion_sound = pygame.mixer.Sound("assets/explosion.wav")
explosion_sound.set_volume(0.3)
# 定义颜色
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
# 加载图片资源
background_img = pygame.image.load("assets/background.jpg").convert()
player_img = pygame.image.load("assets/player.png").convert_alpha()
player_img_rect = player_img.get_rect()
enemy_img = pygame.image.load("assets/enemy.png").convert_alpha()
bullet_img = pygame.image.load("assets/bullet.png").convert_alpha()
# 定义玩家飞机类
class Player(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.image = player_img
self.rect = self.image.get_rect()
self.rect.centerx = SCREEN_WIDTH / 2
self.rect.bottom = SCREEN_HEIGHT - 10
self.speed_x = 0
self.speed_y = 0
def update(self):
self.rect.x += self.speed_x
self.rect.y += self.speed_y
if self.rect.right > SCREEN_WIDTH:
self.rect.right = SCREEN_WIDTH
elif self.rect.left < 0:
self.rect.left = 0
elif self.rect.bottom > SCREEN_HEIGHT:
self.rect.bottom = SCREEN_HEIGHT
elif self.rect.top < 0:
self.rect.top = 0
def shoot(self):
bullet = Bullet(self.rect.centerx, self.rect.top)
all_sprites.add(bullet)
bullets.add(bullet)
bullet_sound.play()
# 定义敌人飞机类
class Enemy(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.image = enemy_img
self.rect = self.image.get_rect()
self.rect.x = random.randrange(0, SCREEN_WIDTH - self.rect.width)
self.rect.y = random.randrange(-100, -40)
self.speed_y = random.randrange(1, 8)
self.speed_x = random.randrange(-3, 3)
def update(self):
self.rect.y += self.speed_y
self.rect.x += self.speed_x
if self.rect.top > SCREEN_HEIGHT or self.rect.right < 0 or self.rect.left > SCREEN_WIDTH:
self.kill()
# 定义子弹类
class Bullet(pygame.sprite.Sprite):
def __init__(self, x, y):
pygame.sprite.Sprite.__init__(self)
self.image = bullet_img
self.rect = self.image.get_rect()
self.rect.bottom = y
self.rect.centerx = x
self.speed_y = -10
def update(self):
self.rect.y += self.speed_y
if self.rect.bottom < 0:
self.kill()
# 定义精灵组
all_sprites = pygame.sprite.Group()
enemies = pygame.sprite.Group()
bullets = pygame.sprite.Group()
# 添加玩家飞机到精灵组
player = Player()
all_sprites.add(player)
# 循环更新游戏状态
running = True
clock = pygame.time.Clock()
score = 0
pygame.mixer.music.play(-1)
while running:
clock.tick(60)
# 处理事件
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_SPACE:
player.shoot()
# 判断是否击中敌人飞机
hits = pygame.sprite.groupcollide(enemies, bullets, True, True, pygame.sprite.collide_circle)
for hit in hits:
score += 10
explosion_sound.play()
enemy = Enemy()
all_sprites.add(enemy)
enemies.add(enemy)
# 判断是否与敌人飞机碰撞
hits = pygame.sprite.spritecollide(player, enemies, True, pygame.sprite.collide_circle)
if hits:
running = False
# 更新精灵组
all_sprites.update()
# 随机生成敌人飞机
if random.randrange(100) < 1 + int(score / 1000):
enemy = Enemy()
all_sprites.add(enemy)
enemies.add(enemy)
# 绘制背景和精灵组
screen.blit(background_img, (0, 0))
all_sprites.draw(screen)
# 绘制得分
font = pygame.font.Font(None, 36)
text = font.render("Score: " + str(score), True, WHITE)
screen.blit(text, (10, 10))
# 更新屏幕
pygame.display.update()
# 游戏结束处理
pygame.mixer.music.stop()
explosion_sound.play()
font = pygame.font.Font(None, 48)
text = font.render("Game Over", True, WHITE)
screen.blit(text, (SCREEN_WIDTH / 2 - text.get_rect().width / 2, SCREEN_HEIGHT / 2 - text.get_rect().height / 2))
pygame.display.update()
pygame.time.wait(3000)
# 退出 Pygame 库
pygame.quit()
可以在阅读后将代码复制到本地进行编译运行。