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

小车空格打子弹,左右建躲避,10血

[复制链接]

19

主题

92

帖子

874

积分

高级会员

Rank: 4

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

# 初始化pygame
pygame.init()

# 设置窗口
width, height = 800, 600
screen = pygame.display.set_mode((width, height))
pygame.display.set_caption("小车向前冲")

# 定义颜色
WHITE = (255, 255, 255)
RED = (255, 0, 0)
BLACK = (0, 0, 0)
BLUE = (0, 0, 255)
GREEN = (0, 255, 0)

# 小车类
class Car:
    def __init__(self):
        self.width = 50
        self.height = 100
        self.rect = pygame.Rect(width // 2 - self.width // 2, height - self.height - 10, self.width, self.height)

    def move(self, dx):
        self.rect.x += dx
        # 边界检查
        if self.rect.left < 0:
            self.rect.left = 0
        elif self.rect.right > width:
            self.rect.right = width

    def draw(self, surface):
        pygame.draw.rect(surface, RED, self.rect)  # 绘制小车

# 障碍物基类
class Obstacle:
    def __init__(self, durability):
        self.durability = durability

    def hit(self):
        self.durability -= 1

    def is_destroyed(self):
        return self.durability <= 0

# 方形障碍物类
class SquareObstacle(Obstacle):
    def __init__(self):
        super().__init__(1)  # 方形打1下死
        self.size = 50
        self.rect = pygame.Rect(random.randint(0, width - self.size), -self.size, self.size, self.size)

    def move(self):
        self.rect.y += 5

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

# 三角形障碍物类
class TriangleObstacle(Obstacle):
    def __init__(self):
        super().__init__(5)  # 三角形打5下死
        self.size = 50
        self.rect = pygame.Rect(random.randint(0, width - self.size), -self.size, self.size, self.size)

    def move(self):
        self.rect.y += 5

    def draw(self, surface):
        points = [(self.rect.x, self.rect.y + self.size), 
                  (self.rect.x + self.size // 2, self.rect.y),
                  (self.rect.x + self.size, self.rect.y + self.size)]
        pygame.draw.polygon(surface, BLACK, points)

# 圆形障碍物类
class CircleObstacle(Obstacle):
    def __init__(self):
        super().__init__(10)  # 圆形打10下死
        self.radius = 25
        self.rect = pygame.Rect(random.randint(0, width - self.radius * 2), -self.radius * 2, self.radius * 2, self.radius * 2)

    def move(self):
        self.rect.y += 5

    def draw(self, surface):
        pygame.draw.circle(surface, BLACK, (self.rect.centerx, self.rect.centery), self.radius)

# 子弹类
class Bullet:
    def __init__(self, x, y):
        self.width = 5
        self.height = 10
        self.rect = pygame.Rect(x, y, self.width, self.height)

    def move(self):
        self.rect.y -= 10  # 子弹的移动速度

    def draw(self, surface):
        pygame.draw.rect(surface, BLUE, self.rect)  # 绘制子弹

# 游戏主循环
def main():
    clock = pygame.time.Clock()
    car = Car()
    obstacles = []
    bullets = []
    score = 0
    lives = 10  # 玩家初始生命值
    running = True
    
    while running:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False
        
        keys = pygame.key.get_pressed()
        if keys[pygame.K_LEFT]:
            car.move(-5)
        if keys[pygame.K_RIGHT]:
            car.move(5)

        # 发射子弹
        if keys[pygame.K_SPACE]:
            bullets.append(Bullet(car.rect.centerx, car.rect.top))

        # 随机生成障碍物
        if random.randint(1, 30) == 1:  # 控制生成频率
            obstacle_type = random.choice([SquareObstacle, TriangleObstacle, CircleObstacle])
            obstacles.append(obstacle_type())

        # 更新子弹和障碍物
        for bullet in bullets:
            bullet.move()
            if bullet.rect.bottom < 0:  # 移除超出屏幕的子弹
                bullets.remove(bullet)

        for obstacle in obstacles:
            obstacle.move()
            if obstacle.rect.top > height:  # 移除超出屏幕的障碍物
                obstacles.remove(obstacle)
                score += 1  # 得分加一

        # 碰撞检测
        for obstacle in obstacles:
            if car.rect.colliderect(obstacle.rect):
                lives -= 1  # 生命值减1
                obstacles.remove(obstacle)  # 碰撞后移除障碍物
                if lives <= 0:
                    running = False  # 生命值为0时游戏结束

        # 子弹与障碍物碰撞检测
        for bullet in bullets:
            for obstacle in obstacles:
                if bullet.rect.colliderect(obstacle.rect):
                    obstacle.hit()  # 击中障碍物
                    bullets.remove(bullet)  # 移除击中的子弹
                    if obstacle.is_destroyed():  # 如果障碍物被打掉
                        obstacles.remove(obstacle)  # 移除障碍物
                        score += 1  # 击中得分
                    break

        # 绘制
        screen.fill(WHITE)
        car.draw(screen)
        for obstacle in obstacles:
            obstacle.draw(screen)
        for bullet in bullets:
            bullet.draw(screen)
        
        # 显示得分和生命值
        font = pygame.font.Font(None, 36)
        score_text = font.render(f"得分: {score}", True, BLACK)
        lives_text = font.render(f"生命: {lives}", True, BLACK)
        screen.blit(score_text, (10, 10))
        screen.blit(lives_text, (10, 50))

        pygame.display.flip()
        clock.tick(60)

    pygame.quit()

if __name__ == "__main__":
    main()

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-3-12 12:35 , Processed in 0.037768 second(s), 29 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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