利用pygame模块实现飞机大战附加功能如下: (1) 实现碰撞检测(可以消灭敌机,也可以被敌机消灭) (2) 随机出现云朵在天空中漂浮 (3) 随机出现甜甜圈进行能量补给(生命力或子弹类型发生变化) (4) 有GAME OVER条件控制处理
时间: 2023-10-24 13:08:39 浏览: 29
好的,这是一个比较完整的飞机大战游戏附加功能的实现。下面我来给你详细讲解一下。
首先,我们需要导入pygame模块并初始化。然后,我们定义一些常量和变量,比如窗口大小、背景颜色、玩家飞机的图片等。
```python
import pygame
import random
# 初始化
pygame.init()
# 窗口大小
WINDOW_WIDTH = 480
WINDOW_HEIGHT = 800
# 颜色
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
# 创建窗口
screen = pygame.display.set_mode((WINDOW_WIDTH, WINDOW_HEIGHT))
# 玩家飞机图片
player_img = pygame.image.load('player.png')
# 玩家飞机初始位置
player_x = WINDOW_WIDTH // 2
player_y = WINDOW_HEIGHT - 100
# 玩家飞机速度
player_speed = 5
# 子弹图片
bullet_img = pygame.image.load('bullet.png')
# 子弹速度
bullet_speed = 10
# 敌机图片
enemy_img = pygame.image.load('enemy.png')
# 敌机速度
enemy_speed = 5
# 云朵图片
cloud_img = pygame.image.load('cloud.png')
# 甜甜圈图片
donut_img = pygame.image.load('donut.png')
# 生命值
life = 3
# 分数
score = 0
# 游戏是否结束
game_over = False
```
接着,我们定义一些函数,比如绘制玩家飞机、绘制子弹、绘制敌机等。
```python
# 绘制玩家飞机
def draw_player():
screen.blit(player_img, (player_x, player_y))
# 绘制子弹
def draw_bullet(bullet_list):
for bullet in bullet_list:
screen.blit(bullet_img, (bullet[0], bullet[1]))
bullet[1] -= bullet_speed
if bullet[1] < -bullet_img.get_height():
bullet_list.remove(bullet)
# 绘制敌机
def draw_enemy(enemy_list):
for enemy in enemy_list:
screen.blit(enemy_img, (enemy[0], enemy[1]))
enemy[1] += enemy_speed
if enemy[1] > WINDOW_HEIGHT:
enemy_list.remove(enemy)
# 绘制云朵
def draw_cloud(cloud_list):
for cloud in cloud_list:
screen.blit(cloud_img, (cloud[0], cloud[1]))
# 绘制甜甜圈
def draw_donut(donut_list):
for donut in donut_list:
screen.blit(donut_img, (donut[0], donut[1]))
donut[1] += enemy_speed
if donut[1] > WINDOW_HEIGHT:
donut_list.remove(donut)
```
然后,我们需要实现碰撞检测。碰撞检测分为两种,一种是玩家飞机和敌机的碰撞检测,一种是子弹和敌机的碰撞检测。
```python
# 玩家飞机和敌机的碰撞检测
def player_enemy_collision(player_x, player_y, enemy_list):
player_rect = pygame.Rect(player_x, player_y, player_img.get_width(), player_img.get_height())
for enemy in enemy_list:
enemy_rect = pygame.Rect(enemy[0], enemy[1], enemy_img.get_width(), enemy_img.get_height())
if player_rect.colliderect(enemy_rect):
enemy_list.remove(enemy)
global life
life -= 1
if life == 0:
global game_over
game_over = True
# 子弹和敌机的碰撞检测
def bullet_enemy_collision(bullet_list, enemy_list):
for bullet in bullet_list:
bullet_rect = pygame.Rect(bullet[0], bullet[1], bullet_img.get_width(), bullet_img.get_height())
for enemy in enemy_list:
enemy_rect = pygame.Rect(enemy[0], enemy[1], enemy_img.get_width(), enemy_img.get_height())
if bullet_rect.colliderect(enemy_rect):
bullet_list.remove(bullet)
enemy_list.remove(enemy)
global score
score += 1
```
接着,我们需要实现随机出现云朵和甜甜圈。这里我们可以定义一个函数,每隔一定时间就生成一个云朵或者甜甜圈。
```python
# 生成云朵或甜甜圈
def generate_cloud_or_donut(cloud_list, donut_list):
# 生成云朵
if random.randint(0, 100) < 5:
cloud_x = random.randint(0, WINDOW_WIDTH - cloud_img.get_width())
cloud_y = -cloud_img.get_height()
cloud_list.append([cloud_x, cloud_y])
# 生成甜甜圈
if random.randint(0, 100) < 5:
donut_x = random.randint(0, WINDOW_WIDTH - donut_img.get_width())
donut_y = -donut_img.get_height()
donut_list.append([donut_x, donut_y])
```
最后,我们需要实现游戏结束条件的控制处理。当生命值为0时,游戏结束,弹出游戏结束界面。
```python
# 游戏结束处理
def gameover():
font = pygame.font.Font(None, 48)
text = font.render('Game Over', True, BLACK)
text_rect = text.get_rect()
text_rect.center = (WINDOW_WIDTH // 2, WINDOW_HEIGHT // 2)
screen.blit(text, text_rect)
pygame.display.flip()
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
key_pressed = pygame.key.get_pressed()
if key_pressed[pygame.K_RETURN]:
global life, score, game_over
life = 3
score = 0
game_over = False
main()
pygame.time.Clock().tick(60)
```
最后,我们在主函数中调用上述函数,并进行事件处理和更新屏幕的操作。
```python
# 主函数
def main():
# 玩家飞机初始位置
global player_x, player_y
player_x = WINDOW_WIDTH // 2
player_y = WINDOW_HEIGHT - 100
# 子弹列表和敌机列表
bullet_list = []
enemy_list = []
# 云朵列表和甜甜圈列表
cloud_list = []
donut_list = []
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
# 键盘事件处理
key_pressed = pygame.key.get_pressed()
if key_pressed[pygame.K_LEFT]:
player_x -= player_speed
if key_pressed[pygame.K_RIGHT]:
player_x += player_speed
if key_pressed[pygame.K_UP]:
player_y -= player_speed
if key_pressed[pygame.K_DOWN]:
player_y += player_speed
if key_pressed[pygame.K_SPACE]:
bullet_x = player_x + player_img.get_width() // 2 - bullet_img.get_width() // 2
bullet_y = player_y - bullet_img.get_height()
bullet_list.append([bullet_x, bullet_y])
# 碰撞检测
player_enemy_collision(player_x, player_y, enemy_list)
bullet_enemy_collision(bullet_list, enemy_list)
# 游戏结束条件判断
if game_over:
gameover()
# 生成云朵或甜甜圈
generate_cloud_or_donut(cloud_list, donut_list)
# 绘制背景和玩家飞机
screen.fill(WHITE)
draw_player()
# 绘制子弹和敌机
draw_bullet(bullet_list)
draw_enemy(enemy_list)
# 绘制云朵和甜甜圈
draw_cloud(cloud_list)
draw_donut(donut_list)
# 更新屏幕
pygame.display.flip()
# 控制帧率
pygame.time.Clock().tick(60)
if __name__ == '__main__':
main()
```
好了,这就是一个比较完整的飞机大战游戏的实现了。你可以在这个基础上添加更多的功能,比如声音效果、关卡等,让游戏更加丰富多彩。