贪吃蛇python
贪吃蛇 · 穿墙版 运行: python snake.py 依赖: pip install pygame 操作: 方向键/WASD 移动 | 空格 暂停 | R 重开 | ESC 退出 import os import sys import random import math import pygame # 配置 CELL 28 COLS 22 ROWS 22 TOP_BAR 70 PAD 20 BOARD_W COLS * CELL BOARD_H ROWS * CELL W BOARD_W PAD * 2 H TOP_BAR BOARD_H PAD # 高帧率 快速移动 FPS 120 MOVE_INTERVAL 5 # 方向 UP (0, -1) DOWN (0, 1) LEFT (-1, 0) RIGHT (1, 0) # 颜色 COL_TEXT (220, 240, 255) COL_SNAKE_HEAD (110, 240, 160) COL_SNAKE_BODY (60, 200, 120) COL_SNAKE_DARK (30, 140, 80) # 食物类型: (名字, 颜色, 分数, 生长) FOOD_TYPES [ (apple, (255, 90, 120), 10, 1), (cherry, (255, 60, 90), 20, 1), (gold, (255, 210, 80), 50, 1), ] # 传送门颜色 PORTAL_COLORS { left: (255, 180, 80), right: (80, 200, 255), top: (180, 120, 255), bottom: (120, 255, 180), } # 字体 def find_font(candidates): for p in candidates: if os.path.exists(p): return p return None def get_cn_font(size): path find_font([ C:/Windows/Fonts/msyh.ttc, C:/Windows/Fonts/simhei.ttf, C:/Windows/Fonts/simsun.ttc, /System/Library/Fonts/PingFang.ttc, /usr/share/fonts/truetype/wqy/wqy-microhei.ttc, /usr/share/fonts/opentype/noto/NotoSansCJK-Regular.ttc, ]) if path: return pygame.font.Font(path, size) return pygame.font.Font(None, size) # 粒子 class Particle: __slots__ (x, y, vx, vy, life, color, size, gravity) def __init__(self, x, y, color, speed4, gravity0.1): angle random.random() * math.pi * 2 spd random.random() * speed 1 self.x x self.y y self.vx math.cos(angle) * spd self.vy math.sin(angle) * spd self.life 1.0 self.color color self.size random.random() * 3 2 self.gravity gravity def update(self): self.x self.vx self.y self.vy self.vy self.gravity self.vx * 0.94 self.life - 0.04 def draw(self, surf): if self.life 0: return alpha int(self.life * 255) r max(1, int(self.size * self.life)) s pygame.Surface((r * 2, r * 2), pygame.SRCALPHA) pygame.draw.circle(s, (*self.color, alpha), (r, r), r) surf.blit(s, (self.x - r, self.y - r)) # 飘字 class FloatText: __slots__ (text, x, y, vy, life, color, font) def __init__(self, text, x, y, color, font): self.text text self.x x self.y y self.vy -1.5 self.life 1.0 self.color color self.font font def update(self): self.y self.vy self.vy * 0.95 self.life - 0.03 def draw(self, surf): if self.life 0: return alpha int(self.life * 255) s self.font.render(self.text, True, self.color) s.set_alpha(alpha) rect s.get_rect(center(self.x, self.y)) surf.blit(s, rect) # 传送门 class Portal: __slots__ (x, y, life, color, is_entry) def __init__(self, x, y, color, is_entry): self.x x self.y y self.life 1.0 self.color color self.is_entry is_entry def update(self): self.life - 0.055 def draw(self, surf): if self.life 0: return # 扩散圆环 progress 1.0 - self.life alpha int(self.life * 200) r int(CELL * 0.3 progress * CELL * 0.8) if r 2: return s pygame.Surface((r * 2, r * 2), pygame.SRCALPHA) # 外环 pygame.draw.circle(s, (*self.color, alpha), (r, r), r, 3) # 内环 if r 8: pygame.draw.circle(s, (255, 255, 255, alpha // 2), (r, r), r - 6, 2) surf.blit(s, (self.x - r, self.y - r)) # 游戏 class SnakeGame: def __init__(self): pygame.init() self.screen pygame.display.set_mode((W, H)) pygame.display.set_caption(贪吃蛇 · 穿墙版) self.clock pygame.time.Clock() self.font_sm get_cn_font(14) self.font_md get_cn_font(20) self.font_lg get_cn_font(32) self.font_xl get_cn_font(48) self._build_static_bg() self.reset() def _build_static_bg(self): 预渲染棋盘背景 surf pygame.Surface((W, H)) # 背景渐变 for y in range(H): ratio y / H r int(12 6 * ratio) g int(16 8 * ratio) b int(30 10 * ratio) pygame.draw.line(surf, (r, g, b), (0, y), (W, y)) # 棋盘底 发光边框强调穿墙 board_rect pygame.Rect(PAD - 2, TOP_BAR - 2, BOARD_W 4, BOARD_H 4) pygame.draw.rect(surf, (22, 28, 48), board_rect, border_radius14) pygame.draw.rect(surf, (80, 160, 255), board_rect, 3, border_radius14) pygame.draw.rect(surf, (150, 200, 255), board_rect.inflate(-6, -6), 1, border_radius12) # 格子 for r in range(ROWS): for c in range(COLS): gx c * CELL PAD gy r * CELL TOP_BAR color (26, 32, 52) if (c r) % 2 0 else (30, 36, 58) pygame.draw.rect(surf, color, (gx, gy, CELL, CELL)) self._static_bg surf # ---------- 初始化 ---------- def reset(self): cx, cy COLS // 2, ROWS // 2 self.snake [(cx, cy), (cx - 1, cy), (cx - 2, cy)] self.direction RIGHT self.next_direction RIGHT self.food None self.food_type 0 self.score 0 self.best_score getattr(self, best_score, 0) self.game_over False self.paused False self.move_timer 0 self.particles [] self.floats [] self.portals [] self.grow_pending 0 self.frame 0 self.speed_level 1 self.wrap_count 0 self.spawn_food() def spawn_food(self): 在空白格随机生成食物 empty [] for r in range(ROWS): for c in range(COLS): if (c, r) not in self.snake: empty.append((c, r)) if not empty: return self.food random.choice(empty) r random.random() if r 0.08: self.food_type 2 elif r 0.30: self.food_type 1 else: self.food_type 0 # ---------- 输入 ---------- def change_direction(self, new_dir): 立即改变方向更灵敏 # 不能 180° 掉头 if (new_dir[0] self.direction[0], new_dir[1] self.direction[1]) (0, 0): return self.direction new_dir self.next_direction new_dir # ---------- 更新 ---------- def update(self): self.frame 1 # 特效更新无论什么状态都跑 self._update_effects() if self.game_over or self.paused: return self.move_timer 1 interval max(2, MOVE_INTERVAL - (self.speed_level - 1) // 2) if self.move_timer interval: return self.move_timer 0 self.direction self.next_direction hx, hy self.snake[0] nx hx self.direction[0] ny hy self.direction[1] # ⚡ 穿墙逻辑 wrapped False wrap_side None if nx 0: nx COLS - 1 wrapped True wrap_side left elif nx COLS: nx 0 wrapped True wrap_side right elif ny 0: ny ROWS - 1 wrapped True wrap_side top elif ny ROWS: ny 0 wrapped True wrap_side bottom if wrapped: self.wrap_count 1 self._spawn_portal(hx, hy, nx, ny, wrap_side) # 撞自己 if (nx, ny) in self.snake[:-1]: self.die() return self.snake.insert(0, (nx, ny)) # 吃食物 if (nx, ny) self.food: name, color, pts, grow FOOD_TYPES[self.food_type] self.score pts self.grow_pending grow # 粒子 fx nx * CELL CELL // 2 PAD fy ny * CELL CELL // 2 TOP_BAR for _ in range(14): self.particles.append(Particle(fx, fy, color, speed5)) # 飘字 self.floats.append(FloatText( f{pts}, fx, fy - 20, color, self.font_md )) # 速度提升 if self.score // 50 self.speed_level - 1: self.speed_level 1 self.floats.append(FloatText( 加速!, W // 2, TOP_BAR 30, (255, 220, 100), self.font_md )) self.spawn_food() else: if self.grow_pending 0: self.grow_pending - 1 else: self.snake.pop() def _spawn_portal(self, from_x, from_y, to_x, to_y, side): 穿墙时在出入口各生成传送门特效 fx from_x * CELL CELL // 2 PAD fy from_y * CELL CELL // 2 TOP_BAR tx to_x * CELL CELL // 2 PAD ty to_y * CELL CELL // 2 TOP_BAR color PORTAL_COLORS.get(side, (255, 255, 255)) self.portals.append(Portal(fx, fy, color, True)) self.portals.append(Portal(tx, ty, color, False)) # 粒子爆发 for _ in range(10): self.particles.append(Particle(fx, fy, color, speed5, gravity0)) self.particles.append(Particle(tx, ty, color, speed5, gravity0)) def _update_effects(self): for p in self.particles[:]: p.update() if p.life 0: self.particles.remove(p) for f in self.floats[:]: f.update() if f.life 0: self.floats.remove(f) for po in self.portals[:]: po.update() if po.life 0: self.portals.remove(po) def die(self): self.game_over True if self.score self.best_score: self.best_score self.score for (sx, sy) in self.snake: px sx * CELL CELL // 2 PAD py sy * CELL CELL // 2 TOP_BAR for _ in range(4): self.particles.append(Particle( px, py, random.choice([COL_SNAKE_HEAD, COL_SNAKE_BODY, COL_SNAKE_DARK]), speed5 )) # ---------- 绘制 ---------- def draw(self): self.screen.blit(self._static_bg, (0, 0)) # 传送门 for po in self.portals: po.draw(self.screen) # 食物 if self.food and not self.game_over: self._draw_food() # 蛇 self._draw_snake() # 粒子 for p in self.particles: p.draw(self.screen) # 飘字 for f in self.floats: f.draw(self.screen) # UI self._draw_ui() if self.paused and not self.game_over: self._draw_center_text(已暂停, 按空格继续) if self.game_over: self._draw_center_text(游戏结束, f最终得分: {self.score}) def _draw_food(self): name, color, pts, grow FOOD_TYPES[self.food_type] fx self.food[0] * CELL CELL // 2 PAD fy self.food[1] * CELL CELL // 2 TOP_BAR pulse 1.0 0.12 * math.sin(self.frame * 0.15) r int(CELL * 0.35 * pulse) # 光晕 glow_r r 10 glow pygame.Surface((glow_r * 2, glow_r * 2), pygame.SRCALPHA) pygame.draw.circle(glow, (*color, 70), (glow_r, glow_r), glow_r) self.screen.blit(glow, (fx - glow_r, fy - glow_r)) # 主体 pygame.draw.circle(self.screen, color, (int(fx), int(fy)), r) # 高光 pygame.draw.circle(self.screen, (255, 255, 255), (int(fx - r * 0.3), int(fy - r * 0.3)), max(1, r // 3)) # 叶子 pygame.draw.circle(self.screen, (120, 220, 120), (int(fx), int(fy - r - 2)), 4) # 金星环绕 if self.food_type 2: for i in range(4): ang self.frame * 0.08 i * math.pi / 2 star_x fx math.cos(ang) * (r 8) star_y fy math.sin(ang) * (r 8) pygame.draw.circle(self.screen, (255, 240, 150), (int(star_x), int(star_y)), 3) def _draw_snake(self): n len(self.snake) for i, (sx, sy) in enumerate(self.snake): px sx * CELL PAD py sy * CELL TOP_BAR if i 0: # 蛇头光晕 glow pygame.Surface((CELL 12, CELL 12), pygame.SRCALPHA) pygame.draw.circle(glow, (110, 240, 160, 70), (CELL // 2 6, CELL // 2 6), CELL // 2 6) self.screen.blit(glow, (px - 6, py - 6)) # 头部 rect pygame.Rect(px 1, py 1, CELL - 2, CELL - 2) pygame.draw.rect(self.screen, COL_SNAKE_HEAD, rect, border_radius8) pygame.draw.rect(self.screen, (200, 255, 220), rect, 2, border_radius8) # 眼睛 eye_size 3 cx px CELL // 2 cy py CELL // 2 dx, dy self.direction if dx ! 0: ex1 cx dx * 4 ey1 cy - 5 ey2 cy 5 pygame.draw.circle(self.screen, (20, 20, 30), (ex1, ey1), eye_size) pygame.draw.circle(self.screen, (20, 20, 30), (ex1, ey2), eye_size) else: ex1 cx - 5 ex2 cx 5 ey cy dy * 4 pygame.draw.circle(self.screen, (20, 20, 30), (ex1, ey), eye_size) pygame.draw.circle(self.screen, (20, 20, 30), (ex2, ey), eye_size) else: # 身体渐变 ratio i / n r int(60 30 * (1 - ratio)) g int(200 - 40 * ratio) b int(120 - 30 * ratio) rect pygame.Rect(px 2, py 2, CELL - 4, CELL - 4) pygame.draw.rect(self.screen, (r, g, b), rect, border_radius6) # 高光 hl pygame.Surface((CELL - 8, 4), pygame.SRCALPHA) hl.fill((255, 255, 255, 60)) self.screen.blit(hl, (px 4, py 4)) def _draw_ui(self): # 标题 title self.font_lg.render(贪吃蛇 · 穿墙, True, (110, 240, 160)) self.screen.blit(title, (PAD, 12)) # 分数 score_str f分数: {self.score} s self.font_md.render(score_str, True, COL_TEXT) self.screen.blit(s, (W - s.get_width() - PAD, 12)) # 最高分 best_str f最高: {self.best_score} bs self.font_sm.render(best_str, True, (180, 200, 230)) self.screen.blit(bs, (W - bs.get_width() - PAD, 42)) # 长度 len_str f长度: {len(self.snake)} ls self.font_sm.render(len_str, True, (180, 200, 230)) self.screen.blit(ls, (PAD 150, 22)) # 速度 spd_str f速度: {self.speed_level} ss self.font_sm.render(spd_str, True, (255, 200, 100)) self.screen.blit(ss, (PAD 150, 44)) # 穿墙次数 wrap_str f穿墙: {self.wrap_count} ws self.font_sm.render(wrap_str, True, (150, 220, 255)) self.screen.blit(ws, (PAD 270, 22)) # FPS fps_str fFPS: {int(self.clock.get_fps())} fs self.font_sm.render(fps_str, True, (120, 140, 180)) self.screen.blit(fs, (PAD 270, 44)) def _draw_center_text(self, title_text, sub_text): overlay pygame.Surface((W, H), pygame.SRCALPHA) overlay.fill((0, 0, 0, 160)) self.screen.blit(overlay, (0, 0)) title self.font_xl.render(title_text, True, (255, 100, 130)) self.screen.blit(title, (W // 2 - title.get_width() // 2, H // 2 - 80)) sub self.font_md.render(sub_text, True, (200, 220, 255)) self.screen.blit(sub, (W // 2 - sub.get_width() // 2, H // 2)) hint self.font_sm.render(按 R 重新开始 | ESC 退出, True, (150, 170, 200)) self.screen.blit(hint, (W // 2 - hint.get_width() // 2, H // 2 60)) # ---------- 主循环 ---------- def run(self): running True while running: for e in pygame.event.get(): if e.type pygame.QUIT: running False elif e.type pygame.KEYDOWN: if e.key pygame.K_ESCAPE: running False elif e.key pygame.K_r: self.reset() elif e.key pygame.K_SPACE: if not self.game_over: self.paused not self.paused elif e.key in (pygame.K_UP, pygame.K_w): self.change_direction(UP) elif e.key in (pygame.K_DOWN, pygame.K_s): self.change_direction(DOWN) elif e.key in (pygame.K_LEFT, pygame.K_a): self.change_direction(LEFT) elif e.key in (pygame.K_RIGHT, pygame.K_d): self.change_direction(RIGHT) self.update() self.draw() pygame.display.flip() self.clock.tick(FPS) pygame.quit() sys.exit() if __name__ __main__: print( * 50) print( 贪吃蛇 · 穿墙版) print( * 50) print( 方向键 / WASD 控制移动可穿墙) print( 空格 暂停 | R 重开 | ESC 退出) print( * 50) SnakeGame().run()

