在这里插入图片描述

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
难度曲线:随分数增加敌机速度和数量
需要我详细展开某个优化方向吗? 😊

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