Python趣学篇:Pygame重现经典打砖块游戏

article/2025/6/7 14:10:59

名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》
创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊)
专栏介绍:《Python星球日记》

目录

    • 一、游戏背景与技术选型
      • 1. 打砖块游戏的传奇历史
      • 2. 为什么选择Pygame?
    • 二、环境准备与项目架构
      • 1. 环境搭建
      • 2. 项目结构设计
    • 三、核心功能实现详解
      • 1. 游戏对象设计
        • Paddle类 - 玩家挡板
        • Ball类 - 弹球物理引擎
      • 2. 碰撞检测系统
        • 球与挡板的智能碰撞
        • 砖块消除机制
      • 3. 中文字体完美支持
    • 四、游戏循环与状态管理
      • 1. 主游戏循环结构
      • 2. 游戏状态管理
    • 五、视觉效果与用户体验
      • 1. 彩色砖块设计
      • 2. 用户界面设计
    • 六、完整代码与扩展思路
      • 1. 完整代码及功能清单
      • 2. 可扩展功能思路
      • 3. 性能优化建议
    • 七、总结与收获

欢迎大家来到Python星球日记的趣学篇,在趣学篇,我们将带来很多有趣的适合初学者的项目,项目均由个人团队开发及AI vide coding的辅助…

还记得那个让无数玩家沉迷的经典游戏吗?一个小球、一根挡板、一墙彩色砖块,简单却充满魅力。今天我们就用Python和Pygame从零开始,重现这款1976年诞生的传奇游戏!

一、游戏背景与技术选型

1. 打砖块游戏的传奇历史

打砖块(Breakout)是世界上第一款打砖块游戏,1976年由美国雅达利公司发行。令人惊讶的是,这款游戏的原型设计者正是后来创立苹果电脑的史蒂夫·乔布斯与史蒂夫·沃兹尼亚克两人。这款看似简单的游戏,却开创了一个全新的游戏类型,影响至今。

在这里插入图片描述

游戏的核心魅力在于:

  • 🎯 规则简单:任何人都能立即上手
  • 🎮 节奏紧张:需要精准的反应和控制
  • 🌈 视觉丰富:彩色砖块带来满足的破坏感
  • 🔄 重玩价值:每次游戏都有不同的体验

2. 为什么选择Pygame?

Pygame是一款专门为开发和设计2D电子游戏而生的软件包,它在SDL(Simple DirectMedia Layer)的基础上开发而成,具有良好的跨平台性。

Pygame的优势:

  • 免费开源:完全免费,无需担心版权问题
  • 简单易学:API设计友好,适合初学者
  • 功能完备:图像、声音、输入处理一应俱全
  • 跨平台:Windows、Mac、Linux都能运行

二、环境准备与项目架构

1. 环境搭建

首先确保你的Python环境已经准备就绪,然后安装Pygame库:

# 使用pip安装Pygame
pip install pygame# 验证安装是否成功
python -c "import pygame; print('Pygame版本:', pygame.version.ver)"

2. 项目结构设计

我们的打砖块游戏采用面向对象的设计思路,主要包含以下几个核心类:

🎮 游戏架构
├── Game类        # 游戏主控制器
├── Paddle类      # 玩家挡板
├── Ball类        # 弹球
├── Brick类       # 砖块
└── 工具函数       # 字体处理等辅助功能

三、核心功能实现详解

在这里插入图片描述

1. 游戏对象设计

Paddle类 - 玩家挡板
class Paddle:def __init__(self):self.width = PADDLE_WIDTHself.height = PADDLE_HEIGHTself.x = SCREEN_WIDTH // 2 - self.width // 2self.y = SCREEN_HEIGHT - 50self.speed = PADDLE_SPEEDself.rect = pygame.Rect(self.x, self.y, self.width, self.height)def move_left(self):if self.x > 0:self.x -= self.speedself.rect.x = self.xdef move_right(self):if self.x < SCREEN_WIDTH - self.width:self.x += self.speedself.rect.x = self.x

设计要点:

  • 使用pygame.Rect进行碰撞检测
  • 边界检测防止挡板移出屏幕
  • 平滑的移动控制