相关新闻

Redis可视化工具选型与实战:从连接集群到SCAN增量导出

Redis可视化工具选型与实战:从连接集群到SCAN增量导出

简介:这是一份面向Redis初学者与运维开发人员的Windows端可视化数据库管理工具,以Redis Desktop Manager为核心,帮助用户摆脱命令行束缚,通过图形界面完成连接、浏览与数据操作。压缩包共630个文件,以59个dll动态库、2…

2026/10/10 9:44:02 阅读更多 →
Unity项目接入抖音小游戏全流程:构建、转换、适配与性能优化

Unity项目接入抖音小游戏全流程:构建、转换、适配与性能优化

把Unity项目接到抖音小游戏这件事,我前前后后做了三个项目才敢说摸清了套路。第一次接的时候,我天真地以为Unity导成WebGL再套一层壳就能跑,结果从构建到真机跑通花了整整两天,中间踩的坑包括但不限于包体路径写错、登录回调没接上…

2026/10/10 9:44:02 阅读更多 →
吃透Java Lambda:语法、原理、实战与面试要点

吃透Java Lambda:语法、原理、实战与面试要点

先别笑,“lamada”这个拼写我太熟了——第一年学Java 8的时候我也这么拼错过。但拼错归拼错,这个语法特性本身,是真的值得每个Java开发者好好吃透。Lambda表达式是Java 8里含金量最高、影响最深远的变化之一,它让Java在面向对象的…

