使用python写出飞机大战,要求敌我双方被命中时有爆炸特效,敌方速度随着分数的增长而变快,游戏结束时有展示排行榜和选择重新开始界面
时间: 2024-03-14 17:48:51 浏览: 79
好的,这是一个比较复杂的项目,我将分步骤为你讲解如何实现。
首先,我们需要安装Pygame库,它是一个专门用于游戏开发的Python库。你可以在终端中输入以下命令来安装:
```
pip install pygame
```
接下来,我们需要创建一个游戏窗口,并加载游戏所需的图片资源。例如,我们需要加载飞机、子弹、敌人和爆炸特效的图片。代码如下:
```python
import pygame
import random
# 初始化Pygame
pygame.init()
# 定义窗口大小
screen_width = 480
screen_height = 700
# 创建游戏窗口
screen = pygame.display.set_mode((screen_width, screen_height))
# 加载游戏所需的图片资源
background = pygame.image.load("images/background.png")
player = pygame.image.load("images/me1.png")
player_rect = player.get_rect()
bullet = pygame.image.load("images/bullet1.png")
enemy = pygame.image.load("images/enemy1.png")
enemies = []
for i in range(5):
enemy_rect = enemy.get_rect()
enemy_rect.left = random.randint(0, screen_width - enemy_rect.width)
enemy_rect.top = random.randint(-screen_height, 0)
enemies.append(enemy_rect)
enemy_speed = 1
bomb = pygame.image.load("images/bomb.png")
```
上述代码中,我们创建了一个窗口大小为480x700的游戏窗口,并加载了游戏所需的图片资源,包括背景、飞机、子弹、敌人和爆炸特效。
接下来,我们需要实现游戏中的核心逻辑,包括玩家飞机的移动、子弹的发射、敌人的生成和移动、以及碰撞检测和爆炸特效的显示。代码如下:
```python
# 定义玩家飞机的初始位置
player_rect.left = (screen_width - player_rect.width) // 2
player_rect.top = screen_height - player_rect.height
# 定义子弹的初始位置和速度
bullet_rect = bullet.get_rect()
bullet_speed = 5
bullet_active = False
# 定义游戏分数和字体
score = 0
font = pygame.font.Font(None, 36)
# 游戏循环
while True:
# 处理游戏事件
for event in pygame.event.get():
if event.type == pygame.QUIT:
# 退出游戏
pygame.quit()
exit()
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_SPACE:
# 发射子弹
if not bullet_active:
bullet_rect.left = player_rect.left + player_rect.width // 2 - bullet_rect.width // 2
bullet_rect.bottom = player_rect.top
bullet_active = True
# 绘制游戏界面
screen.blit(background, (0, 0))
screen.blit(player, player_rect)
if bullet_active:
screen.blit(bullet, bullet_rect)
for enemy_rect in enemies:
screen.blit(enemy, enemy_rect)
score_text = font.render("Score: {}".format(score), True, (255, 255, 255))
screen.blit(score_text, (10, 10))
# 移动玩家飞机
keys = pygame.key.get_pressed()
if keys[pygame.K_UP] and player_rect.top > 0:
player_rect.top -= 5
if keys[pygame.K_DOWN] and player_rect.bottom < screen_height:
player_rect.top += 5
if keys[pygame.K_LEFT] and player_rect.left > 0:
player_rect.left -= 5
if keys[pygame.K_RIGHT] and player_rect.right < screen_width:
player_rect.left += 5
# 移动子弹
if bullet_active:
bullet_rect.top -= bullet_speed
if bullet_rect.top < 0:
bullet_active = False
# 移动敌人
for enemy_rect in enemies:
enemy_rect.top += enemy_speed
if enemy_rect.top > screen_height:
enemy_rect.left = random.randint(0, screen_width - enemy_rect.width)
enemy_rect.top = random.randint(-screen_height, 0)
score += 1
enemy_speed = min(5, 1 + score // 10)
# 检测子弹和敌人的碰撞
for enemy_rect in enemies:
if bullet_active and enemy_rect.colliderect(bullet_rect):
bullet_active = False
enemy_rect.left = random.randint(0, screen_width - enemy_rect.width)
enemy_rect.top = random.randint(-screen_height, 0)
score += 1
enemy_speed = min(5, 1 + score // 10)
screen.blit(bomb, enemy_rect)
# 检测玩家飞机和敌人的碰撞
for enemy_rect in enemies:
if player_rect.colliderect(enemy_rect):
# 显示爆炸特效
screen.blit(bomb, player_rect)
for enemy_rect in enemies:
screen.blit(bomb, enemy_rect)
pygame.display.update()
pygame.time.delay(1000)
# 显示排行榜和重新开始界面
pygame.quit()
exit()
# 更新游戏界面
pygame.display.update()
```
上述代码中,我们使用Pygame提供的函数来处理游戏事件和绘制游戏界面。玩家飞机可以通过键盘操作来移动,按下空格键可以发射子弹。敌人会随着分数的增长而速度变快,并在移动到屏幕底部时重新生成。当子弹和敌人发生碰撞时,会显示爆炸特效,并增加分数。当玩家飞机和敌人发生碰撞时,会显示爆炸特效,并展示排行榜和重新开始界面。
最后,我们需要实现排行榜和重新开始界面。可以使用Pygame提供的文本框和按钮来实现。代码如下:
```python
# 定义排行榜和重新开始界面
def show_menu():
# 显示排行榜
score_list = [("Player", "Score")]
with open("score.txt", "r") as f:
for line in f:
score_list.append(tuple(line.strip().split()))
menu_font = pygame.font.Font(None, 48)
menu_text = menu_font.render("Top Scores", True, (255, 255, 255))
screen.blit(menu_text, (screen_width // 2 - menu_text.get_width() // 2, 100))
for i, (player_name, player_score) in enumerate(score_list):
if i >= 10:
break
text = menu_font.render("{}: {}".format(player_name, player_score), True, (255, 255, 255))
screen.blit(text, (screen_width // 2 - text.get_width() // 2, 200 + i * 50))
# 显示重新开始界面
input_box = pygame.Rect(screen_width // 2 - 100, 500, 200, 50)
input_font = pygame.font.Font(None, 36)
input_text = ""
input_active = True
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
# 退出游戏
pygame.quit()
exit()
if event.type == pygame.KEYDOWN:
if input_active:
if event.key == pygame.K_RETURN:
# 保存分数并重新开始游戏
with open("score.txt", "a") as f:
f.write("{} {}\n".format(input_text, score))
return
elif event.key == pygame.K_BACKSPACE:
input_text = input_text[:-1]
else:
input_text += event.unicode
# 绘制重新开始界面
screen.blit(background, (0, 0))
input_box_text = input_font.render("Enter your name: {}".format(input_text), True, (255, 255, 255))
screen.blit(input_box_text, input_box)
pygame.draw.rect(screen, (255, 255, 255), input_box, 2)
pygame.display.update()
# 开始游戏
show_menu()
while True:
score = 0
enemies = []
for i in range(5):
enemy_rect = enemy.get_rect()
enemy_rect.left = random.randint(0, screen_width - enemy_rect.width)
enemy_rect.top = random.randint(-screen_height, 0)
enemies.append(enemy_rect)
enemy_speed = 1
bullet_active = False
show_menu()
```
上述代码中,我们定义了一个show_menu()函数,用于展示排行榜和重新开始界面。排行榜可以从文件中读取分数并展示在屏幕上;重新开始界面是一个文本框和一个按钮,用于输入玩家姓名并保存分数,并重新开始游戏。在游戏结束时,我们调用show_menu()函数展示排行榜和重新开始界面。当玩家输入姓名并点击按钮时,保存分数并重新开始游戏。
阅读全文