以下是使用 PythonPygame 库实现的解压小游戏生成代码示例,包含三种常见解压游戏类型(泡泡点击、拖拽整理、消除类)。代码结构模块化,便于扩展新类型:

基础框架与泡泡点击游戏

import pygame
import random
import sys
from enum import Enum

class GameType(Enum):
    BUBBLE_POP = 1
    DRAG_SORT = 2
    MATCH_CLEAR = 3

class DecompressionGame:
    def __init__(self, width=800, height=600):
        pygame.init()
        self.screen = pygame.display.set_mode((width, height))
        self.clock = pygame.time.Clock()
        self.active_game = None
        self.font = pygame.font.SysFont('Arial', 24)

    def start_game(self, game_type):
        if game_type == GameType.BUBBLE_POP:
            self.active_game = BubblePopGame(self.screen)
        elif game_type == GameType.DRAG_SORT:
            self.active_game = DragSortGame(self.screen)
        elif game_type == GameType.MATCH_CLEAR:
            self.active_game = MatchClearGame(self.screen)

    def run(self):
        running = True
        while running:
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    running = False
                if self.active_game:
                    self.active_game.handle_event(event)

            self.screen.fill((240, 240, 245))
            if self.active_game:
                self.active_game.update()
                self.active_game.draw()
            else:
                self.draw_menu()

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

    def draw_menu(self):
        title = self.font.render("选择解压游戏类型:", True, (70, 70, 70))
        self.screen.blit(title, (250, 150))
        
        bubble_text = self.font.render("1 - 泡泡点击", True, (0, 100, 200))
        drag_text = self.font.render("2 - 拖拽整理", True, (200, 100, 0))
        match_text = self.font.render("3 - 消除方块", True, (100, 200, 0))
        
        self.screen.blit(bubble_text, (300, 220))
        self.screen.blit(drag_text, (300, 270))
        self.screen.blit(match_text, (300, 320))

泡泡点击游戏实现

class BubblePopGame:
    def __init__(self, screen):
        self.screen = screen
        self.bubbles = []
        self.score = 0
        self.font = pygame.font.SysFont('Arial', 32)
        self.spawn_timer = 0
        for _ in range(15):
            self.add_bubble()

    def add_bubble(self):
        x = random.randint(50, 750)
        y = random.randint(50, 550)
        radius = random.randint(20, 50)
        color = (random.randint(100, 255), random.randint(100, 255), random.randint(100, 255))
        self.bubbles.append({"pos": (x, y), "radius": radius, "color": color})

    def handle_event(self, event):
        if event.type == pygame.MOUSEBUTTONDOWN:
            for bubble in self.bubbles[:]:
                distance = ((event.pos[0] - bubble["pos"][0]) ** 2 + 
                          (event.pos[1] - bubble["pos"][1]) ** 2) ** 0.5
                if distance <= bubble["radius"]:
                    self.bubbles.remove(bubble)
                    self.score += bubble["radius"] // 10
                    self.add_bubble()

    def update(self):
        self.spawn_timer += 1
        if self.spawn_timer > 60 and len(self.bubbles) < 25:
            self.add_bubble()
            self.spawn_timer = 0

    def draw(self):
        for bubble in self.bubbles:
            pygame.draw.circle(self.screen, bubble["color"], bubble["pos"], bubble["radius"])
        
        score_text = self.font.render(f"分数: {self.score}", True, (50, 50, 50))
        self.screen.blit(score_text, (20, 20))

拖拽整理游戏实现