2026/10/10 9:44:02 阅读更多 →

最新新闻

AMD锐龙AI Max PRO 400系列192GB统一内存本地推理320B大模型实践指南

AMD锐龙AI Max PRO 400系列192GB统一内存本地推理320B大模型实践指南

1. 从标题拆解出的核心命题1.1 这条消息到底在说什么先把标题里的信息拆干净。“AMD锐龙AI Max PRO 400系列”是产品线,“192GB内存”是硬件规格,“PC可跑320B模型”是能力结论。三句话串起来,讲的是同一件事:一台放在桌面上的个人…

2026/10/10 10:29:21 阅读更多 →
strata框架+RTX4090 48G本地部署qwen3.8-next-flash:解码150t/s实战调优指南

strata框架+RTX4090 48G本地部署qwen3.8-next-flash:解码150t/s实战调优指南

1. 这套组合到底在折腾什么第一次看到“strata极速运行qwen3.8-next-flash,RTX4090 48G解码150t/s”这个标题,我第一反应是:又是一个标题党。毕竟在本地推理圈子里,“极速”“炸裂”“瘫痪”这类词已经被用烂了,动不动…

2026/10/10 10:29:21 阅读更多 →
从Q-learning到CQL:离线强化学习原理与实战

从Q-learning到CQL:离线强化学习原理与实战

