打印
[创客活动与软文]

Labubu收集冒险游戏

[复制链接]
30|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hbzjt2011|  楼主 | 2025-6-20 19:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#申请原创#  @21小跑堂 游戏特色:
  • 可爱的Labubu角色:玩家控制一个粉色的Labubu,有耳朵、眼睛和微笑
  • 收集系统:收集不同颜色的小Labubu,它们会发光并有弹跳效果
  • 动态障碍物:红色刺球会在屏幕上移动并反弹
  • 关卡进阶:每收集完所有Labubu就进入下一关,难度递增
  • 精美视觉:渐变背景、动画效果和粒子特效
游戏**:
  • 使用方向键控制Labubu移动
  • 收集所有发光的小Labubu来获得分数
  • 避开移动的红色刺球障碍物
  • 收集完所有Labubu后自动进入下一关
  • 游戏结束后按R键重新开始
运行要求:
需要安装pygame库
pip install pygame
import pygame
import random
import math
import sys

# 初始化pygame
pygame.init()

# 游戏常量
SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600
FPS = 60

# 颜色定义
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
PINK = (255, 182, 193)
BLUE = (135, 206, 235)
GREEN = (144, 238, 144)
RED = (255, 99, 71)
PURPLE = (221, 160, 221)
YELLOW = (255, 255, 0)
ORANGE = (255, 165, 0)

class Player:
    def __init__(self, x, y):
        self.x = x
        self.y = y
        self.width = 40
        self.height = 40
        self.speed = 5
        self.color = PINK
        
    def move(self, keys):
        if keys[pygame.K_LEFT] and self.x > 0:
            self.x -= self.speed
        if keys[pygame.K_RIGHT] and self.x < SCREEN_WIDTH - self.width:
            self.x += self.speed
        if keys[pygame.K_UP] and self.y > 0:
            self.y -= self.speed
        if keys[pygame.K_DOWN] and self.y < SCREEN_HEIGHT - self.height:
            self.y += self.speed
            
    def draw(self, screen):
        # 绘制可爱的Labubu玩家角色
        # 主体
        pygame.draw.ellipse(screen, self.color, (self.x, self.y, self.width, self.height))
        # 耳朵
        pygame.draw.ellipse(screen, self.color, (self.x - 5, self.y - 10, 15, 20))
        pygame.draw.ellipse(screen, self.color, (self.x + 30, self.y - 10, 15, 20))
        # 眼睛
        pygame.draw.circle(screen, BLACK, (self.x + 12, self.y + 15), 3)
        pygame.draw.circle(screen, BLACK, (self.x + 28, self.y + 15), 3)
        # 嘴巴
        pygame.draw.arc(screen, BLACK, (self.x + 15, self.y + 20, 10, 8), 0, math.pi, 2)
        
    def get_rect(self):
        return pygame.Rect(self.x, self.y, self.width, self.height)

class Labubu:
    def __init__(self):
        self.x = random.randint(0, SCREEN_WIDTH - 30)
        self.y = random.randint(0, SCREEN_HEIGHT - 30)
        self.width = 30
        self.height = 30
        self.colors = [PURPLE, BLUE, GREEN, YELLOW, ORANGE]
        self.color = random.choice(self.colors)
        self.bounce_offset = 0
        self.bounce_speed = 0.1
        
    def update(self):
        # 让Labubu有弹跳效果
        self.bounce_offset += self.bounce_speed
        
    def draw(self, screen):
        bounce_y = self.y + math.sin(self.bounce_offset) * 3
        # 绘制可收集的小Labubu
        pygame.draw.ellipse(screen, self.color, (self.x, bounce_y, self.width, self.height))
        # 小耳朵
        pygame.draw.ellipse(screen, self.color, (self.x - 3, bounce_y - 8, 10, 15))
        pygame.draw.ellipse(screen, self.color, (self.x + 23, bounce_y - 8, 10, 15))
        # 眼睛
        pygame.draw.circle(screen, BLACK, (int(self.x + 8), int(bounce_y + 12)), 2)
        pygame.draw.circle(screen, BLACK, (int(self.x + 22), int(bounce_y + 12)), 2)
        # 闪闪发光效果
        for i in range(3):
            star_x = self.x + random.randint(-10, 40)
            star_y = bounce_y + random.randint(-10, 40)
            if 0 <= star_x <= SCREEN_WIDTH and 0 <= star_y <= SCREEN_HEIGHT:
                pygame.draw.circle(screen, YELLOW, (int(star_x), int(star_y)), 1)
        
    def get_rect(self):
        return pygame.Rect(self.x, self.y, self.width, self.height)

class Obstacle:
    def __init__(self):
        self.x = random.randint(0, SCREEN_WIDTH - 50)
        self.y = random.randint(0, SCREEN_HEIGHT - 50)
        self.width = 50
        self.height = 50
        self.speed_x = random.choice([-2, -1, 1, 2])
        self.speed_y = random.choice([-2, -1, 1, 2])
        
    def update(self):
        self.x += self.speed_x
        self.y += self.speed_y
        
        # 边界反弹
        if self.x <= 0 or self.x >= SCREEN_WIDTH - self.width:
            self.speed_x = -self.speed_x
        if self.y <= 0 or self.y >= SCREEN_HEIGHT - self.height:
            self.speed_y = -self.speed_y
            
    def draw(self, screen):
        # 绘制移动的障碍物(看起来像危险的刺球)
        pygame.draw.circle(screen, RED, (self.x + 25, self.y + 25), 25)
        # 绘制刺
        for angle in range(0, 360, 45):
            rad = math.radians(angle)
            start_x = self.x + 25 + math.cos(rad) * 20
            start_y = self.y + 25 + math.sin(rad) * 20
            end_x = self.x + 25 + math.cos(rad) * 30
            end_y = self.y + 25 + math.sin(rad) * 30
            pygame.draw.line(screen, BLACK, (start_x, start_y), (end_x, end_y), 3)
            
    def get_rect(self):
        return pygame.Rect(self.x, self.y, self.width, self.height)

