泡泡龙python
泡泡龙 - 高清高速版3色 运行: python bubble_shooter.py 依赖: pip install pygame 操作: 鼠标移动瞄准 | 左键发射 | R 重开 | ESC 退出 import os import sys import random import math import pygame # 配置 W, H 700, 800 FPS 144 BUBBLE_RADIUS 24 BUBBLE_DIAM BUBBLE_RADIUS * 2 COLS 16 ROWS 18 GRID_TOP 100 GRID_LEFT (W - COLS * BUBBLE_DIAM) // 2 SHOOTER_X W // 2 SHOOTER_Y H - 80 SHOOTER_RADIUS 32 BUBBLE_SPEED 24 GRAVITY_FALL 0.6 AIM_STEPS 120 AIM_STEP_SIZE 8 # ⚡ 精简到 3 种颜色红、蓝、绿 COLORS [ (255, 90, 120), # 红 (90, 180, 255), # 蓝 (110, 240, 140), # 绿 ] COLOR_DARK [ (180, 50, 80), (50, 120, 190), (60, 170, 80), ] # 字体 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) # 泡泡缓存 def build_bubble_surfaces(): cache {} for ci in range(len(COLORS)): color COLORS[ci] dark COLOR_DARK[ci] size BUBBLE_RADIUS * 2 12 center size // 2 surf pygame.Surface((size, size), pygame.SRCALPHA) pygame.draw.circle(surf, (*color, 50), (center, center), BUBBLE_RADIUS 5) pygame.draw.circle(surf, color, (center, center), BUBBLE_RADIUS) pygame.draw.circle(surf, dark, (center, center), BUBBLE_RADIUS, 4) pygame.draw.circle( surf, (255, 255, 255, 180), (int(center - BUBBLE_RADIUS * 0.35), int(center - BUBBLE_RADIUS * 0.4)), max(3, BUBBLE_RADIUS // 3) ) pygame.draw.circle( surf, (255, 255, 255, 120), (int(center BUBBLE_RADIUS * 0.3), int(center BUBBLE_RADIUS * 0.25)), max(2, BUBBLE_RADIUS // 5) ) cache[ci] surf cache[small] {} for ci in range(len(COLORS)): s pygame.transform.smoothscale( cache[ci], (int(BUBBLE_RADIUS * 1.6), int(BUBBLE_RADIUS * 1.6)) ) cache[small][ci] s return cache # 粒子 class Particle: __slots__ (x, y, vx, vy, life, color, size, gravity) def __init__(self, x, y, color, speed6, size6): angle random.random() * math.pi * 2 spd random.random() * speed 2 self.x x self.y y self.vx math.cos(angle) * spd self.vy math.sin(angle) * spd - 2 self.life 1.0 self.color color self.size random.random() * size 2 self.gravity 0.4 def update(self): self.x self.vx self.y self.vy self.vy self.gravity self.vx * 0.96 self.life - 0.035 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 FallingBubble: __slots__ (x, y, vx, vy, color_idx) def __init__(self, x, y, color_idx): self.x x self.y y self.vx random.uniform(-3, 3) self.vy random.uniform(-4, -1) self.color_idx color_idx def update(self): self.x self.vx self.y self.vy self.vy GRAVITY_FALL self.vx * 0.99 def draw(self, surf, cache): s cache[self.color_idx] surf.blit(s, (self.x - s.get_width() // 2, self.y - s.get_height() // 2)) # 游戏 class BubbleShooter: def __init__(self): pygame.init() self.screen pygame.display.set_mode((W, H)) pygame.display.set_caption(泡泡龙 · 3色版) self.clock pygame.time.Clock() self.font_sm get_cn_font(16) self.font_md get_cn_font(22) self.font_lg get_cn_font(36) self.font_xl get_cn_font(56) self.bubble_cache build_bubble_surfaces() 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(15 10 * ratio) g int(20 15 * ratio) b int(45 35 * ratio) pygame.draw.line(surf, (r, g, b), (0, y), (W, y)) for i, alpha in enumerate([80, 50, 25]): s pygame.Surface((W, 6), pygame.SRCALPHA) s.fill((100, 180, 255, alpha)) surf.blit(s, (0, GRID_TOP - 3 i * 2)) self._static_bg surf def reset(self): self.grid [[None] * COLS for _ in range(ROWS)] self.score 0 self.best_score getattr(self, best_score, 0) self.game_over False self.win False self.frame 0 self.particles [] self.falling_bubbles [] self.shots 0 self.combo 0 self.current_color random.randrange(len(COLORS)) self.next_color random.randrange(len(COLORS)) self.shooting_bubble None self.aim_angle -math.pi / 2 # 初始泡泡 self.initial_rows 6 for r in range(self.initial_rows): for c in range(COLS): if random.random() 0.12: continue self.grid[r][c] random.randrange(len(COLORS)) self.ensure_min_colors(3) def ensure_min_colors(self, min_count): colors_present set() for r in range(ROWS): for c in range(COLS): if self.grid[r][c] is not None: colors_present.add(self.grid[r][c]) if len(colors_present) min_count: for r in range(self.initial_rows): for c in range(COLS): if self.grid[r][c] is not None and random.random() 0.5: self.grid[r][c] random.randrange(len(COLORS)) def grid_to_pixel(self, row, col): x GRID_LEFT col * BUBBLE_DIAM BUBBLE_RADIUS if row % 2 1: x BUBBLE_RADIUS y GRID_TOP row * BUBBLE_DIAM BUBBLE_RADIUS return x, y def pixel_to_grid(self, x, y): best_r, best_c 0, 0 best_dist 1e9 for r in range(ROWS): for c in range(COLS): if self.grid[r][c] is not None: continue gx, gy self.grid_to_pixel(r, c) d (gx - x) ** 2 (gy - y) ** 2 if d best_dist: best_dist d best_r, best_c r, c return best_r, best_c def get_neighbors(self, row, col): if row % 2 0: offsets [(-1, -1), (-1, 0), (0, -1), (0, 1), (1, -1), (1, 0)] else: offsets [(-1, 0), (-1, 1), (0, -1), (0, 1), (1, 0), (1, 1)] result [] for dr, dc in offsets: nr, nc row dr, col dc if 0 nr ROWS and 0 nc COLS: result.append((nr, nc)) return result def shoot(self): if self.shooting_bubble is not None or self.game_over: return angle self.aim_angle vx math.cos(angle) * BUBBLE_SPEED vy math.sin(angle) * BUBBLE_SPEED self.shooting_bubble { x: SHOOTER_X, y: SHOOTER_Y, vx: vx, vy: vy, color: self.current_color, } self.shots 1 def update_shooting_bubble(self): b self.shooting_bubble if b is None: return steps max(1, int(BUBBLE_SPEED / 8)) for _ in range(steps): b[x] b[vx] / steps b[y] b[vy] / steps if b[x] - BUBBLE_RADIUS 0: b[x] BUBBLE_RADIUS b[vx] -b[vx] elif b[x] BUBBLE_RADIUS W: b[x] W - BUBBLE_RADIUS b[vx] -b[vx] if b[y] - BUBBLE_RADIUS GRID_TOP: self.place_bubble(b[x], GRID_TOP BUBBLE_RADIUS, b[color]) self.shooting_bubble None return for r in range(ROWS): for c in range(COLS): if self.grid[r][c] is None: continue gx, gy self.grid_to_pixel(r, c) dx gx - b[x] dy gy - b[y] if dx * dx dy * dy (BUBBLE_DIAM - 6) ** 2: self.place_bubble(b[x], b[y], b[color]) self.shooting_bubble None return if b[y] H: self.shooting_bubble None def place_bubble(self, x, y, color_idx): row, col self.pixel_to_grid(x, y) if self.grid[row][col] is not None: best_dist 1e9 best_r, best_c None, None for r in range(ROWS): for c in range(COLS): if self.grid[r][c] is None: gx, gy self.grid_to_pixel(r, c) d (gx - x) ** 2 (gy - y) ** 2 if d best_dist: best_dist d best_r, best_c r, c if best_r is None: return row, col best_r, best_c self.grid[row][col] color_idx matched self.find_matches(row, col, color_idx) if len(matched) 3: self.combo 1 base_score len(matched) * 10 combo_bonus self.combo * 5 gained base_score combo_bonus self.score gained for (r, c) in matched: gx, gy self.grid_to_pixel(r, c) color COLORS[self.grid[r][c]] for _ in range(5): self.particles.append(Particle(gx, gy, color, speed7, size6)) self.grid[r][c] None self.drop_floating() if self.is_cleared(): self.win True self.game_over True else: self.combo 0 if not self.game_over: for r in range(ROWS - 1, ROWS - 3, -1): for c in range(COLS): if self.grid[r][c] is not None: self.game_over True break if self.game_over: break self.current_color self.next_color self.next_color random.randrange(len(COLORS)) def find_matches(self, row, col, color_idx): visited set() queue [(row, col)] visited.add((row, col)) matched [] while queue: r, c queue.pop(0) matched.append((r, c)) for nr, nc in self.get_neighbors(r, c): if (nr, nc) in visited: continue if self.grid[nr][nc] color_idx: visited.add((nr, nc)) queue.append((nr, nc)) return matched def drop_floating(self): connected set() queue [] for c in range(COLS): if self.grid[0][c] is not None: connected.add((0, c)) queue.append((0, c)) while queue: r, c queue.pop(0) for nr, nc in self.get_neighbors(r, c): if (nr, nc) in connected: continue if self.grid[nr][nc] is not None: connected.add((nr, nc)) queue.append((nr, nc)) for r in range(ROWS): for c in range(COLS): if self.grid[r][c] is not None and (r, c) not in connected: gx, gy self.grid_to_pixel(r, c) self.falling_bubbles.append(FallingBubble(gx, gy, self.grid[r][c])) self.grid[r][c] None def is_cleared(self): for r in range(ROWS): for c in range(COLS): if self.grid[r][c] is not None: return False return True def update(self): self.frame 1 self.update_shooting_bubble() for fb in self.falling_bubbles[:]: fb.update() if fb.y H 50: self.falling_bubbles.remove(fb) for p in self.particles[:]: p.update() if p.life 0: self.particles.remove(p) def draw(self): self.screen.blit(self._static_bg, (0, 0)) pygame.draw.line(self.screen, (80, 130, 220), (2, GRID_TOP), (2, H), 3) pygame.draw.line(self.screen, (80, 130, 220), (W - 2, GRID_TOP), (W - 2, H), 3) # ⚡ 网格泡泡不再晃动 for r in range(ROWS): for c in range(COLS): if self.grid[r][c] is None: continue gx, gy self.grid_to_pixel(r, c) s self.bubble_cache[self.grid[r][c]] self.screen.blit(s, (gx - s.get_width() // 2, gy - s.get_height() // 2)) for fb in self.falling_bubbles: fb.draw(self.screen, self.bubble_cache) for p in self.particles: p.draw(self.screen) if self.shooting_bubble: b self.shooting_bubble s self.bubble_cache[b[color]] self.screen.blit(s, (b[x] - s.get_width() // 2, b[y] - s.get_height() // 2)) if not self.game_over and self.shooting_bubble is None: self.draw_aim_line() self.draw_shooter() self.draw_ui() if self.game_over: self.draw_game_over() def draw_aim_line(self): angle self.aim_angle vx math.cos(angle) vy math.sin(angle) x, y SHOOTER_X, SHOOTER_Y color COLORS[self.current_color] for i in range(AIM_STEPS): x vx * AIM_STEP_SIZE y vy * AIM_STEP_SIZE if x - BUBBLE_RADIUS 0: x BUBBLE_RADIUS vx -vx elif x BUBBLE_RADIUS W: x W - BUBBLE_RADIUS vx -vx if y GRID_TOP BUBBLE_RADIUS: break hit False for r in range(ROWS): for c in range(COLS): if self.grid[r][c] is None: continue gx, gy self.grid_to_pixel(r, c) dx gx - x dy gy - y if dx * dx dy * dy (BUBBLE_DIAM - 6) ** 2: hit True break if hit: break if hit: break if i % 3 0: alpha max(40, 220 - i * 2) r 4 s pygame.Surface((r * 2, r * 2), pygame.SRCALPHA) pygame.draw.circle(s, (*color, alpha), (r, r), r) self.screen.blit(s, (x - r, y - r)) def draw_shooter(self): pygame.draw.circle(self.screen, (40, 55, 100), (SHOOTER_X, SHOOTER_Y 14), 42) pygame.draw.circle(self.screen, (80, 120, 200), (SHOOTER_X, SHOOTER_Y 14), 42, 4) angle self.aim_angle end_x SHOOTER_X math.cos(angle) * SHOOTER_RADIUS * 1.9 end_y SHOOTER_Y math.sin(angle) * SHOOTER_RADIUS * 1.9 pygame.draw.line(self.screen, (50, 70, 130), (SHOOTER_X, SHOOTER_Y), (end_x, end_y), 16) pygame.draw.line(self.screen, (120, 160, 250), (SHOOTER_X, SHOOTER_Y), (end_x, end_y), 10) if self.shooting_bubble is None: s self.bubble_cache[self.current_color] self.screen.blit(s, (SHOOTER_X - s.get_width() // 2, SHOOTER_Y - s.get_height() // 2)) next_x SHOOTER_X 80 next_y SHOOTER_Y 20 pygame.draw.circle(self.screen, (30, 40, 70), (next_x, next_y), BUBBLE_RADIUS 6) pygame.draw.circle(self.screen, (80, 110, 180), (next_x, next_y), BUBBLE_RADIUS 6, 2) s self.bubble_cache[small][self.next_color] self.screen.blit(s, (next_x - s.get_width() // 2, next_y - s.get_height() // 2)) def draw_ui(self): score_text self.font_lg.render(f分数: {self.score}, True, (230, 245, 255)) self.screen.blit(score_text, (25, 20)) best_text self.font_sm.render(f最高: {self.best_score}, True, (150, 180, 220)) self.screen.blit(best_text, (25, 65)) tip self.font_sm.render(下一个, True, (150, 180, 220)) self.screen.blit(tip, (SHOOTER_X 55, SHOOTER_Y - 16)) if self.combo 1: combo_text self.font_lg.render(f连击 x{self.combo}, True, (255, 200, 80)) self.screen.blit(combo_text, (W - combo_text.get_width() - 25, 20)) fps_text self.font_sm.render(fFPS: {int(self.clock.get_fps())}, True, (100, 130, 180)) self.screen.blit(fps_text, (W - fps_text.get_width() - 25, 65)) hint self.font_sm.render( 鼠标瞄准 | 左键发射 | R 重开 | ESC 退出, True, (130, 150, 190) ) self.screen.blit(hint, (W // 2 - hint.get_width() // 2, H - 25)) def draw_game_over(self): overlay pygame.Surface((W, H), pygame.SRCALPHA) overlay.fill((0, 0, 0, 180)) self.screen.blit(overlay, (0, 0)) if self.win: title_text 通关 title_color (110, 240, 140) else: title_text 游戏结束 title_color (255, 100, 130) title self.font_xl.render(title_text, True, title_color) self.screen.blit(title, (W // 2 - title.get_width() // 2, H // 2 - 120)) score_text self.font_lg.render(f最终得分: {self.score}, True, (255, 220, 100)) self.screen.blit(score_text, (W // 2 - score_text.get_width() // 2, H // 2)) shots_text self.font_md.render(f发射次数: {self.shots}, True, (180, 200, 230)) self.screen.blit(shots_text, (W // 2 - shots_text.get_width() // 2, H // 2 55)) hint self.font_md.render(按 R 重新开始, True, (200, 220, 255)) self.screen.blit(hint, (W // 2 - hint.get_width() // 2, H // 2 130)) 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.type pygame.MOUSEMOTION: mx, my e.pos dx mx - SHOOTER_X dy my - SHOOTER_Y angle math.atan2(dy, dx) if angle -0.15: angle -0.15 elif angle -math.pi 0.15: angle -math.pi 0.15 self.aim_angle angle elif e.type pygame.MOUSEBUTTONDOWN: if e.button 1: self.shoot() self.update() self.draw() pygame.display.flip() self.clock.tick(FPS) pygame.quit() sys.exit() if __name__ __main__: print( * 50) print( 泡泡龙 · 3色版) print( * 50) print( 鼠标移动瞄准 | 左键发射) print( R 重开 | ESC 退出) print( * 50) BubbleShooter().run()

