利用pygame模块实现飞机大战附加功能如下: (1) 实现碰撞检测(可以消灭敌机,也可以被敌机消灭) (2) 随机出现云朵在天空中漂浮 (3) 随机出现甜甜圈进行能量补给(生命力或子弹类型发生变化) (4) 有GAME OVER条件控制处理
时间: 2023-09-23 08:03:30 浏览: 47
好的,我可以为您提供一个基本的飞机大战游戏代码,其中包含您所需的附加功能。请注意,这只是一个示例代码,您可以根据自己的需求进行修改和优化。以下是代码:
```python
import pygame
import random
# 初始化Pygame
pygame.init()
# 游戏窗口大小
SCREEN_WIDTH = 480
SCREEN_HEIGHT = 700
# 创建游戏窗口
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
# 设置游戏窗口标题
pygame.display.set_caption("飞机大战")
# 加载背景图片
background_img = pygame.image.load("images/background.png")
# 加载玩家飞机图片
player_img = pygame.image.load("images/player.png")
# 加载敌机图片
enemy_img = pygame.image.load("images/enemy.png")
# 加载云朵图片
cloud_img = pygame.image.load("images/cloud.png")
# 加载甜甜圈图片
powerup_img = pygame.image.load("images/powerup.png")
# 加载子弹图片
bullet_img = pygame.image.load("images/bullet.png")
# 加载爆炸动画图片
explosion_imgs = [
pygame.image.load("images/explosion1.png"),
pygame.image.load("images/explosion2.png"),
pygame.image.load("images/explosion3.png"),
pygame.image.load("images/explosion4.png")
]
# 设置字体
font = pygame.font.Font(None, 36)
# 定义玩家飞机类
class Player(pygame.sprite.Sprite):
def __init__(self, x, y):
super().__init__()
self.image = player_img
self.rect = self.image.get_rect()
self.rect.x = x
self.rect.y = y
self.speed = 5
self.lives = 3
self.bullet_type = "normal"
def update(self):
# 移动玩家飞机
keys = pygame.key.get_pressed()
if keys[pygame.K_UP]:
self.rect.y -= self.speed
if keys[pygame.K_DOWN]:
self.rect.y += self.speed
if keys[pygame.K_LEFT]:
self.rect.x -= self.speed
if keys[pygame.K_RIGHT]:
self.rect.x += self.speed
# 碰撞检测
for enemy in pygame.sprite.spritecollide(self, enemies, True):
self.lives -= 1
explosion = Explosion(enemy.rect.x, enemy.rect.y)
explosions.add(explosion)
if self.lives <= 0:
game_over()
for powerup in pygame.sprite.spritecollide(self, powerups, True):
if powerup.type == "life":
self.lives += 1
elif powerup.type == "bullet":
self.bullet_type = "powerful"
# 控制玩家飞机不超出窗口
if self.rect.x < 0:
self.rect.x = 0
elif self.rect.x > SCREEN_WIDTH - self.rect.width:
self.rect.x = SCREEN_WIDTH - self.rect.width
if self.rect.y < 0:
self.rect.y = 0
elif self.rect.y > SCREEN_HEIGHT - self.rect.height:
self.rect.y = SCREEN_HEIGHT - self.rect.height
def shoot(self):
if self.bullet_type == "normal":
bullet = Bullet(self.rect.x + self.rect.width / 2, self.rect.y)
elif self.bullet_type == "powerful":
bullet = PowerfulBullet(self.rect.x + self.rect.width / 2, self.rect.y)
self.bullet_type = "normal"
bullets.add(bullet)
# 定义敌机类
class Enemy(pygame.sprite.Sprite):
def __init__(self, x, y):
super().__init__()
self.image = enemy_img
self.rect = self.image.get_rect()
self.rect.x = x
self.rect.y = y
self.speed = random.randint(1, 5)
def update(self):
# 移动敌机
self.rect.y += self.speed
# 碰撞检测
for bullet in pygame.sprite.spritecollide(self, bullets, True):
explosion = Explosion(self.rect.x, self.rect.y)
explosions.add(explosion)
self.kill()
# 控制敌机不超出窗口
if self.rect.y > SCREEN_HEIGHT:
self.kill()
# 定义云朵类
class Cloud(pygame.sprite.Sprite):
def __init__(self, x, y):
super().__init__()
self.image = cloud_img
self.rect = self.image.get_rect()
self.rect.x = x
self.rect.y = y
self.speed = random.randint(1, 3)
def update(self):
# 移动云朵
self.rect.x += self.speed
# 控制云朵不超出窗口
if self.rect.x > SCREEN_WIDTH:
self.rect.x = -self.rect.width
# 定义甜甜圈类
class Powerup(pygame.sprite.Sprite):
def __init__(self, x, y):
super().__init__()
self.image = powerup_img
self.rect = self.image.get_rect()
self.rect.x = x
self.rect.y = y
self.speed = random.randint(1, 3)
self.type = random.choice(["life", "bullet"])
def update(self):
# 移动甜甜圈
self.rect.y += self.speed
# 控制甜甜圈不超出窗口
if self.rect.y > SCREEN_HEIGHT:
self.kill()
# 定义子弹类
class Bullet(pygame.sprite.Sprite):
def __init__(self, x, y):
super().__init__()
self.image = bullet_img
self.rect = self.image.get_rect()
self.rect.x = x - self.rect.width / 2
self.rect.y = y
self.speed = -10
def update(self):
# 移动子弹
self.rect.y += self.speed
# 控制子弹不超出窗口
if self.rect.y < -self.rect.height:
self.kill()
# 定义强力子弹类
class PowerfulBullet(Bullet):
def __init__(self, x, y):
super().__init__(x, y)
self.image = pygame.Surface((10, 30))
self.image.fill((255, 0, 0))
self.speed = -15
# 定义爆炸动画类
class Explosion(pygame.sprite.Sprite):
def __init__(self, x, y):
super().__init__()
self.images = explosion_imgs
self.index = 0
self.image = self.images[self.index]
self.rect = self.image.get_rect()
self.rect.x = x
self.rect.y = y
self.timer = 0
self.delay = 5
def update(self):
# 播放爆炸动画
self.timer += 1
if self.timer == self.delay:
self.index += 1
if self.index == len(self.images):
self.kill()
else:
self.image = self.images[self.index]
self.timer = 0
# 定义游戏结束函数
def game_over():
text = font.render("GAME OVER", True, (255, 0, 0))
text_rect = text.get_rect()
text_rect.center = (SCREEN_WIDTH / 2, SCREEN_HEIGHT / 2)
screen.blit(text, text_rect)
pygame.display.update()
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
# 创建精灵组
all_sprites = pygame.sprite.Group()
enemies = pygame.sprite.Group()
bullets = pygame.sprite.Group()
clouds = pygame.sprite.Group()
powerups = pygame.sprite.Group()
explosions = pygame.sprite.Group()
# 创建玩家飞机
player = Player(SCREEN_WIDTH / 2 - player_img.get_width() / 2, SCREEN_HEIGHT - player_img.get_height())
all_sprites.add(player)
# 创建敌机
for i in range(5):
enemy = Enemy(random.randint(0, SCREEN_WIDTH - enemy_img.get_width()), random.randint(-1000, -100))
enemies.add(enemy)
all_sprites.add(enemy)
# 创建云朵
for i in range(3):
cloud = Cloud(random.randint(0, SCREEN_WIDTH - cloud_img.get_width()), random.randint(0, SCREEN_HEIGHT / 3))
clouds.add(cloud)
all_sprites.add(cloud)
# 创建甜甜圈
for i in range(3):
powerup = Powerup(random.randint(0, SCREEN_WIDTH - powerup_img.get_width()), random.randint(-1000, -100))
powerups.add(powerup)
all_sprites.add(powerup)
# 游戏主循环
clock = pygame.time.Clock()
while True:
# 处理游戏事件
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_SPACE:
player.shoot()
# 更新游戏元素
all_sprites.update()
# 绘制游戏元素
screen.blit(background_img, (0, 0))
all_sprites.draw(screen)
# 显示生命值和子弹类型
lives_text = font.render("Lives: " + str(player.lives), True, (255, 255, 255))
screen.blit(lives_text, (10, 10))
if player.bullet_type == "normal":
bullet_text = font.render("Bullet: Normal", True, (255, 255, 255))
else:
bullet_text = font.render("Bullet: Powerful", True, (255, 0, 0))
screen.blit(bullet_text, (10, 50))
# 判断游戏是否结束
if player.lives <= 0:
game_over()
# 产生新的敌机
if len(enemies) < 5:
enemy = Enemy(random.randint(0, SCREEN_WIDTH - enemy_img.get_width()), random.randint(-1000, -100))
enemies.add(enemy)
all_sprites.add(enemy)
# 产生新的云朵
if len(clouds) < 3:
cloud = Cloud(random.randint(0, SCREEN_WIDTH - cloud_img.get_width()), random.randint(0, SCREEN_HEIGHT / 3))
clouds.add(cloud)
all_sprites.add(cloud)
# 产生新的甜甜圈
if len(powerups) < 3:
powerup = Powerup(random.randint(0, SCREEN_WIDTH - powerup_img.get_width()), random.randint(-1000, -100))
powerups.add(powerup)
all_sprites.add(powerup)
# 更新屏幕
pygame.display.update()
# 控制帧率
clock.tick(60)
```
希望这可以帮助您实现您的需求。