用AI写游戏4——Python实现飞机大战小游戏1

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

难度曲线:随分数增加敌机速度和数量

需要我详细展开某个优化方向吗? 😊

相关推荐
APP出海2 小时前
Google政策大更新:涉及金融(个人贷款),社交约会与游戏(未成年人相关),健康等所有类别App
android·游戏·金融·产品运营·产品经理
wanhengidc2 小时前
云手机的核心价值
运维·游戏·智能手机·云计算
GitCode官方3 小时前
创意无限·开源共赢|2025「卡赢杯」开源游戏开发大赛正式启动!
游戏·开源
爱打球的白师傅3 小时前
python机器学习工程化demo(包含训练模型,预测数据,模型列表,模型详情,删除模型)支持线性回归、逻辑回归、决策树、SVC、随机森林等模型
人工智能·python·深度学习·机器学习·flask·逻辑回归·线性回归
MediaTea3 小时前
Python 第三方库:TensorFlow(深度学习框架)
开发语言·人工智能·python·深度学习·tensorflow
wanhengidc3 小时前
云手机的网络架构
服务器·网络·游戏·智能手机·架构·云计算
Joker-Tong3 小时前
大模型数据洞察能力方法调研
人工智能·python·agent
B站计算机毕业设计之家4 小时前
基于Python+Django+双协同过滤豆瓣电影推荐系统 协同过滤推荐算法 爬虫 大数据毕业设计(源码+文档)✅
大数据·爬虫·python·机器学习·数据分析·django·推荐算法
逻极4 小时前
Webhook 全解析:事件驱动时代的实时集成核心技术
python·web