Ball类 - 弹球物理引擎
class Ball:def __init__(self):self.size = BALL_SIZEself.x = SCREEN_WIDTH // 2self.y = SCREEN_HEIGHT // 2self.speed_x = random.choice([-BALL_SPEED, BALL_SPEED])self.speed_y = BALL_SPEEDself.rect = pygame.Rect(self.x, self.y, self.size, self.size)def update(self):self.x += self.speed_xself.y += self.speed_yself.rect.x = self.xself.rect.y = self.y# 边界碰撞检测if self.x <= 0 or self.x >= SCREEN_WIDTH - self.size:self.speed_x = -self.speed_xif self.y <= 0:self.speed_y = -self.speed_y

物理模拟精髓:

  • 🎯 真实反弹:球体碰撞边界时改变方向
  • 🎲 随机性:初始方向随机,增加游戏变化
  • 🔄 连续运动:每帧更新位置实现平滑动画

2. 碰撞检测系统

球与挡板的智能碰撞
# 检查球与挡板的碰撞
if self.ball.rect.colliderect(self.paddle.rect) and self.ball.speed_y > 0:self.ball.speed_y = -self.ball.speed_y# 根据球撞击挡板的位置调整反弹角度hit_pos = (self.ball.x - self.paddle.x) / self.paddle.widthself.ball.speed_x = BALL_SPEED * (hit_pos - 0.5) * 2

创新设计:

  • 💡 位置影响角度:球撞击挡板不同位置会有不同反弹角度
  • 🎮 策略性增强:玩家可以通过控制撞击位置改变球的轨迹
  • 🎯 游戏性提升:增加了技巧和策略元素

在这里插入图片描述

砖块消除机制
# 检查球与砖块的碰撞
for brick in self.bricks:if not brick.destroyed and self.ball.rect.colliderect(brick.rect):brick.destroyed = Trueself.score += 10self.ball.speed_y = -self.ball.speed_ybreak

3. 中文字体完美支持

为了确保游戏界面的中文能够正确显示,我们实现了跨平台字体适配系统:

def get_chinese_font(size):"""获取支持中文的字体"""system = platform.system()font_names = []if system == "Windows":font_names = ['Microsoft YaHei', 'SimHei', 'SimSun', 'KaiTi', 'FangSong']elif system == "Darwin":  # macOSfont_names = ['PingFang SC', 'STHeiti', 'STSong', 'STKaiti']else:  # Linuxfont_names = ['WenQuanYi Micro Hei', 'DejaVu Sans', 'Noto Sans CJK SC']# 尝试加载字体for font_name in font_names:try:font = pygame.font.SysFont(font_name, size)return fontexcept:continuereturn pygame.font.Font(None, size)

字体方案亮点:

  • 🌐 全平台覆盖:Windows、macOS、Linux自动适配
  • 🎨 优雅降级:找不到中文字体时自动使用默认字体
  • 性能优化:只在初始化时检测,避免重复加载

四、游戏循环与状态管理

1. 主游戏循环结构

def run(self):running = Truewhile running:running = self.handle_events()  # 处理用户输入self.update()                   # 更新游戏状态self.draw()                     # 绘制游戏画面self.clock.tick(60)             # 控制帧率为60FPS

设计哲学:

  • 🔄 清晰分离:输入、逻辑、渲染三层分离
  • 性能稳定:60FPS确保流畅体验
  • 🎮 响应及时:实时处理用户输入

2. 游戏状态管理

我们实现了完整的游戏状态系统:

# 游戏状态
self.game_over = False    # 游戏结束
self.game_won = False     # 游戏获胜
self.lives = 3            # 生命数量
self.score = 0            # 玩家得分# 胜利条件检查
if all(brick.destroyed for brick in self.bricks):self.game_won = True# 失败条件检查
if self.ball.y > SCREEN_HEIGHT:self.lives -= 1if self.lives <= 0:self.game_over = True

五、视觉效果与用户体验

1. 彩色砖块设计

参考原版游戏8排砖块、不同颜色得分不同的设计,我们创建了6种颜色的砖块:

# 砖块颜色列表 - 从暖色到冷色的渐变
BRICK_COLORS = [RED, ORANGE, YELLOW, GREEN, CYAN, BLUE]def create_bricks(self):for row in range(BRICK_ROWS):for col in range(BRICK_COLS):x = start_x + col * (BRICK_WIDTH + brick_spacing)y = start_y + row * (BRICK_HEIGHT + brick_spacing)color = BRICK_COLORS[row % len(BRICK_COLORS)]brick = Brick(x, y, color)self.bricks.append(brick)

