Python 飞机大战双人对战改造指南

核心改造思路
  1. 玩家对象分离:创建两个独立的玩家对象
  2. 输入系统重构:区分两套控制指令
  3. 碰撞检测扩展:增加玩家间碰撞逻辑
  4. 游戏状态管理:双人生命值计分系统
具体实现步骤
1. 玩家飞机类改造
class Player(pygame.sprite.Sprite):
    def __init__(self, x, y, player_id):
        super().__init__()
        self.image = pygame.Surface((50, 40))
        self.image.fill((0, 255, 0) if player_id == 1 else (255, 0, 0))
        self.rect = self.image.get_rect(center=(x, y))
        self.speed = 6
        self.player_id = player_id  # 玩家标识(1或2)
        self.health = 100

2. 输入控制系统
def handle_events():
    keys = pygame.key.get_pressed()
    
    # 玩家1控制 (WASD + 空格射击)
    if keys[pygame.K_a]:
        player1.rect.x -= player1.speed
    if keys[pygame.K_d]:
        player1.rect.x += player1.speed
    if keys[pygame.K_w]:
        player1.rect.y -= player1.speed
    if keys[pygame.K_s]:
        player1.rect.y += player1.speed
    
    # 玩家2控制 (方向键 + 回车射击)
    if keys[pygame.K_LEFT]:
        player2.rect.x -= player2.speed
    if keys[pygame.K_RIGHT]:
        player2.rect.x += player2.speed
    if keys[pygame.K_UP]:
        player2.rect.y -= player2.speed
    if keys[pygame.K_DOWN]:
        player2.rect.y += player2.speed

3. 子弹系统改造
class Bullet(pygame.sprite.Sprite):
    def __init__(self, x, y, shooter_id):
        super().__init__()
        self.image = pygame.Surface((5, 10))
        self.image.fill((100, 200, 255) if shooter_id == 1 else (255, 200, 100))
        self.rect = self.image.get_rect(center=(x, y))
        self.speed = 9
        self.shooter_id = shooter_id  # 记录发射者

# 射击处理
if event.key == pygame.K_SPACE:
    bullets.add(Bullet(player1.rect.centerx, player1.rect.top, 1))
if event.key == pygame.K_RETURN:
    bullets.add(Bullet(player2.rect.centerx, player2.rect.top, 2))

4. 双人碰撞检测
# 玩家间碰撞
if pygame.sprite.collide_rect(player1, player2):
    player1.health -= 5
    player2.health -= 5
    # 添加碰撞反弹效果
    player1.rect.x += 10 if player1.rect.x < player2.rect.x else -10
    player2.rect.x += 10 if player2.rect.x < player1.rect.x else -10

# 子弹碰撞检测
for bullet in bullets:
    # 玩家1被击中
    if bullet.shooter_id == 2 and pygame.sprite.collide_rect(bullet, player1):
        player1.health -= 10
        bullet.kill()
    
    # 玩家2被击中
    if bullet.shooter_id == 1 and pygame.sprite.collide_rect(bullet, player2):
        player2.health -= 10
        bullet.kill()

5. 游戏状态管理
# 双人生命值显示
font = pygame.font.SysFont(None, 36)
player1_text = font.render(f"P1: {player1.health}", True, (0, 255, 0))
player2_text = font.render(f"P2: {player2.health}", True, (255, 0, 0))
screen.blit(player1_text, (20, 20))
screen.blit(player2_text, (screen_width-120, 20))

# 游戏结束判定
if player1.health <= 0 and player2.health <= 0:
    game_over("平局!")
elif player1.health <= 0:
    game_over("玩家2胜利!")
elif player2.health <= 0:
    game_over("玩家1胜利!")

完整架构示意
graph TD
    A[游戏初始化] --> B[创建玩家1对象]
    A --> C[创建玩家2对象]
    B --> D[玩家1控制系统]
    C --> E[玩家2控制系统]
    D --> F[子弹发射系统]
    E --> F
    F --> G[碰撞检测系统]
    G --> H[玩家间碰撞]
    G --> I[子弹碰撞]
    H --> J[生命值更新]
    I --> J
    J --> K[游戏状态判定]
    K --> L{游戏结束?}
    L --> |是| M[显示结果]
    L --> |否| D

关键优化建议
  1. 平衡性调整

    • 设置不同飞机特性(速度/火力差异)
    • 添加技能冷却时间
  2. 游戏体验增强

    # 添加碰撞特效
    def create_explosion(x, y):
        explosion = pygame.Surface((30, 30))
        pygame.draw.circle(explosion, (255, 165, 0), (15, 15), 15)
        screen.blit(explosion, (x-15, y-15))
    

  3. 边界保护

    # 防止飞出屏幕
    player1.rect.x = max(0, min(screen_width-50, player1.rect.x))
    player1.rect.y = max(0, min(screen_height-40, player1.rect.y))
    

改造后游戏支持功能:

  • 双独立控制体系
  • 实时生命值显示
  • 玩家间物理碰撞
  • 子弹归属判定
  • 胜负判定系统

提示:实际开发中需注意游戏平衡性调整,可通过配置文件调整参数(如子弹伤害、移动速度等),确保对战公平性。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