
py
import pygame
import random
import sys
# 初始化pygame
pygame.init()
# 游戏窗口设置
SCREEN_WIDTH = 480
SCREEN_HEIGHT = 600
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
pygame.display.set_caption("飞机大战")
# 颜色定义
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
# 玩家飞机类
class Player(pygame.sprite.Sprite):
def __init__(self):
super().__init__()
self.image = pygame.Surface((50, 40))
self.image.fill(WHITE)
self.rect = self.image.get_rect()
self.rect.centerx = SCREEN_WIDTH // 2
self.rect.bottom = SCREEN_HEIGHT - 10
self.speed = 8
def update(self):
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT] and self.rect.left > 0:
self.rect.x -= self.speed
if keys[pygame.K_RIGHT] and self.rect.right < SCREEN_WIDTH:
self.rect.x += self.speed
def shoot(self):
bullet = Bullet(self.rect.centerx, self.rect.top)
all_sprites.add(bullet)
bullets.add(bullet)
# 敌机类
class Enemy(pygame.sprite.Sprite):
def __init__(self):
super().__init__()
self.image = pygame.Surface((30, 30))
self.image.fill((255, 0, 0)) # 红色敌机
self.rect = self.image.get_rect()
self.rect.x = random.randrange(SCREEN_WIDTH - self.rect.width)
self.rect.y = random.randrange(-100, -40)
self.speedy = random.randrange(1, 5)
def update(self):
self.rect.y += self.speedy
if self.rect.top > SCREEN_HEIGHT:
self.rect.x = random.randrange(SCREEN_WIDTH - self.rect.width)
self.rect.y = random.randrange(-100, -40)
self.speedy = random.randrange(1, 5)
# 子弹类
class Bullet(pygame.sprite.Sprite):
def __init__(self, x, y):
super().__init__()
self.image = pygame.Surface((5, 10))
self.image.fill((0, 255, 0)) # 绿色子弹
self.rect = self.image.get_rect()
self.rect.centerx = x
self.rect.bottom = y
self.speedy = -10
def update(self):
self.rect.y += self.speedy
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)
# 创建敌机
for i in range(8):
enemy = Enemy()
all_sprites.add(enemy)
enemies.add(enemy)
# 游戏状态
score = 0
clock = pygame.time.Clock()
FPS = 60
# 游戏主循环
running = True
while running:
# 保持循环以正确的速度运行
clock.tick(FPS)
# 处理输入事件
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()
# 更新
all_sprites.update()
# 检测子弹与敌机的碰撞
hits = pygame.sprite.groupcollide(enemies, bullets, True, True)
for hit in hits:
score += 10
enemy = Enemy()
all_sprites.add(enemy)
enemies.add(enemy)
# 检测玩家与敌机的碰撞
hits = pygame.sprite.spritecollide(player, enemies, False)
if hits:
running = False
# 渲染
screen.fill(BLACK)
all_sprites.draw(screen)
# 显示分数
font = pygame.font.SysFont('arial', 24)
score_text = font.render(f'Score: {score}', True, WHITE)
screen.blit(score_text, (10, 10))
# 刷新屏幕
pygame.display.flip()
pygame.quit()
sys.exit()
🛩️ 飞机大战游戏代码解析
以下是您提供的飞机大战游戏代码的详细解析,我将按模块进行说明:
1️⃣ 初始化模块
python
import pygame
import random
import sys
初始化pygame
pygame.init()
游戏窗口设置
SCREEN_WIDTH = 480
SCREEN_HEIGHT = 600
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
pygame.display.set_caption("飞机大战")
颜色定义
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
功能:初始化游戏引擎、设置窗口参数
关键点:
pygame.init():启动所有pygame模块
set_mode():创建游戏窗口(480x600像素)
使用常量定义屏幕尺寸和颜色
2️⃣ 游戏对象类定义
✈️ 玩家飞机类(Player)
python
class Player(pygame.sprite.Sprite):
def init (self):
super().init ()
self.image = pygame.Surface((50, 40)) # 飞机图形
self.image.fill(WHITE)
self.rect = self.image.get_rect() # 碰撞检测矩形
self.rect.centerx = SCREEN_WIDTH // 2 # 初始位置居中
self.speed = 8 # 移动速度
def update(self):
# 键盘控制移动(左右方向键)
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT] and self.rect.left > 0:
self.rect.x -= self.speed
if keys[pygame.K_RIGHT] and self.rect.right < SCREEN_WIDTH:
self.rect.x += self.speed
def shoot(self):
# 创建子弹对象(按空格键发射)
bullet = Bullet(self.rect.centerx, self.rect.top)
all_sprites.add(bullet)
bullets.add(bullet)
🎯 敌机类(Enemy)
python
class Enemy(pygame.sprite.Sprite):
def init (self):
super().init ()
self.image = pygame.Surface((30, 30))
self.image.fill((255, 0, 0)) # 红色敌机
self.rect = self.image.get_rect()
随机初始位置(屏幕上方)
self.rect.x = random.randrange(SCREEN_WIDTH - self.rect.width)
self.rect.y = random.randrange(-100, -40)
self.speedy = random.randrange(1, 5) # 随机下落速度
def update(self):
self.rect.y += self.speedy
# 飞出屏幕后重置到顶部
if self.rect.top > SCREEN_HEIGHT:
self.rect.x = random.randrange(SCREEN_WIDTH - self.rect.width)
self.rect.y = random.randrange(-100, -40)
self.speedy = random.randrange(1, 5)
💥 子弹类(Bullet)
python
class Bullet(pygame.sprite.Sprite):
def init (self, x, y):
super().init ()
self.image = pygame.Surface((5, 10))
self.image.fill((0, 255, 0)) # 绿色子弹
self.rect = self.image.get_rect()
self.rect.centerx = x # 从玩家飞机中心发射
self.speedy = -10 # 向上飞行
def update(self):
self.rect.y += self.speedy
# 飞出屏幕后自动删除
if self.rect.bottom < 0:
self.kill()
3️⃣ 游戏主循环
python
创建精灵组
all_sprites = pygame.sprite.Group()
enemies = pygame.sprite.Group()
bullets = pygame.sprite.Group()
初始化游戏对象
player = Player()
all_sprites.add(player)
for i in range(8): # 创建8个敌机
enemy = Enemy()
all_sprites.add(enemy)
enemies.add(enemy)
游戏状态
score = 0
clock = pygame.time.Clock()
FPS = 60 # 帧率控制
主游戏循环
running = True
while running:
1. 控制帧率
clock.tick(FPS)
# 2. 事件处理
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()
# 3. 更新游戏状态
all_sprites.update()
# 4. 碰撞检测
# 子弹击中敌机
hits = pygame.sprite.groupcollide(enemies, bullets, True, True)
for hit in hits:
score += 10 # 得分增加
# 生成新敌机
enemy = Enemy()
all_sprites.add(enemy)
enemies.add(enemy)
# 玩家与敌机相撞
if pygame.sprite.spritecollide(player, enemies, False):
running = False # 游戏结束
# 5. 渲染
screen.fill(BLACK) # 清屏
all_sprites.draw(screen) # 绘制所有精灵
# 显示分数
font = pygame.font.SysFont('arial', 24)
score_text = font.render(f'Score: {score}', True, WHITE)
screen.blit(score_text, (10, 10))
# 6. 刷新显示
pygame.display.flip()
4️⃣ 游戏退出处理
python
pygame.quit()
sys.exit()
🛠️ 代码优化建议
资源加载:将几何图形替换为真实图片
python
self.image = pygame.image.load('player.png').convert_alpha()
音效增强:添加射击和爆炸音效
python
shoot_sound = pygame.mixer.Sound('shoot.wav')
shoot_sound.play()
生命系统:增加玩家生命值而非立即结束
python
self.lives = 3
难度曲线:随分数增加敌机速度和数量
需要我详细展开某个优化方向吗? 😊