import pgzrun import random import time import pygame WIDTH = 1000 HEIGHT = 725 TOTAL_TIME = 30 # 初始倒计时 # 载入中文字体(Windows 推荐使用 SimHei 或 Microsoft YaHei) try: FONT = pygame.font.SysFont("SimHei", 80) # 黑体 SMALL_FONT = pygame.font.SysFont("SimHei", 50) except: FONT = pygame.font.Font(None, 80) SMALL_FONT = pygame.font.Font(None, 50) def draw(): screen.fill((30, 30, 30)) if win: text1 = FONT.render("游戏成功!", True, (255, 255, 0)) text2 = SMALL_FONT.render(f"用时:{TOTAL_TIME - remain_time:.1f}s", True, (255, 255, 255)) screen.surface.blit(text1, text1.get_rect(center=(WIDTH/2, HEIGHT/2 - 50))) screen.surface.blit(text2, text2.get_rect(center=(WIDTH/2, HEIGHT/2 + 50))) elif lose: text1 = FONT.render("游戏失败!", True, (255, 0, 0)) text2 = SMALL_FONT.render("时间到", True, (255, 255, 255)) screen.surface.blit(text1, text1.get_rect(center=(WIDTH/2, HEIGHT/2 - 50))) screen.surface.blit(text2, text2.get_rect(center=(WIDTH/2, HEIGHT/2 + 50))) else: t = SMALL_FONT.render(f"{max(0, remain_time):.1f}s", True, (255, 255, 0)) screen.surface.blit(t, t.get_rect(center=(900, 662))) for grid in grids: screen.draw.filled_rect(Rect(grid['pos'], (side, side)), grid['color']) for fx in effects: fx_font = pygame.font.SysFont("SimHei", int(fx['size'])) txt = fx_font.render(fx['text'], True, pygame.Color(fx['color'])) screen.surface.blit(txt, txt.get_rect(center=fx['pos'])) def update(): global remain_time, lose, effects remain_time = TOTAL_TIME - (time.time() - start_t) if remain_time <= 0 and not win: lose = True remain_time = 0 new_fx = [] for fx in effects: x, y = fx['pos'] fx['pos'] = (x, y - 1.5) fx['life'] -= 0.05 fx['size'] += 0.5 if fx['life'] > 0: new_fx.append(fx) effects = new_fx def base_color(): return (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)) def dif_color(base): r = min(base[0] + random.randint(8, 12), 255) g = min(base[1] + random.randint(8, 12), 255) b = min(base[2] + random.randint(8, 12), 255) return (r, g, b) def game(): global grids, side, dc side = 700 // n * 0.9 space = 700 // n * 0.1 grids = [] bc = base_color() dc = dif_color(bc) i = 1 dif_index = random.randint(1, n * n) for row in range(n): for col in range(n): info = { 'pos': (space + col * (side + space), space + row * (side + space)), 'color': dc if i == dif_index else bc } grids.append(info) i += 1 def on_mouse_down(pos): global n, win, start_t, effects if win or lose: return for grid in grids: grid_rect = Rect(grid['pos'], (side, side)) if grid_rect.collidepoint(pos): if grid['color'] == dc: start_t += 10 effects.append({ 'text': '+10s', 'pos': pos, 'size': 60, 'color': 'green', 'life': 1.0 }) if n > 10: win = True else: n += 1 game() else: start_t -= 3 effects.append({ 'text': '-3s', 'pos': pos, 'size': 60, 'color': 'red', 'life': 1.0 }) break # 初始化 n = 3 win = False lose = False start_t = time.time() remain_time = TOTAL_TIME effects = [] game() pgzrun.go()