- 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()