相关新闻

JSP+Servlet+MySQL购物网站毕设:运行、修改与避坑指南

JSP+Servlet+MySQL购物网站毕设:运行、修改与避坑指南

简介:基于JSPServletMySQL的蛋糕甜品店购物网站项目资源,面向Java Web初学、课程设计与毕业设计人群,覆盖从商品展示、购物车到订单提交与模拟支付的完整交易链路。管理员侧包含登录、订单管理、客户管理和类目管理;用户侧包含注册…

2026/10/12 19:44:55 阅读更多 →
Rasa中文聊天机器人:源码解析、NLU管道配置与训练实战指南

Rasa中文聊天机器人:源码解析、NLU管道配置与训练实战指南

简介:面向毕业设计、课程设计及项目开发场景的Rasa中文聊天机器人完整工程,适合有一定Python基础的学习者快速掌握对话系统从源码实现、模型训练到文档编写的全流程。压缩包共24个文件、约4.42MB,以Markdown指南、YAML配置、Python脚本、bash…

2026/10/11 9:52:09 阅读更多 →
Java Web毕业设计:科研成果申报管理系统源码解析与复现指南

Java Web毕业设计:科研成果申报管理系统源码解析与复现指南

简介:面向计算机专业毕业设计的科研成果申报管理系统完整源码包,定位于高校或科研机构的项目申报、审批与进度跟踪场景。系统采用JSPJava Servlet技术前后台交互,涵盖申报信息录入、数据校验、数据库读写等功能模块,可帮助学习者理…