1. 为什么值得把强化学习从头再学一遍1.1 从“会调包”到“懂原理”的分水岭我最早接触强化学习,和很多人一样,是从跑通一个 CartPole 的 DQN 示例开始的。看着奖励曲线慢慢爬上去,心里觉得“这东西我算是入门了”。但后来真正做项目才发现&a…

2026/10/10 10:29:21 阅读更多 →
基于STM32的智能家居安防系统设计:从选型到排障实战

基于STM32的智能家居安防系统设计:从选型到排障实战

最近一直在被问同一个题目:基于STM32的智能家居安防系统设计。这名字听起来很像老掉牙的毕业设计,但真的一步步去落地,会发现里面能讲的东西其实非常多。从芯片选型、传感器信号处理,到报警逻辑怎么写、误报怎么压下去&#xff0c…

2026/10/10 10:29:20 阅读更多 →
ESP8285+MQTT:老电机远程启停与状态监控实战方案

ESP8285+MQTT:老电机远程启停与状态监控实战方案

一台电机,放在没有网线的车间角落,想远程启停、看运行状态,还要和工厂里的其他设备联动,怎么搞?这是我最近在做一个电机控制器改造项目时遇上的真实场景。最后落地方案很简单:一块 ESP8285 做主控&#xff…

2026/10/10 10:29:20 阅读更多 →
LLM应用实验管理实战:跟踪、评估与比较的完整方法论

