Python 飞机大战开发实战:从单机版到支持本地双人对战的改造
·
Python 飞机大战双人对战改造指南
核心改造思路
- 玩家对象分离:创建两个独立的玩家对象
- 输入系统重构:区分两套控制指令
- 碰撞检测扩展:增加玩家间碰撞逻辑
- 游戏状态管理:双人生命值计分系统
具体实现步骤
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
关键优化建议
-
平衡性调整:
- 设置不同飞机特性(速度/火力差异)
- 添加技能冷却时间
-
游戏体验增强:
# 添加碰撞特效 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)) -
边界保护:
# 防止飞出屏幕 player1.rect.x = max(0, min(screen_width-50, player1.rect.x)) player1.rect.y = max(0, min(screen_height-40, player1.rect.y))
改造后游戏支持功能:
- 双独立控制体系
- 实时生命值显示
- 玩家间物理碰撞
- 子弹归属判定
- 胜负判定系统
提示:实际开发中需注意游戏平衡性调整,可通过配置文件调整参数(如子弹伤害、移动速度等),确保对战公平性。
更多推荐
所有评论(0)