class Game:
    def __init__(self):
        self.screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
        pygame.display.set_caption("Labubu收集冒险 - 用方向键移动!")
        self.clock = pygame.time.Clock()
        self.font = pygame.font.Font(None, 36)
        
        self.player = Player(SCREEN_WIDTH // 2, SCREEN_HEIGHT // 2)
        self.labubus = []
        self.obstacles = []
        self.score = 0
        self.game_over = False
        self.level = 1
        
        # 生成初始Labubu和障碍物
        self.spawn_labubus(5)
        self.spawn_obstacles(3)
        
    def spawn_labubus(self, count):
        for _ in range(count):
            labubu = Labubu()
            # 确保不与玩家重叠
            while labubu.get_rect().colliderect(self.player.get_rect()):
                labubu = Labubu()
            self.labubus.append(labubu)
            
    def spawn_obstacles(self, count):
        for _ in range(count):
            obstacle = Obstacle()
            # 确保不与玩家重叠
            while obstacle.get_rect().colliderect(self.player.get_rect()):
                obstacle = Obstacle()
            self.obstacles.append(obstacle)
   
    def handle_events(self):
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                return False
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_r and self.game_over:
                    self.restart_game()
        return True
   
    def restart_game(self):
        self.player = Player(SCREEN_WIDTH // 2, SCREEN_HEIGHT // 2)
        self.labubus = []
        self.obstacles = []
        self.score = 0
        self.game_over = False
        self.level = 1
        self.spawn_labubus(5)
        self.spawn_obstacles(3)
   
    def update(self):
        if self.game_over:
            return
            
        keys = pygame.key.get_pressed()
        self.player.move(keys)
        
        # 更新Labubu
        for labubu in self.labubus:
            labubu.update()
            
        # 更新障碍物
        for obstacle in self.obstacles:
            obstacle.update()
            
        # 检查收集Labubu
        for labubu in self.labubus[:]:
            if self.player.get_rect().colliderect(labubu.get_rect()):
                self.labubus.remove(labubu)
                self.score += 10
               
        # 检查与障碍物碰撞
        for obstacle in self.obstacles:
            if self.player.get_rect().colliderect(obstacle.get_rect()):
                self.game_over = True
               
        # 所有Labubu被收集完毕,进入下一关
        if not self.labubus:
            self.level += 1
            labubu_count = min(5 + self.level, 10)
            obstacle_count = min(3 + self.level // 2, 8)
            self.spawn_labubus(labubu_count)
            self.spawn_obstacles(obstacle_count)
   
    def draw(self):
        # 绘制渐变背景
        for y in range(SCREEN_HEIGHT):
            color_ratio = y / SCREEN_HEIGHT
            r = int(135 + (255 - 135) * color_ratio)
            g = int(206 + (182 - 206) * color_ratio)
            b = int(235 + (193 - 235) * color_ratio)
            pygame.draw.line(self.screen, (r, g, b), (0, y), (SCREEN_WIDTH, y))
        
        # 绘制游戏对象
        for labubu in self.labubus:
            labubu.draw(self.screen)
            
        for obstacle in self.obstacles:
            obstacle.draw(self.screen)
            
        self.player.draw(self.screen)
        
        # 绘制UI
        score_text = self.font.render(f"分数: {self.score}", True, BLACK)
        level_text = self.font.render(f"关卡: {self.level}", True, BLACK)
        labubu_count_text = self.font.render(f"剩余Labubu: {len(self.labubus)}", True, BLACK)
        
        self.screen.blit(score_text, (10, 10))
        self.screen.blit(level_text, (10, 50))
        self.screen.blit(labubu_count_text, (10, 90))
        
        if self.game_over:
            game_over_text = self.font.render("游戏结束!按R重新开始", True, RED)
            text_rect = game_over_text.get_rect(center=(SCREEN_WIDTH//2, SCREEN_HEIGHT//2))
            pygame.draw.rect(self.screen, WHITE, text_rect.inflate(20, 20))
            pygame.draw.rect(self.screen, BLACK, text_rect.inflate(20, 20), 2)
            self.screen.blit(game_over_text, text_rect)
        
        # 绘制说明
        if not self.game_over and self.score == 0:
            instruction = self.font.render("用方向键移动,收集所有Labubu,避开红色刺球!", True, BLACK)
            self.screen.blit(instruction, (SCREEN_WIDTH//2 - 200, SCREEN_HEIGHT - 40))
   
    def run(self):
        running = True
        while running:
            running = self.handle_events()
            self.update()
            self.draw()
            pygame.display.flip()
            self.clock.tick(FPS)
        
        pygame.quit()
        sys.exit()

if __name__ == "__main__":
    game = Game()
    game.run()


使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:欢迎参与LabVIEW版块的讨论学习! 点我一键即达

171

主题

2577

帖子

41

粉丝