2. 用户界面设计

信息显示:

  • 📊 实时得分:左上角显示当前得分
  • ❤️ 生命显示:剩余生命数量
  • 🎮 操作提示:屏幕底部显示控制说明
  • 🏆 状态提示:游戏结束或获胜时的友好提示

六、完整代码与扩展思路

1. 完整代码及功能清单

完整代码:

import pygame
import sys
import random
import platform# 初始化pygame
pygame.init()# 游戏常量
SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600
PADDLE_WIDTH = 100
PADDLE_HEIGHT = 15
BALL_SIZE = 15
BRICK_WIDTH = 75
BRICK_HEIGHT = 30
BRICK_ROWS = 6
BRICK_COLS = 10
PADDLE_SPEED = 8
BALL_SPEED = 5# 颜色定义
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)
YELLOW = (255, 255, 0)
ORANGE = (255, 165, 0)
PURPLE = (128, 0, 128)
CYAN = (0, 255, 255)# 砖块颜色列表
BRICK_COLORS = [RED, ORANGE, YELLOW, GREEN, CYAN, BLUE]def get_chinese_font(size):"""获取支持中文的字体"""system = platform.system()font_names = []if system == "Windows":font_names = ['Microsoft YaHei', 'SimHei', 'SimSun', 'KaiTi', 'FangSong']elif system == "Darwin":  # macOSfont_names = ['PingFang SC', 'STHeiti', 'STSong', 'STKaiti']else:  # Linuxfont_names = ['WenQuanYi Micro Hei', 'DejaVu Sans', 'Noto Sans CJK SC']# 尝试加载字体for font_name in font_names:try:font = pygame.font.SysFont(font_name, size)# 测试是否能渲染中文test_surface = font.render("测试", True, (255, 255, 255))return fontexcept:continue# 如果都失败了,使用默认字体print("警告:无法找到合适的中文字体,可能显示异常")return pygame.font.Font(None, size)class Paddle:def __init__(self):self.width = PADDLE_WIDTHself.height = PADDLE_HEIGHTself.x = SCREEN_WIDTH // 2 - self.width // 2self.y = SCREEN_HEIGHT - 50self.speed = PADDLE_SPEEDself.rect = pygame.Rect(self.x, self.y, self.width, self.height)def move_left(self):if self.x > 0:self.x -= self.speedself.rect.x = self.xdef move_right(self):if self.x < SCREEN_WIDTH - self.width:self.x += self.speedself.rect.x = self.xdef draw(self, screen):pygame.draw.rect(screen, WHITE, self.rect)class Ball:def __init__(self):self.size = BALL_SIZEself.x = SCREEN_WIDTH // 2self.y = SCREEN_HEIGHT // 2self.speed_x = random.choice([-BALL_SPEED, BALL_SPEED])self.speed_y = BALL_SPEEDself.rect = pygame.Rect(self.x, self.y, self.size, self.size)def update(self):self.x += self.speed_xself.y += self.speed_yself.rect.x = self.xself.rect.y = self.y# 边界碰撞检测if self.x <= 0 or self.x >= SCREEN_WIDTH - self.size:self.speed_x = -self.speed_xif self.y <= 0:self.speed_y = -self.speed_ydef draw(self, screen):pygame.draw.ellipse(screen, WHITE, self.rect)def reset(self):self.x = SCREEN_WIDTH // 2self.y = SCREEN_HEIGHT // 2self.speed_x = random.choice([-BALL_SPEED, BALL_SPEED])self.speed_y = BALL_SPEEDself.rect.x = self.xself.rect.y = self.yclass Brick:def __init__(self, x, y, color):self.width = BRICK_WIDTHself.height = BRICK_HEIGHTself.x = xself.y = yself.color = colorself.rect = pygame.Rect(x, y, self.width, self.height)self.destroyed = Falsedef draw(self, screen):if not self.destroyed:pygame.draw.rect(screen, self.color, self.rect)pygame.draw.rect(screen, BLACK, self.rect, 2)class Game:def __init__(self):self.screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))pygame.display.set_caption("打砖块游戏")self.clock = pygame.time.Clock()# 使用支持中文的字体self.font = get_chinese_font(36)self.small_font = get_chinese_font(24)# 初始化游戏对象self.paddle = Paddle()self.ball = Ball()self.bricks = []self.score = 0self.lives = 3self.game_over = Falseself.game_won = False# 创建砖块self.create_bricks()def create_bricks(self):self.bricks = []brick_spacing = 5start_x = (SCREEN_WIDTH - (BRICK_COLS * BRICK_WIDTH + (BRICK_COLS - 1) * brick_spacing)) // 2start_y = 50for row in range(BRICK_ROWS):for col in range(BRICK_COLS):x = start_x + col * (BRICK_WIDTH + brick_spacing)y = start_y + row * (BRICK_HEIGHT + brick_spacing)color = BRICK_COLORS[row % len(BRICK_COLORS)]brick = Brick(x, y, color)self.bricks.append(brick)def handle_events(self):for event in pygame.event.get():if event.type == pygame.QUIT:return Falseelif event.type == pygame.KEYDOWN:if event.key == pygame.K_r and (self.game_over or self.game_won):self.restart_game()return Truedef update(self):if self.game_over or self.game_won:return# 处理键盘输入keys = pygame.key.get_pressed()if keys[pygame.K_LEFT] or keys[pygame.K_a]:self.paddle.move_left()if keys[pygame.K_RIGHT] or keys[pygame.K_d]:self.paddle.move_right()# 更新球的位置self.ball.update()# 检查球与挡板的碰撞if self.ball.rect.colliderect(self.paddle.rect) and self.ball.speed_y > 0:self.ball.speed_y = -self.ball.speed_y# 根据球撞击挡板的位置调整反弹角度hit_pos = (self.ball.x - self.paddle.x) / self.paddle.widthself.ball.speed_x = BALL_SPEED * (hit_pos - 0.5) * 2# 检查球与砖块的碰撞for brick in self.bricks:if not brick.destroyed and self.ball.rect.colliderect(brick.rect):brick.destroyed = Trueself.score += 10self.ball.speed_y = -self.ball.speed_ybreak# 检查球是否掉落if self.ball.y > SCREEN_HEIGHT:self.lives -= 1if self.lives <= 0:self.game_over = Trueelse:self.ball.reset()# 检查是否获胜if all(brick.destroyed for brick in self.bricks):self.game_won = Truedef draw(self):self.screen.fill(BLACK)# 绘制游戏对象self.paddle.draw(self.screen)self.ball.draw(self.screen)for brick in self.bricks:brick.draw(self.screen)# 绘制UI信息score_text = self.font.render(f"得分: {self.score}", True, WHITE)lives_text = self.font.render(f"生命: {self.lives}", True, WHITE)self.screen.blit(score_text, (10, 10))self.screen.blit(lives_text, (10, 50))# 绘制游戏结束或获胜信息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))self.screen.blit(game_over_text, text_rect)elif self.game_won:win_text = self.font.render("恭喜通关! 按R重新开始", True, GREEN)text_rect = win_text.get_rect(center=(SCREEN_WIDTH//2, SCREEN_HEIGHT//2))self.screen.blit(win_text, text_rect)# 绘制控制说明control_text = self.small_font.render("使用左右箭头键或A/D键控制挡板", True, WHITE)self.screen.blit(control_text, (10, SCREEN_HEIGHT - 30))pygame.display.flip()def restart_game(self):self.paddle = Paddle()self.ball = Ball()self.create_bricks()self.score = 0self.lives = 3self.game_over = Falseself.game_won = Falsedef run(self):running = Truewhile running:running = self.handle_events()self.update()self.draw()self.clock.tick(60)  # 60 FPSpygame.quit()sys.exit()if __name__ == "__main__":print("正在启动打砖块游戏...")print("如果中文显示异常,请确保系统已安装中文字体")game = Game()game.run()

