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

射击敌人--许歆杨

[复制链接]

1

主题

1

帖子

1520

积分

金牌会员

Rank: 6Rank: 6

积分
1520
发表于 2025-1-25 11:43:17 | 显示全部楼层 |阅读模式
[Python] 纯文本查看 复制代码
import pygame
import random
import math

# 游戏窗口设置
WIDTH, HEIGHT = 800, 600
BACKGROUND_COLOR = (30, 30, 30)
PLAYER_COLOR = (0, 255, 0)
ENEMY_COLOR = (255, 0, 0)
BULLET_COLOR = (255, 255, 0)

# 初始化 Pygame
pygame.init()
window = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("射击游戏")

# 玩家类


class Player:
    def __init__(self):
        self.rect = pygame.Rect(WIDTH // 2, HEIGHT // 2, 50, 50)
        self.speed = 5
        self.health = 3

    def move(self, dx, dy):
        self.rect.x += dx * self.speed
        self.rect.y += dy * self.speed
        # 边界检查
        self.rect.x = max(0, min(WIDTH - self.rect.width, self.rect.x))
        self.rect.y = max(0, min(HEIGHT - self.rect.height, self.rect.y))

    def draw(self, surface):
        pygame.draw.rect(surface, PLAYER_COLOR, self.rect)
        self.draw_health_bar(surface)

    def draw_health_bar(self, surface):
        health_bar_width = 50
        health_bar_height = 10
        health_ratio = self.health / 3
        pygame.draw.rect(surface, (255, 0, 0), (self.rect.x,
                         self.rect.y - 15, health_bar_width, health_bar_height))
        pygame.draw.rect(surface, (0, 255, 0), (self.rect.x, self.rect.y -
                         15, health_bar_width * health_ratio, health_bar_height))

# 敌人类


class Enemy:
    def __init__(self):
        self.rect = pygame.Rect(random.randint(
            0, WIDTH - 50), random.randint(0, HEIGHT - 50), 50, 50)
        self.last_shoot_time = pygame.time.get_ticks()
        self.shoot_interval = 1000  # 每秒发射一次

    def draw(self, surface):
        pygame.draw.rect(surface, ENEMY_COLOR, self.rect)

    def shoot(self, player):
        current_time = pygame.time.get_ticks()
        if current_time - self.last_shoot_time > self.shoot_interval:
            self.last_shoot_time = current_time

            # 计算发射方向
            dir_x = player.rect.centerx - self.rect.centerx
            dir_y = player.rect.centery - self.rect.centery
            length = (dir_x ** 2 + dir_y ** 2) ** 0.5

            # 标准化方向
            if length > 0:
                dir_x /= length
                dir_y /= length

            # 向玩家方向发射
            return Bullet(self.rect.centerx, self.rect.centery, dir_x, dir_y)
        return None

# 子弹类


class Bullet:
    def __init__(self, x, y, dir_x, dir_y):
        self.rect = pygame.Rect(x, y, 5, 5)
        self.speed = 20
        self.dir_x = dir_x
        self.dir_y = dir_y

    def update(self):
        self.rect.x += self.dir_x * self.speed
        self.rect.y += self.dir_y * self.speed

    def draw(self, surface):
        pygame.draw.rect(surface, BULLET_COLOR, self.rect)

# 游戏控制器


class GameController:
    def __init__(self):
        self.player = Player()
        self.enemies = []
        self.bullets = []
        self.enemy_bullets = []  # 存储敌人的子弹
        self.running = True
        self.game_over = False
        self.score = 0
        self.enemy_spawn_time = 5000  # 增加到 5000 毫秒,使敌人出现得更慢
        self.last_enemy_spawn_time = pygame.time.get_ticks()
        self.score_font = pygame.font.SysFont(None, 36)

    def handle_event(self, event):
        if event.type == pygame.QUIT:
            self.running = False
        if self.game_over:  # 游戏结束时处理输入
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_r:  # 按 R 重启
                    self.reset_game()
                elif event.key == pygame.K_q:  # 按 Q 退出
                    self.running = False

    def update(self):
        keys = pygame.key.get_pressed()  # 获取按键状态
        if keys[pygame.K_LEFT]:
            self.player.move(-1, 0)
        if keys[pygame.K_RIGHT]:
            self.player.move(1, 0)
        if keys[pygame.K_UP]:
            self.player.move(0, -1)
        if keys[pygame.K_DOWN]:
            self.player.move(0, 1)

        # 检测鼠标点击
        mouse_buttons = pygame.mouse.get_pressed()
        if mouse_buttons[0]:  # 左键点击
            self.shoot()

        # 更新玩家的子弹
        for bullet in self.bullets[:]:
            bullet.update()
            if bullet.rect.x < 0 or bullet.rect.x > WIDTH or bullet.rect.y < 0 or bullet.rect.y > HEIGHT:
                self.bullets.remove(bullet)

        # 更新敌人子弹
        for enemy_bullet in self.enemy_bullets[:]:
            enemy_bullet.update()
            if enemy_bullet.rect.y > HEIGHT:  # 超出屏幕则移除
                self.enemy_bullets.remove(enemy_bullet)

        # 检查玩家子弹与敌人的碰撞
        for bullet in self.bullets[:]:
            for enemy in self.enemies[:]:
                if bullet.rect.colliderect(enemy.rect):
                    self.bullets.remove(bullet)
                    self.enemies.remove(enemy)
                    self.score += 1
                    break

        # 检查玩家与敌人的碰撞
        self.check_player_collision()

        # 生成敌人
        current_time = pygame.time.get_ticks()
        if current_time - self.last_enemy_spawn_time > self.enemy_spawn_time:
            self.enemies.append(Enemy())
            self.last_enemy_spawn_time = current_time

        # 敌人发射子弹
        for enemy in self.enemies:
            bullet = enemy.shoot(self.player)  # 传递玩家对象
            if bullet:
                self.enemy_bullets.append(bullet)

    def check_player_collision(self):
        for enemy in self.enemies[:]:
            if enemy.rect.colliderect(self.player.rect):
                self.player.health -= 1
                self.enemies.remove(enemy)
                if self.player.health <= 0:
                    self.game_over = True

        # 检查敌人子弹与玩家的碰撞
        for enemy_bullet in self.enemy_bullets[:]:
            if enemy_bullet.rect.colliderect(self.player.rect):
                self.player.health -= 1
                self.enemy_bullets.remove(enemy_bullet)
                if self.player.health <= 0:
                    self.game_over = True

    def shoot(self):
        # 获取鼠标的位置
        mouse_x, mouse_y = pygame.mouse.get_pos()

        # 计算方向
        dir_x = mouse_x - (self.player.rect.x + self.player.rect.width // 2)
        dir_y = mouse_y - (self.player.rect.y + self.player.rect.height // 2)
        length = (dir_x ** 2 + dir_y ** 2) ** 0.5
        if length > 0:
            dir_x /= length
            dir_y /= length

            # 创建子弹
            self.bullets.append(Bullet(self.player.rect.x + self.player.rect.width // 2,
                                       self.player.rect.y + self.player.rect.height // 2,
                                       dir_x, dir_y))

    def draw(self):
        window.fill(BACKGROUND_COLOR)

        if self.game_over:
            self.draw_game_over()
        else:
            self.player.draw(window)
            for bullet in self.bullets:
                bullet.draw(window)
            for enemy in self.enemies:
                enemy.draw(window)
            for enemy_bullet in self.enemy_bullets:
                enemy_bullet.draw(window)

            # 绘制分数
            score_text = self.score_font.render(
                f'Score: {self.score}', True, (255, 255, 255))
            window.blit(score_text, (10, 10))

        pygame.display.flip()

    def draw_game_over(self):
        game_over_text = self.score_font.render("Game Over", True, (255, 0, 0))
        score_text = self.score_font.render(
            f'Final Score: {self.score}', True, (255, 255, 255))
        restart_text = self.score_font.render(
            "Press R to Restart or Q to Quit", True, (255, 255, 255))

        window.blit(game_over_text, (WIDTH // 2 - 50, HEIGHT // 2 - 50))
        window.blit(score_text, (WIDTH // 2 - 80, HEIGHT // 2))
        window.blit(restart_text, (WIDTH // 2 - 200, HEIGHT // 2 + 50))

    def reset_game(self):
        self.player = Player()
        self.enemies = []
        self.bullets = []
        self.enemy_bullets = []
        self.running = True
        self.game_over = False
        self.score = 0
        self.enemy_spawn_time = 5000  # 重置生成速度
        self.last_enemy_spawn_time = pygame.time.get_ticks()

    def start_game(self):
        clock = pygame.time.Clock()  # 创建时钟对象
        while self.running:
            for event in pygame.event.get():
                self.handle_event(event)

            if not self.game_over:
                self.update()

            self.draw()

            clock.tick(60)  # 限制帧率为 60 FPS

        pygame.quit()


def main():
    controller = GameController()
    controller.start_game()


if __name__ == "__main__":
    main()

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-2-11 03:06 , Processed in 0.038752 second(s), 28 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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