作者小头像 Lv.6
2953 成长值

个人介绍

这个人很懒,什么都没有留下

感兴趣或擅长的领域

暂无数据
个人勋章
  • 活跃之星
  • 考证狂人
成长雷达
10
1023
975
945
0

个人资料

个人介绍

这个人很懒,什么都没有留下

感兴趣或擅长的领域

暂无数据

达成规则

他的回复:
马年走马灯示例  import pygameimport sysimport os# 初始化pygamepygame.init()# 设置窗口WIDTH, HEIGHT = 800, 600screen = pygame.display.set_mode((WIDTH, HEIGHT))pygame.display.set_caption("马年新春祝贺词走马灯")# 颜色定义RED = (255, 0, 0)GOLD = (255, 215, 0)BLACK = (0, 0, 0)# --- 字体设置部分 (终极修复:手动查找文件路径) ---def get_system_font_path():    """尝试在系统中查找常见的中文字体文件路径"""    # Windows 系统字体目录    if os.name == 'nt':        font_dir = os.path.join(os.environ.get('WINDIR', r'C:\Windows'), 'Fonts')        # 常见的中文字体文件名        font_files = [            'simhei.ttf',      # 黑体            'msyh.ttf',        # 微软雅黑            'msyhbd.ttf',      # 微软雅黑粗体            'simsun.ttc',      # 宋体            'simkai.ttf'       # 楷体        ]               for file_name in font_files:            full_path = os.path.join(font_dir, file_name)            if os.path.exists(full_path):                print(f"找到字体文件: {full_path}")                return full_path       # macOS 系统 (备用)    elif sys.platform == 'darwin':        font_dir = '/System/Library/Fonts/PingFang.ttc'        if os.path.exists(font_dir):            return font_dir               return None# 获取字体路径font_path = get_system_font_path()font = Noneif font_path:    try:        # 使用找到的绝对路径加载字体        font = pygame.font.Font(font_path, 48)        print("字体加载成功!")    except Exception as e:        print(f"加载字体文件失败: {e}")# 如果手动查找也失败,使用最后的备用方案if font is None:    print("警告:未能手动找到字体文件,使用默认字体。")    # 这里不传名字,只传大小,使用Pygame内置的默认字体    font = pygame.font.Font(None, 48)# -------------------# 祝贺词列表greetings = [    "马年大吉",    "龙马精神",    "马到成功",    "一马当先",    "万马奔腾",    "马年行大运"]# 走马灯参数text_width = 200text_height = 60spacing = 20total_width = len(greetings) * (text_width + spacing)speed = 2# 主循环clock = pygame.time.Clock()offset = 0running = Truewhile running:    for event in pygame.event.get():        if event.type == pygame.QUIT:            running = False    # 清屏    screen.fill(RED)    # 绘制祝贺词    for i, greeting in enumerate(greetings):        x = (offset + i * (text_width + spacing)) % total_width - text_width        y = HEIGHT // 2 - text_height // 2        # 绘制文字背景        pygame.draw.rect(screen, GOLD, (x, y, text_width, text_height), border_radius=10)               # 绘制文字        text_surface = font.render(greeting, True, BLACK)        text_rect = text_surface.get_rect(center=(x + text_width // 2, y + text_height // 2))        screen.blit(text_surface, text_rect)    # 更新偏移量    offset -= speed    if offset = -total_width:        offset = 0    # 更新显示    pygame.display.flip()    clock.tick(60)pygame.quit()sys.exit()  好的,这是为您生成的“马年新春祝贺词走马灯”代码的完整逻辑总结。这段代码主要基于 `pygame` 库实现,核心逻辑分为以下几个模块:### 1. 初始化与环境设置*   **库引入**:引入 `pygame`(用于图形界面)、`sys`(用于系统退出)、`os`(用于文件路径操作)。*   **Pygame 初始化**:调用 `pygame.init()` 启动所有 Pygame 模块。*   **窗口创建**:设置窗口大小(800x600)和标题。*   **常量定义**:定义颜色(红、金、黑)和走马灯的基本参数(文字框大小、间距、速度)。### 2. 字体加载逻辑(核心修复部分)由于您在运行时遇到了 `TypeError`,代码采用了**手动文件系统查找**的方式来加载字体,这是最稳健的逻辑:1.  **定义目标字体**:列出 Windows 系统下常见的中文字体文件名(如 `simhei.ttf` 黑体, `msyh.ttf` 微软雅黑)。2.  **构建系统路径**:通过 `os.environ.get('WINDIR')` 动态获取 Windows 系统目录,进而定位到 `Fonts` 文件夹。3.  **遍历查找**:循环检查目标字体文件是否存在。4.  **直接加载**:一旦找到文件(例如 `C:\Windows\Fonts\simhei.ttf`),直接使用 `pygame.font.Font(文件路径, 字号)` 加载字体。这绕过了 Pygame 内部可能出错的字体名称查找机制。### 3. 数据准备*   **祝贺词列表**:创建一个包含“马年大吉”、“龙马精神”等祝福语的列表。*   **动画参数计算**:根据列表长度和间距,计算整个走马灯的总宽度,用于后续的循环滚动计算。### 4. 主循环逻辑程序进入一个无限循环(`while running`),每一帧执行以下步骤:1.  **事件监听**:    *   检测用户是否点击了关闭窗口按钮(`pygame.QUIT`),如果是,则退出循环。2.  **屏幕刷新**:    *   使用 `screen.fill(RED)` 将背景填充为红色,覆盖上一帧的内容。3.  **位置计算与绘制**:    *   **遍历列表**:对每一条祝贺词进行处理。    *   **动态坐标 X**:利用取模运算 `(offset + i * 间距) % 总宽度` 计算当前文字的 X 坐标。这使得文字移出屏幕左侧后,会自动从屏幕右侧重新出现,形成无限循环。    *   **绘制背景**:在计算出的坐标处绘制一个圆角矩形(金色)作为文字背景。    *   **绘制文字**:在背景矩形中心渲染黑色的祝贺词。4.  **状态更新**:    *   **移动偏移量**:`offset -= speed`。每一帧将所有文字向左移动 2 个像素。    *   **重置偏移量**:当 `offset` 小于负的总宽度时,将其重置为 0,保持数值在合理范围内。5.  **显示更新**:    *   调用 `pygame.display.flip()` 将内存中的画面绘制到屏幕上。    *   调用 `clock.tick(60)` 限制帧率为 60 FPS,控制动画速度。### 5. 程序退出当循环结束时,调用 `pygame.quit()` 清理资源并退出程序。---**总结**:该程序通过手动定位字体文件解决了兼容性问题,利用取模运算实现了平滑的无限滚动效果,并通过每帧重绘背景和文字实现了动态的走马灯动画。 
发布时间 2022/09/23 09:48:32 最后回复 yd_270851166 2023/03/16 23:58:58 版块 训练营
11187 998 32