效果预览:

静态:

在这里插入图片描述
动态:

在这里插入图片描述

功能清单:

核心玩法:挡板控制、弹球物理、砖块消除
游戏系统:得分机制、生命系统、胜负判定
视觉效果:彩色砖块、平滑动画、中文界面
用户体验:键盘控制、重新开始、操作提示

2. 可扩展功能思路

  • 道具系统:加长挡板、多球、激光等
  • 关卡设计:不同布局的砖块排列
  • 音效添加:碰撞音效、背景音乐
  • 粒子效果:砖块破碎的视觉特效
  • AI对手:电脑控制的挡板对战模式

3. 性能优化建议

  • 使用pygame.sprite.Group管理游戏对象
  • 实现对象池避免频繁创建销毁
  • 添加碰撞检测的空间优化算法
  • 使用pygame.Surface.convert()优化图像渲染

七、总结与收获

通过这个项目,我们不仅重现了一款经典游戏,更重要的是学习了:

🎯 技术收获:

  • Pygame库的核心用法:图形渲染、事件处理、碰撞检测
  • 面向对象设计:类的设计与交互、封装与抽象
  • 游戏开发思维:物理模拟、状态管理、用户体验设计
  • 跨平台开发:字体适配、兼容性处理

🎮 开发感悟:
经典游戏之所以经典,不在于复杂的技术,而在于简单而深刻的游戏机制。一个小球的弹跳轨迹,就能带来无穷的乐趣和挑战。这提醒我们,在软件开发中,用户体验往往比技术复杂度更重要

