用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

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

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

相关推荐
52Hz1188 分钟前
力扣230.二叉搜索树中第k小的元素、199.二叉树的右视图、114.二叉树展开为链表
python·算法·leetcode
喵手9 分钟前
Python爬虫实战:网页截图归档完全指南 - 构建生产级页面存证与历史回溯系统!
爬虫·python·爬虫实战·零基础python爬虫教学·网页截图归档·历史回溯·生产级方案
张3蜂26 分钟前
Python 四大 Web 框架对比解析:FastAPI、Django、Flask 与 Tornado
前端·python·fastapi
2601_9483745735 分钟前
商用电子秤怎么选
大数据·python
Volunteer Technology41 分钟前
Sentinel的限流算法
java·python·算法
七夜zippoe1 小时前
Python统计分析实战:从描述统计到假设检验的完整指南
开发语言·python·统计分析·置信区间·概率分布
2601_949146531 小时前
Python语音通知API示例代码汇总:基于Requests库的语音接口调用实战
开发语言·python
去码头整点薯条981 小时前
python第五次作业
linux·前端·python
有代理ip1 小时前
Python 与 Golang 爬虫的隐藏优势
爬虫·python·golang
数研小生1 小时前
1688商品列表API:高效触达批发电商海量商品数据的技术方案
大数据·python·算法·信息可视化·json