LLM应用实验管理实战:跟踪、评估与比较的完整方法论

做实验跟踪这件事,说句实话,很多做机器学习的朋友早期都是硬着头皮上的。最早我用 Excel 记参数、在文件名里塞日期,遇到一次模型效果回退,折腾两天才发现是训练数据和前一轮不一致。后来我把这套东西换成结构化工具,才…

2026/10/10 10:28:19 阅读更多 →

日新闻

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

1. 从“卫星轨道分类”这个标题说起:为什么值得花时间搞懂第一次接触“卫星轨道分类”这个概念,很多人会觉得它离自己很远——不就是天上的星星怎么转吗?但如果你正在做航天任务规划、遥感数据接收、星座设计,甚至只是准备一场航天…

2026/10/10 0:00:39 阅读更多 →
Spring AOP 核心原理与实战:从概念到日志切面落地

Spring AOP 核心原理与实战:从概念到日志切面落地

1. 从一个真实痛点说起:为什么你的代码里到处都是重复逻辑刚入行那会儿,我写过一个用户管理模块,注册、登录、改密码、注销四个接口。每个接口里都塞了几乎一样的日志打印、参数校验、事务开启和提交。当时觉得没什么,能跑就行。直…

2026/10/10 0:00:40 阅读更多 →
Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

简介:这是一套面向计算机相关专业学生与项目实战学习者的Python数据采集与分析可视化完整项目,以Boss直聘岗位数据为对象,适合用作毕业设计、课程设计或期末大作业。资源包共38个文件,约246KB,以13个py源码文件为核心&…

2026/10/10 0:00:40 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:32 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 1:36:08 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 10:11:06 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 5:23:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 6:17:20 阅读更多 →