🚀 下一步方向:
掌握了基础的2D游戏开发后,你可以尝试:

  • 开发更复杂的游戏类型(RPG、策略游戏等)
  • 学习3D游戏开发(Panda3D、OpenGL等)
  • 探索游戏AI和机器学习的结合
  • 参与开源游戏项目的贡献

愿每一行代码都充满创造的乐趣,愿每一个像素都闪耀着梦想的光芒! 🌟


让我们一起用代码重现经典,用创意点亮未来!

创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊)


http://www.hkcw.cn/article/YmSeZiLEGV.shtml

相关文章

Transformer学习资料

​​核心论文​​ 原论文标题&#xff1a;《Attention Is All You Need》&#xff08;Transformer原始论文&#xff09; ​​Transformer学习资源​​ 视频教程&#xff1a; B站中文视频&#xff1a;Transformer详解 中文教程&#xff1a; GitHub项目&#xff1a;learn-nlp-wi…

AIGC 基础篇 高等数学篇 02导数与微分

声明&#xff1a;本文章仅用于复习&#xff0c;请不要将本文章当做预习篇或者讲解篇 此外&#xff0c;此文章不会包含全部的高等数学知识&#xff0c;仅仅是为了学习AI而进行的前期学习&#xff0c;因此知识含量不会很多&#xff0c;另外补充一句&#xff0c;博主已经对上一篇…

MQTTX连接阿里云的物联网配置

本文的目标是通过MQTTX的客户端&#xff0c;连接到阿里云的物联网的平台&#xff0c;发送温度信息&#xff0c;在阿里云的平台中显示出来。阿里云免费注册&#xff0c;免费有一个MQTT的服务器。有数量限制&#xff0c;但是对于测试来讲&#xff0c;已经足够。 1、注册阿里云的物…

06-排序

排序 1. 排序的概念及其应用 1.1 排序的概念 排序&#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作。 稳定性&#xff1a;假定在待排序的记录序列中&#xff0c;存在多个具有相同的关键…

MS1023/MS1224——10MHz 到 80MHz、10:1 LVDS 并串转换器(串化器)/串并转换器(解串器)

产品简述 MS1023 串化器和 MS1224 解串器是一对 10bit 并串 / 串并转 换芯片&#xff0c;用于在 LVDS 差分底板上传输和接收 10MHz 至 80MHz 的并行字速率的串行数据。起始 / 停止位加载后&#xff0c;转换为负载编 码输出&#xff0c;串行数据速率介于 120Mbps…

Cyber Weekly #58

赛博新闻 1、DeepSeek新版R1更新&#xff0c;幻觉率大幅降低 5月28日&#xff0c;DeepSeek-R1模型已升级至DeepSeek-R1-0528版本&#xff0c;核心在于显著提升模型的思维深度与推理能力。该版本基于DeepSeek V3 Base模型&#xff0c;通过强化后训练显著优化了在数学、编程及通…

换一条宽带ip地址会变吗?同一个宽带如何不同ip地址

宽带IP地址是否变化取决于更换的方式&#xff0c;以及你使用的是公网IP还是内网IP。以下是具体分析&#xff0c;并附上同一个宽带下切换IP的实用方法&#xff1a; &#x1f310; 一、更换宽带是否会改变IP地址&#xff1f; 1. 更换宽带线路&#xff08;如从电信换到移动&#x…

环境对象以及回调函数

1.环境对象 2.回调函数

SQL Indexes(索引)