2026/10/11 10:16:59 阅读更多 →

最新新闻

Android 广播 - 组件通信

Android 广播 - 组件通信

一、Service 通知 Activity 更新 UI 1、Service public class BroadcastConstants {public static final String ACTION_UPDATE_UI "com.example.ACTION_UPDATE_UI";public static final String EXTRA_DATA "extra_data"; }public class MyService exten…

2026/10/12 22:06:21 阅读更多 →
AI模型解析的前提:为何必须基于可验证技术事实

AI模型解析的前提:为何必须基于可验证技术事实

我无法根据提供的输入内容生成符合要求的博文。原因如下:项目标题中提及的“腾讯 WorkBuddy”“匿名模型 Space-Bunny”均无公开、可验证的官方信息源。经核查,腾讯官方未发布名为 WorkBuddy 的正式办公协作产品,亦无注册或备案的 AI 模型名为…

2026/10/12 22:06:21 阅读更多 →
工业级手套目标检测数据集:400张双格式标注+开箱即用YOLO训练

工业级手套目标检测数据集:400张双格式标注+开箱即用YOLO训练

简介:本资源是面向计算机视觉初学者与算法工程师的手套目标检测专用数据集,适用于YOLO系列模型(v5/v7/v8/v9/v10/v11)的训练、验证与测试全流程开发。数据集共1201个文件,包含400张高质量JPG图像、400份YOLO格式&#…

