基于pygame的雷电战机小游戏

import pygame
import sys
import random

# 初始化 Pygame
pygame.init()

# 设置窗口尺寸
WIDTH, HEIGHT = 800, 600
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("雷电战机")

# 设置颜色
BLACK = (0, 0, 0)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
YELLOW = (255, 255, 0)
WHITE = (255, 255, 255)

# 战机初始位置
plane_pos = [WIDTH // 2, HEIGHT - 100]  # 战机的中心位置

# 敌机列表
enemies = []
enemy_speed = 5  # 敌机移动速度

# 积分
score = 0

# 子弹类
class Bullet:
    def __init__(self, x, y, speed, damage):
        self.x = x
        self.y = y
        self.speed = speed
        self.damage = damage

    def move(self):
        self.y -= self.speed  # 子弹向上移动

    def draw(self):
        pygame.draw.rect(screen, YELLOW, (self.x - 2, self.y, 4, 10))  # 绘制子弹

# 创建敌机
def create_enemy():
    x = random.randint(0, WIDTH - 30)  # 随机生成敌机的 x 坐标
    enemies.append([x, 0])  # 敌机初始位置在屏幕顶部

# 创建子弹
def create_bullet():
    x = plane_pos[0]  # 子弹的 x 坐标与战机相同
    y = plane_pos[1] - 20  # 子弹的 y 坐标在战机上方
    # 随机选择子弹类型
    bullet_type = random.choice([
        {"speed": 10, "damage": 1},  # 普通子弹
        {"speed": 15, "damage": 2},  # 强力子弹
        {"speed": 5, "damage": 0.5}   # 弱力子弹
    ])
    return Bullet(x, y, bullet_type["speed"], bullet_type["damage"])

# 游戏主循环
bullets = []  # 子弹列表
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()

    # 获取按键状态
    keys = pygame.key.get_pressed()
    if keys[pygame.K_LEFT] and plane_pos[0] > 0:
        plane_pos[0] -= 5  # 向左移动
    if keys[pygame.K_RIGHT] and plane_pos[0] < WIDTH:
        plane_pos[0] += 5  # 向右移动
    if keys[pygame.K_UP] and plane_pos[1] > 0:
        plane_pos[1] -= 5  # 向上移动
    if keys[pygame.K_DOWN] and plane_pos[1] < HEIGHT:
        plane_pos[1] += 5  # 向下移动
    if keys[pygame.K_SPACE]:  # 按空格键发射子弹
        bullets.append(create_bullet())  # 添加新子弹到列表

    # 填充背景
    screen.fill(BLACK)

    # 绘制三角形作为战机
    point1 = (plane_pos[0], plane_pos[1] - 20)  # 顶点
    point2 = (plane_pos[0] - 15, plane_pos[1] + 10)  # 左下角
    point3 = (plane_pos[0] + 15, plane_pos[1] + 10)  # 右下角
    pygame.draw.polygon(screen, RED, [point1, point2, point3])  # 绘制战机

    # 创建敌机
    if random.randint(1, 30) == 1:  # 每30帧大约生成一个敌机
        create_enemy()

    # 更新并绘制敌机
    for enemy in enemies:
        enemy[1] += enemy_speed  # 敌机向下移动
        # 绘制敌机(使用三角形表示)
        enemy_points = [
            (enemy[0], enemy[1] - 20),  # 顶点
            (enemy[0] - 15, enemy[1] + 10),  # 左下角
            (enemy[0] + 15, enemy[1] + 10)   # 右下角
        ]
        pygame.draw.polygon(screen, GREEN, enemy_points)  # 绘制敌机

    # 更新并绘制子弹
    for bullet in bullets[:]:  # 使用切片以避免修改列表时出错
        bullet.move()  # 移动子弹
        bullet.draw()  # 绘制子弹

    # 检查子弹与敌机的碰撞
    bullets = [bullet for bullet in bullets if bullet.y > 0]  # 移除超出屏幕的子弹
    for bullet in bullets[:]:  # 使用切片以避免修改列表时出错
        for enemy in enemies[:]:  # 使用切片以避免修改列表时出错
            if (bullet.x > enemy[0] - 15 and bullet.x < enemy[0] + 15 and
                bullet.y < enemy[1] + 10 and bullet.y > enemy[1] - 20):
                bullets.remove(bullet)  # 移除子弹
                enemies.remove(enemy)  # 移除敌机
                score += 10 * bullet.damage  # 根据子弹的伤害增加积分
                break  # 退出内层循环

    # 移除超出屏幕的敌机
    enemies = [enemy for enemy in enemies if enemy[1] < HEIGHT]

    # 显示当前积分
    font = pygame.font.Font(None, 36)  # 创建字体对象
    score_surface = font.render(f"Score: {int(score)}", True, WHITE)  # 渲染积分文本
    screen.blit(score_surface, (10, 10))  # 在屏幕上绘制积分

    # 更新显示
    pygame.display.flip()

    # 控制帧率
    pygame.time.Clock().tick(60)

实现效果:
基于pygame的雷电战机小游戏_第1张图片

你可能感兴趣的:(pygame,python,雷电小游戏)