目录 Indexes Using Clustered Indexes Using Nonclustered Indexes Declaring Indexes Using Indexes Finding Rows Without Indexes Finding Rows in a Heap with a Nonclustered Index Finding Rows in a Clustered Index Finding Rows in a Clustered Index with …

graphviz, dot, Error: lost rA sA edge; 独立的模块

1) 有向图dot文件 digraph R { node [shaperecord]; { ranksame rA sA tA } { ranksame uB vB wB } rA -> sA; sA -> vB; t -> rA; uB -> vB; wB -> u; wB -> tA; } 2&#xff09;出现报警信息 Warning: flat edge between adjacent …

SpringBoot接入Kimi实践记录轻松上手

kimi简单使用 什么是Kimi API 官网&#xff1a;https://platform.moonshot.cn/ Kimi API 并不是一个我所熟知的广泛通用的术语。我的推测是&#xff0c;你可能想问的是关于 API 的一些基础知识。API&#xff08;Application Programming Interface&#xff0c;应用程序编程接…

Windows版PostgreSQL 安装 vector 扩展

问题 spring-ai在集成PGVector向量存储的时候会报错如下&#xff0c;那么就需要安装pgsql的vector扩展。 SQL [CREATE EXTENSION IF NOT EXISTS vector]; 错误: 无法打开扩展控制文件 "C:/Program Files/PostgreSQL/9.6/share/extension/vector.control": No such …

【操作系统原理08】文件管理

文章目录 零.大纲一.文件管理0.大纲1.文件管理1.1 **文件属性**1.2 文件内部数据组织1.3 文件之间的组织1.4操作系统提供功能1.5 文件在外存存放 二.文件的逻辑结构0.大纲1.无结构文件2.有结构文件 三.文件目录0.大纲1.文件控制块2.目录结构3.索引节点(FCB改进) 四.文件共享0.大…

力扣面试150题--二叉搜索树中第k小的元素

Day 58 题目描述 思路 直接采取中序遍历&#xff0c;不过我们将k参与到中序遍历中&#xff0c;遍历到第k个元素就结束 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* …

Linux网络基础概念(1)

文章目录 前言一、计算机网络背景网络发展认识协议 二、网络协议协议分层OSI七层模型TCP/IP五层&#xff08;或四层&#xff09;模型 三、网络传输基本流程同局域网的两台主机通信跨网络的两台主机通信 四、网络中的地址管理认识IP地址认识MAC地址 总结 前言 到网络喽&#xff…

【Typst】6.布局函数

概述 上节我们介绍了文档结构元素的函数&#xff0c;本节介绍一些控制布局使用的函数&#xff0c;掌握他们之后你可以更进一步的控制页面元素的布局。 系列目录 1.Typst概述2.Typst标记语法和基础样式3.Typst脚本语法4.导入、包含和读取5.文档结构元素与函数6.布局函数 对齐…

初识高通camx

一、chi和camx之间如何通信&#xff1a; Chi对Camx的操作&#xff0c;需要通过 ExtensionModule 进行操作&#xff0c;因此&#xff0c;CamX对外提供的接口扩展需要通过ExtensionModule进行&#xff0c;里面一个重要的变量就是g_chiContextOps。 Camx对Chi的操作&#xff0c;是…

NebulaAI V2.6.0发布:工作流功能正式上线!

2025年5月30日&#xff0c;NebulaAI V2.6.0版本正式上线&#xff01; 在V2.6.0版本中&#xff0c;NBAI团队对工作流功能进行了重磅升级&#xff0c;用户可以通过创建工作流来与大模型交互&#xff1a; 支持选择常用大模型进行工作流的交互&#xff1b; 支持文件上传&#…

Flowith,有一种Agent叫无限

大家好&#xff0c;我是羊仔&#xff0c;专注AI工具、智能体、编程。 今天羊仔要和大家聊聊一个最近发现的超级实用的Agent平台&#xff0c;名字叫Flowith。 这篇文章会带你从零了解到实战体验&#xff0c;搞清楚Flowith是如何让工作效率飙升好几倍&#xff0c;甚至重新定义未…

【Linux系统编程】库制作与原理

目录 理解软硬链接 动态库与静态库 手动制作静态库并使用 制作静态库 使用静态库方法一 使用静态库方法二 使用静态库方法三 手动制作动态库并使用 制作动态库 使用动态库方法一 使用动态库方法二 使用动态库方法三 动静态库同时使用的细节说明 动态库的理解、动…