class DragSortGame:
    def __init__(self, screen):
        self.screen = screen
        self.items = []
        self.dragged_item = None
        self.font = pygame.font.SysFont('Arial', 24)
        self.create_items()

    def create_items(self):
        colors = [(255,100,100), (100,255,100), (100,100,255), 
                 (255,255,100), (255,100,255), (100,255,255)]
        for i in range(6):
            x = random.randint(100, 700)
            y = random.randint(100, 500)
            width = random.randint(40, 80)
            height = random.randint(40, 80)
            self.items.append({
                "rect": pygame.Rect(x, y, width, height),
                "color": colors[i],
                "target": pygame.Rect(50 + i*100, 50, 70, 70)
            })

    def handle_event(self, event):
        if event.type == pygame.MOUSEBUTTONDOWN:
            for item in self.items:
                if item["rect"].collidepoint(event.pos):
                    self.dragged_item = item
                    break
        
        elif event.type == pygame.MOUSEBUTTONUP:
            self.dragged_item = None
        
        elif event.type == pygame.MOUSEMOTION and self.dragged_item:
            self.dragged_item["rect"].x = event.pos[0] - self.dragged_item["rect"].width // 2
            self.dragged_item["rect"].y = event.pos[1] - self.dragged_item["rect"].height // 2

    def update(self):
        pass

    def draw(self):
        for item in self.items:
            pygame.draw.rect(self.screen, item["color"], item["rect"])
            pygame.draw.rect(self.screen, (200,200,200), item["target"], 2)
        
        help_text = self.font.render("将彩色方块拖到对应的灰色框内", True, (70,70,70))
        self.screen.blit(help_text, (200, 550))

消除方块游戏实现

class MatchClearGame:
    def __init__(self, screen):
        self.screen = screen
        self.grid = []
        self.grid_size = 8
        self.cell_size = 60
        self.selected = None
        self.font = pygame.font.SysFont('Arial', 24)
        self.initialize_grid()

    def initialize_grid(self):
        colors = [(255,0,0), (0,255,0), (0,0,255), (255,255,0)]
        self.grid = [[random.choice(colors) for _ in range(self.grid_size)] 
                    for _ in range(self.grid_size)]

    def handle_event(self, event):
        if event.type == pygame.MOUSEBUTTONDOWN:
            col = event.pos[0] // self.cell_size
            row = event.pos[1] // self.cell_size
            if 0 <= col < self.grid_size and 0 <= row < self.grid_size:
                if self.selected is None:
                    self.selected = (col, row)
                else:
                    self.swap_tiles(self.selected, (col, row))
                    self.selected = None

    def swap_tiles(self, pos1, pos2):
        self.grid[pos1[1]][pos1[0]], self.grid[pos2[1]][pos2[0]] = \
        self.grid[pos2[1]][pos2[0]], self.grid[pos1[1]][pos1[0]]
        self.check_matches()

    def check_matches(self):
        # 简化的匹配检测(实际游戏需要更复杂的逻辑)
        pass

    def update(self):
        pass

    def draw(self):
        for row in range(self.grid_size):
            for col in range(self.grid_size):
                rect = pygame.Rect(col*self.cell_size, row*self.cell_size, 
                                 self.cell_size-2, self.cell_size-2)
                pygame.draw.rect(self.screen, self.grid[row][col], rect)
                
                if self.selected == (col, row):
                    pygame.draw.rect(self.screen, (255,255,255), rect, 3)

主程序入口

if __name__ == "__main__":
    game = DecompressionGame()
    
    # 自动检测按键选择游戏类型
    while True:
        game.run()
        keys = pygame.key.get_pressed()
        if keys[pygame.K_1]:
            game.start_game(GameType.BUBBLE_POP)
        elif keys[pygame.K_2]:
            game.start_game(GameType.DRAG_SORT)
        elif keys[pygame.K_3]:
            game.start_game(GameType.MATCH_CLEAR)
        elif keys[pygame.K_ESCAPE]:
            pygame.quit()
            sys.exit()

功能说明

  1. 泡泡点击游戏:点击彩色泡泡获得分数,泡泡会持续生成
  2. 拖拽整理游戏:将随机位置的方块拖拽到对应目标区域
  3. 消除方块游戏:点击交换相邻方块位置(匹配检测逻辑需完善)

扩展建议

  • 添加音效使用 pygame.mixer
  • 增加游戏难度随时间提升的机制
  • 实现存档功能记录最高分
  • 添加更多游戏类型如数字排序、绘画板等

运行前需安装依赖:pip install pygame numpy

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