2026/10/12 22:06:21 阅读更多 →
电力系统状态估计:WLS/WLAV与LSTM/FFNN融合实践

电力系统状态估计:WLS/WLAV与LSTM/FFNN融合实践

简介:本资源是一套面向电力系统专业方向的课程设计与毕业设计实践方案,聚焦于状态估计核心算法实现,涵盖加权最小二乘(WLS)、加权最小绝对值(WLAV)两类经典优化方法及前馈神经网络、LSTM等深度学…

2026/10/12 22:06:21 阅读更多 →
workbuddy-to-dsh 实战:分布式 Shell 会话桥接与任务调度

workbuddy-to-dsh 实战:分布式 Shell 会话桥接与任务调度

1. 从零认识 workbuddy-to-dsh:它到底在解决什么问题第一次看到workbuddy-to-dsh这个名字,很多人会以为是某个小众命令行工具,或者某个内部脚本的代号。实际上,它是一类“工作伙伴数据到分布式 Shell 会话”的桥接方案&#xff0c…

2026/10/12 22:06:21 阅读更多 →
基于FEKO的二维ISAR成像仿真与距离-多普勒处理

基于FEKO的二维ISAR成像仿真与距离-多普勒处理

简介:面向雷达成像与电磁仿真领域的2维ISAR成像资料,基于FEKO仿真模型获取目标电磁散射回波,再经MATLAB二维FFT完成距离-多普勒图像重构,适合从事ISAR算法验证、雷达目标特性识别与成像系统设计的工程师、研究生及高年级本科生。资…

2026/10/12 22:05:20 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

在数码相机、高清显示屏与现代矢量图形技术高度发达的今天,画面可以做到绝对的锐利、平滑与无瑕。然而,当一张秋日手账插画或拍立得照片过于“平整无瑕”时,往往会散发出一种冰冷生硬的“数码塑料感(Digital Plasticity&#xff0…

2026/10/12 0:00:59 阅读更多 →
活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

在现代网页与移动端设计中,横排(Horizontal Layout)早已经成为了绝对的主流。然而,当我们翻开泛黄的线装古籍、宋版木刻诗集,或是欣赏一张茶道雅集的手写便签时,那种**自上而下纵向书写、自右向左逐列铺展&…

2026/10/12 0:00:59 阅读更多 →
周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

每到周日的晚上八点到十点,很多人心里都会悄悄亮起一盏警示灯。 在心理学上,这种现象有一个专门的称谓——“周日夜晚焦虑症(Sunday Scaries)”。明天又是周一,闹钟又要重新在七点响彻卧房;脑海里仿佛有一个…

2026/10/12 0:00:59 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/12 0:16:30 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 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/12 21:05:09 阅读更多 →
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/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练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/12 18:11:17 阅读更多 →