找回密码
 中文实名注册
查看: 97|回复: 0

太空大战(王明杰)

[复制链接]

5

主题

5

帖子

405

积分

中级会员

Rank: 3Rank: 3

积分
405
发表于 2025-2-22 09:45:45 | 显示全部楼层 |阅读模式
[Python] 纯文本查看 复制代码
import pygame
import random

# 初始化 Pygame
pygame.init()

# 屏幕尺寸
screen_width = 800
screen_height = 600
screen = pygame.display.set_mode((screen_width, screen_height))
pygame.display.set_caption("太空射击游戏")

# 颜色
white = (255, 255, 255)
black = (0, 0, 0)
red = (255, 0, 0)
green = (0, 255, 0)

# 加载图片 (可选,可以先用矩形代替)
# player_img = pygame.image.load("player.png") # 替换成你的飞船图片
# enemy_img = pygame.image.load("enemy.png")   # 替换成你的敌机图片
# bullet_img = pygame.image.load("bullet.png") # 替换成你的子弹图片

# 飞船类


class Player(pygame.sprite.Sprite):
    def __init__(self, x, y):
        pygame.sprite.Sprite.__init__(self)
        self.width = 50
        self.height = 50
        self.image = pygame.Surface([self.width, self.height])  # 使用Surface代替图片
        self.image.fill(green)
        self.rect = self.image.get_rect()
        self.rect.x = x
        self.rect.y = y
        self.speed = 5
        self.health = 3  # 生命值

    def update(self):
        keys = pygame.key.get_pressed()
        if keys[pygame.K_LEFT]:
            self.rect.x -= self.speed
        if keys[pygame.K_RIGHT]:
            self.rect.x += self.speed
        # 边界检测
        if self.rect.x < 0:
            self.rect.x = 0
        if self.rect.x > screen_width - self.width:
            self.rect.x = screen_width - self.width

    def shoot(self):
        bullet = Bullet(self.rect.x + self.width // 2 - 5, self.rect.y)
        all_sprites.add(bullet)
        bullets.add(bullet)

# 敌机类


class Enemy(pygame.sprite.Sprite):
    def __init__(self, x, y):
        pygame.sprite.Sprite.__init__(self)
        self.width = 30
        self.height = 30
        self.image = pygame.Surface([self.width, self.height])  # 使用Surface代替图片
        self.image.fill(red)
        self.rect = self.image.get_rect()
        self.rect.x = x
        self.rect.y = y
        self.speed = random.randint(1, 3)  # 随机速度

    def update(self):
        self.rect.y += self.speed
        if self.rect.y > screen_height:
            self.rect.x = random.randint(0, screen_width - self.width)
            self.rect.y = -self.height  # 移动到屏幕顶部重新开始

# 子弹类


class Bullet(pygame.sprite.Sprite):
    def __init__(self, x, y):
        pygame.sprite.Sprite.__init__(self)
        self.width = 10
        self.height = 20
        self.image = pygame.Surface([self.width, self.height])  # 使用Surface代替图片
        self.image.fill(white)
        self.rect = self.image.get_rect()
        self.rect.x = x
        self.rect.y = y
        self.speed = -10

    def update(self):
        self.rect.y += self.speed
        if self.rect.bottom < 0:
            self.kill()  # 移除子弹


# 创建精灵组
all_sprites = pygame.sprite.Group()  # 包含所有精灵
enemies = pygame.sprite.Group()   # 包含所有敌机
bullets = pygame.sprite.Group()   # 包含所有子弹

# 创建玩家
player = Player(screen_width // 2 - 25, screen_height - 60)
all_sprites.add(player)

# 创建敌机 (初始生成 5 个)
for i in range(5):
    enemy = Enemy(random.randint(0, screen_width - 30),
                  random.randint(-150, -30))
    all_sprites.add(enemy)
    enemies.add(enemy)

# 得分
score = 0
font = pygame.font.Font(None, 36)

# 游戏状态
game_over = False

# 游戏主循环
running = True
clock = pygame.time.Clock()  # 用于控制帧率

while running:
    # 处理事件
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_SPACE:
                player.shoot()  # 发射子弹

    # 更新所有精灵
    all_sprites.update()

    # 碰撞检测
    # 子弹与敌机碰撞
    hits = pygame.sprite.groupcollide(
        enemies, bullets, True, True)  # True, True 表示碰撞后都消失
    for hit in hits:
        score += 10
        enemy = Enemy(random.randint(0, screen_width - 30),
                      random.randint(-150, -30))  # 生成新的敌机
        all_sprites.add(enemy)
        enemies.add(enemy)

    # 飞船与敌机碰撞
    hits = pygame.sprite.spritecollide(player, enemies, True)  # True 表示碰撞后敌机消失
    for hit in hits:
        player.health -= 1  # 减少生命值
        enemy = Enemy(random.randint(0, screen_width - 30),
                      random.randint(-150, -30))  # 生成新的敌机
        all_sprites.add(enemy)
        enemies.add(enemy)

        if player.health <= 0:
            game_over = True

    # 绘制
    screen.fill(black)  # 背景色

    # 绘制所有精灵
    all_sprites.draw(screen)

    # 绘制得分
    text = font.render("Score: " + str(score), True, white)
    screen.blit(text, (10, 10))

    # 绘制生命值
    health_text = font.render("Health: " + str(player.health), True, white)
    screen.blit(health_text, (10, 40))

    # 游戏结束画面
    if game_over:
        text = font.render("Game Over! Score: " + str(score), True, white)
        text_rect = text.get_rect(
            center=(screen_width // 2, screen_height // 2))
        screen.blit(text, text_rect)
        pygame.display.update()
        pygame.time.delay(3000)  # 暂停3秒
        running = False

    # 更新屏幕
    pygame.display.update()

    # 控制帧率
    clock.tick(60)  # 60帧/秒

# 退出 Pygame
pygame.quit()
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 中文实名注册

本版积分规则

小黑屋|东台市机器人学会 ( 苏ICP备2021035350号-1;苏ICP备2021035350号-2;苏ICP备2021035350号-3 )

GMT+8, 2025-3-15 01:35 , Processed in 0.038179 second(s), 28 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表