平平爱恰糖糖
平平爱恰糖糖
发布于 2025-06-15 / 459 阅读
21
0

用Python和Pygame打造经典飞机大战游戏

从零开始学习游戏开从零开始学习游戏开发基础发基础

在游戏开发领域,2D射击游戏一直是入门学习的最佳选择之一。今天,我们将使用Python的Pygame库来创建一个经典的飞机大战游戏,让你体验从零开始构建游戏的乐趣。

学习目标: 通过本项目,你将掌握Pygame的基本用法,包括精灵管理、碰撞检测和游戏循环等核心概念。

游戏概述

这款飞机大战游戏具有以下核心元素:

  • 玩家控制的飞机(绿色矩形)

  • 敌方飞机(红色矩形)从屏幕顶部随机出现

  • 玩家可以发射子弹(蓝色矩形)击落敌机

  • 分数系统记录击落敌机数量

  • 生命值系统防止游戏过早结束

开发环境搭建

首先确保已安装Python和Pygame库:

pip install pygame

提示: 建议使用Python 3.6或更高版本,并创建一个虚拟环境来管理项目依赖。

游戏代码解析

1. 初始化与屏幕设置

import pygame
import random
import sys

# 初始化pygame
pygame.init()

# 屏幕设置
WIDTH, HEIGHT = 480, 600
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("飞机大战 - by 平平科技工作室")

我们设置了480x600像素的游戏窗口,并给游戏命名为"飞机大战"。

2. 颜色定义

WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)

定义了游戏中将用到的几种基本颜色,分别用于玩家飞机、敌机、子弹和文字显示。

3. 游戏角色类

玩家飞机类

class Player(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image = pygame.Surface((50, 40))
        self.image.fill(GREEN)
        self.rect = self.image.get_rect()
        self.rect.centerx = WIDTH // 2
        self.rect.bottom = HEIGHT - 10
        self.speed = 8
        self.health = 100
        
    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 < WIDTH:
            self.rect.x += self.speed
        if keys[pygame.K_UP] and self.rect.top > 0:
            self.rect.y -= self.speed
        if keys[pygame.K_DOWN] and self.rect.bottom < HEIGHT:
            self.rect.y += self.speed
            
    def shoot(self):
        bullet = Bullet(self.rect.centerx, self.rect.top)
        all_sprites.add(bullet)
        bullets.add(bullet)

玩家飞机类继承自Pygame的Sprite类,具有以下特性:

  • 尺寸为50x40像素的绿色矩形

  • 初始位置在屏幕底部中央

  • 使用方向键控制移动

  • 按空格键发射子弹

  • 100点初始生命值

敌机类

class Enemy(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image = pygame.Surface((30, 30))
        self.image.fill(RED)
        self.rect = self.image.get_rect()
        self.rect.x = random.randrange(WIDTH - self.rect.width)
        self.rect.y = random.randrange(-100, -40)
        self.speedy = random.randrange(1, 5)
        self.speedx = random.randrange(-2, 2)
        
    def update(self):
        self.rect.y += self.speedy
        self.rect.x += self.speedx
        if self.rect.top > HEIGHT + 10 or self.rect.left < -25 or self.rect.right > WIDTH + 25:
            self.rect.x = random.randrange(WIDTH - self.rect.width)
            self.rect.y = random.randrange(-100, -40)
            self.speedy = random.randrange(1, 5)

敌机类特点:

  • 30x30像素的红色矩形

  • 从屏幕顶部随机位置出现

  • 随机下落速度和轻微的水平移动

  • 飞出屏幕后重新生成

子弹类

class Bullet(pygame.sprite.Sprite):
    def __init__(self, x, y):
        super().__init__()
        self.image = pygame.Surface((5, 10))
        self.image.fill(BLUE)
        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()

子弹类特性:

  • 5x10像素的蓝色矩形

  • 从玩家飞机位置向上发射

  • 飞出屏幕后自动消失

4. 游戏主循环

# 创建精灵组
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)

# 游戏状态
clock = pygame.time.Clock()
score = 0
running = True

while running:
    # 控制帧率
    clock.tick(60)
    
    # 事件处理
    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, True)
    for hit in hits:
        player.health -= 20
        enemy = Enemy()
        all_sprites.add(enemy)
        enemies.add(enemy)
        if player.health <= 0:
            running = False
    
    # 渲染
    screen.fill(BLACK)
    all_sprites.draw(screen)
    
    # 显示游戏信息
    font = pygame.font.SysFont("simhei", 36)
    score_text = font.render(f"分数: {score}", True, WHITE)
    health_text = font.render(f"生命: {player.health}", True, WHITE)
    screen.blit(score_text, (10, 10))
    screen.blit(health_text, (10, 50))
    
    pygame.display.flip()

pygame.quit()
sys.exit()

游戏主循环处理以下内容:

  1. 事件处理(退出游戏和发射子弹)

  2. 更新所有游戏对象位置

  3. 碰撞检测(子弹与敌机、玩家与敌机)

  4. 分数计算和生命值管理

  5. 游戏画面渲染

游戏扩展建议

这个基础版本可以进一步扩展:

  • 图形改进:用精美的图片替代简单的矩形

  • 音效添加:射击、爆炸等音效

  • 多种武器:不同类型的子弹和攻击方式

  • 关卡系统:随着分数增加提高难度

  • 特殊道具:生命恢复、武器升级等

注意: 在添加新功能时,建议一次只实现一个功能并充分测试,避免引入太多复杂性导致难以调试。

总结

通过这个约100行的Python代码,我们实现了一个完整的飞机大战游戏。这个项目不仅展示了Pygame的基本用法,还涵盖了游戏开发的核心概念:游戏循环、精灵管理、碰撞检测和用户输入处理。无论是作为Python学习项目还是游戏开发入门,这都是一个极好的起点。

你可以基于这个框架继续扩展,添加更多功能,或者尝试修改游戏机制创造属于自己的独特版本。编程的乐趣就在于不断尝试和创新!

官方群聊:703681056


评论