DevTrendsDeveloper trends
Accent color

DEV TRENDS / DAILY DISCOVERIES

Apr 20, 2026 · What developers are building

Daily discoveries from developer communities, independent makers, and open source.

windows平台离线语音转文本、实时识别、说话人分离、语音输入、实时字幕 -- owl meeting

免费一个月 微软商店链接 功能介绍 1. CPU 飞快 i511400H:30min 的音频 1min 就能处理完(五年前的 CPU) i54210m:30min 的音频 3min 就能处理完(十年前的 CPU) 2. 实时识别 支持识别麦克风、系统声音或者双路同时识别。 支持字幕和语音输入模式,支持同步翻译(通过自部署 LLM 模型,推荐 HY MT1.51.8B,速度极快) 3. 识别音视频文件 支持主流音视频文件。 内置 FFMpeg 处理,可以转换各种格式。 4. 说话人管理 内置说话人管理 可以为每个说话人指定模型进行识别 5. 强大的编辑与搜索功能 支持自定义词典。自动调用词典内容进行后处理。 支持手动编辑,点击识别文本自动跳转到对应音频。 支持批量删除与替换 6. 支持全局搜索 7. 本地 LLM 支持 内置 ollama 接口,支持一键启动,一键处理。 可以自定义提示词,使用本地部署的 LLM 模型进行润色、翻译、总结等任务 8. 语言支持 普通话(97%)、中文方言(90%)、英语(95%)、韩语(94%)、日语(94%)阿拉伯语、以及意大利语(97%)、西班牙语(96%)、葡萄牙语(95%)、德语(95%)、法语(95%)、俄语(94%)、乌克兰语(93%)、波兰语(93%)、荷兰语(93%)等25种欧洲语言、印尼语、泰语、越南语、土耳其语、印地语、马来语、菲律宾语、波斯语 更多介绍可查看官网:

Original
DTData & operationsDTWindows
—

能动手干活的AI笔记本

重新定义您的数字工作空间 能动手干活的 AI 笔记本。融合多模态对话、知识库管理与智能自动化模板,释放您的核心生产力。 访问地址:

Original
—

SonicMeet:浏览器里的实时双语会议字幕和翻译工具

大家好,我做了一个小工具:SonicMeet。 它是一个浏览器插件,主要解决一个很具体的问题:开英文会议、跨语言会议时,听不清、跟不上、记不住。 很多人应该都有类似经历:会议里有人语速很快,或者讨论比较密集,自己还在理解上一句话,下一段内容已经过去了。尤其是在非母语环境里开会,哪怕英语还可以,也很容易因为口音、语速、术语、网络延迟错过关键信息。 SonicMeet 想做的事情很简单:在 Google Meet、Zoom、Microsoft Teams 这类网页会议里,实时显示双语字幕和翻译,让你可以一边听原声,一边看原文和译文,不用等会后再去翻录音或会议纪要。 目前主要功能包括: 实时双语字幕:原文和翻译可以一起显示,也可以只看其中一种; 实时翻译:适合会议、跨国团队 standup、远程面试、线上课程等场景; 会议笔记:看到重要字幕时可以直接保存,也可以随手补充自己的想法; 会后回顾:自动保存转录和笔记,之后可以搜索、重读、导出; AI 总结:会后生成简洁的会议摘要、关键结论和待办事项; 无需机器人入会:它在浏览器里运行,不会出现“某某 bot 加入会议”的提示,比较适合不想打扰会议流程的场景。 我做这个工具,是因为自己长期在非母语环境里开会。很多时候不是完全听不懂,而是会议节奏太快,信息量太大,很容易漏掉细节。漏掉一次可能没什么,但如果每天都有很多会议,长期下来会很消耗精力。 所以我希望 SonicMeet 不是一个“很重”的会议管理平台,而是一个安静的小助手:开会时在旁边帮你把话记下来、翻译出来,需要的时候再帮你整理重点。它不应该打断会议,也不应该让别人感到突兀。 它可能比较适合这些人: 经常参加英文会议、跨语言会议的人; 在海外团队、远程团队工作的人; 听力能跟上大概意思,但容易漏掉细节的人; 需要会后复盘会议内容、整理待办事项的人; 不想让会议机器人加入会议,但又想要实时字幕和记录的人。 隐私方面,我也尽量做得克制:会议音频留在浏览器标签页里处理,不保存录音,只发送必要的短文本片段用于翻译。产品还在持续改进中,如果你对跨语言会议、实时字幕、会议笔记这类场景有需求,欢迎试试看,也欢迎反馈问题和建议。 谢谢阮老师和周刊读者。

Original
DTResearch & learningDTData & operationsDTWeb app
—

标签页一多就失控?我把一个开源项目继续做成了更顺手的 Chrome 标签整理扩展

如果你也经常一不小心开到几十个标签页,应该会懂那种感觉: 1. 想关,但是一个个关太麻烦。 2. 想整理,但是浏览器顶部那一排标签根本不好操作。 3. 想先收起来,后面再看,又怕一关就丢。 TabNest 就是为这个场景做的。 这里也想把来源说明清楚: 最初的开源项目 tabout,原作者就是因为自己会一下子打开 50 多个标签页,关闭起来很麻烦,所以做了这个工具。这个出发点我非常认同,所以我基于原项目继续做了二次开发,在保留原始思路的基础上,补充了更多适合日常使用的功能,形成了现在的 TabNest。 现在我更倾向于把它理解成一个“浏览器里的标签整理工作台”,不只是帮我更快地关标签,而是把页面拆成几种不同状态来处理: 打开中的标签:就是你现在正在处理、马上还会继续切换的页面 稍后保存:就是你还要看,但不是现在处理的页面 归档:就是已经处理过,但还想保留一下记录的页面 这一点对我自己很有用。以前我浏览器里所有页面都挤在同一层,要么一直开着,要么直接关掉。现在至少能把“现在处理的”和“之后处理的”分开,浏览器会清爽很多。 目前我觉得它最核心的 3 个功能是: 1、 快速关闭标签页 打开新标签后,可以更直观地看到当前所有标签,按组清理,比在浏览器顶部一排一排地点关闭舒服很多。 2、 调整标签页顺序 支持按窗口查看标签,并且可以直接拖拽调整顺序,浏览器里真实的标签顺序也会同步变化。这个对经常一边查资料一边写东西的人很实用。 3、 收纳所有标签页,后续再展开 如果你暂时不想处理那么多标签,可以先把它们整体收纳起来,等需要的时候再恢复,相当于把当前工作现场先保存下来。 除此之外,我也补充了一些细节能力,让它不只是“关标签”,而是真的更适合长期用来整理浏览器工作流。 整个扩展是纯本地运行的,没有账号系统,也没有自建后端,数据保存在浏览器本地。 如果你本来就是重度标签页用户,尤其是那种经常同时开很多页面、很多窗口的人,这个扩展应该会比较对路。 体验地址: Chrome 商店: 原作者信息: 原作者 GitHub: 原项目仓库:

Original
DTSoftware developmentDTWindows
—

Kardcraft:把 Anki 制卡从“体力活”变成 AI 复利系统

Kardcraft 是一个面向 Anki 的 AI 制卡 Agent。 它不只是“帮你写卡片”,而是把学习输入(笔记 / PDF / 课程内容)转成可复习、可进化的卡片资产。 一句话:把数小时手工制卡,压缩到几分钟,并在后续复习中持续放大收益。 这个项目优势如下: 1. 时间杠杆极强 这不是省几分钟,而是把高频、高痛苦的制卡流程整体自动化。一次节省,长期复利。 2. 模型迭代只会增强这个产品 大模型升级不是替代品,而是 Kardcraft 的“弹药补给”: 抽取更准、改写更稳、难度分层更细、格式控制更强。 3. 反馈闭环天然高密度 用户每天复习都在给你打分: 烂卡片 = 复习痛苦 = 流失; 好卡片 = 记忆顺滑 = 依赖。 优化方向非常清晰,迭代速度非常快。 4. 数据飞轮可积累 “记住 / 忘记”就是最硬的监督信号。 系统会持续学习用户记忆模式,越用越懂你,后发者很难复制。

Original
DTResearch & learningDTAgent extensionDTContent / resource
—

HiKid 是一个完全免费、永久免费的开源桌面应用,专为非英语国家的小朋友打造——帮助他们练习英语口语和听力。

对着麦克风说 "Hello",它就会用英语跟你聊天、讲故事、猜谜语——完全离线,所有数据和 AI 都在本地运行,不上传任何云端。 🗣️ 开口就能聊 —— 不用打字,直接说话,AI 听得懂 🧠 聪明又耐心 —— 聊什么话题都可以,说得慢、说得简单也没关系 🎨 长得像动画片 —— 界面可爱,小朋友会喜欢 🔒 隐私安全 —— 对话、语音、模型,全部在本地运行 🌏 没网也能玩 —— 录音、识别、合成、对话,全走本地流水线 🍎 目前仅支持 macOS,Windows 和 Linux 版本正在计划中,欢迎来帮忙!

Original
DTDesktop productivityDTDesktop appDTmacOS
—

claude MBTI skills:intj 去爹味,enfp 做设计

Opus 4.7 的中文回答普遍被吐槽爹味重,我的 Claude Code 插件把 16 种 MBTI 人格打包成 16 个 skill。 插件只改语气、推理习惯和决策默认值,不动 Claude 的工具、权限和安全行为。每个 skill 是一份 SKILL.md,结构公开。 对比截图: 同一个 AI 笔记 app 落地页 prompt,base 很朴素,ENTP 很显眼。 base: ENTP: 同一个 RL debug 问题,base 废话一堆,INTJ 直接交货。 base: INTJ:

Original
DTAgent extensionDTSkill / pluginDTClaude Code
—

openbee - 让 AI Agent 成为你的 7x24 数字员工

0x00 背景 AI Agent 的生态已经非常繁荣,在 skills 的加持下当前 Agent 的能力得到了极大的拓展,可以做的事情非常多了,此种背景下已经完全可以让 Agent 作为数字员工去完成企业日常的一些任务。 0x01 openbee 是一款 golang 开发的 agents 驱动平台。目前支持 claude / codex / kimi / pi 四个 agent。支持通过微信、企业微信、飞书、钉钉、Telegram 五个 IM 平台通信,通过聊天完成任务分配和进度追踪。 0x02 核心能力与亮点 双层调度架构 openbee 引入双层调度架构,如下: mermaid graph TD A["💬 IM Layer (Communication)\nLark / DingTalk / WeCom / WeChat / Telegram"] B["🧠 Scheduling Layer\nAI Agent"] B C["🤖 Execution Layer\nAI Agents"] C . "Reply Results" . A B . "Reply Results" . A 通过中央大脑 + 员工描述 完成任务分配指派,提升工作效率。 数字员工概念 openbee 引入数字员工概念,每个数字员工其实对应一个 agent 实例,每个数字员工可以自由设置 claude / codex / kimi / pi 作为底层驱动的 agent 且可以自由更换。按照少即是多的设计哲学,每个数字员工应当做最小集合的任务。 多 agent 支持 支持 claude / codex / kimi / pi 四个 agent 同时 agent 通过插件化拓展非常方便。 部署简易 openbee 是由 golang 开发,可直接编译二进制运行文件,可以运行在 amd64 / arm64 等架构平台。 文档: 通过下面命令一键安装: npm install g @theopenbee/cli

Original
DTData & operationsDTSoftware developmentDTAgent extension
—

悠然标签页 - 一款自用开源浏览器新标签页插件

官网: 这是一个开源的浏览器新标签页插件,支持 Chrome、Edge、Firefox 以及部分国产浏览器。它的目标不是做一个“功能堆满”的起始页,而是提供一个更干净、更耐看、同时又足够可定制的新标签页体验。 这个项目最初的起点很简单。我因为对默认浏览器体验不满意,连续试用了多款 Chromium 浏览器,最后发现它们各有优缺点,但没有一个真正符合我自己的使用习惯。比如,Arc 的设计很惊艳,但停止维护后,未来的不确定性太高;Yandex Browser 的界面和动画都不错,但中文翻译质量很差;Edge 性能不错,不过默认新标签页和部分 UI 细节让我始终不适应,DevTools 还会偶发卡死;Vivaldi 自定义能力很强,但我遇到了和 Tampermonkey 相关的稳定性问题;Brave 很重视隐私,却对开发者不太友好,一些 Web API 默认受限,调试体验不佳;Helium 足够轻,也足够干净,但缺少浏览器级密码自动填充,这对多账号开发场景并不方便。 折腾一圈后,我还是回到了 Chrome。但 Chrome 默认新标签页的站点图标在高分屏下显示比较糊,而且几乎没有什么可定制空间。与其继续忍受,不如自己做一个。 Youran Tab 目前提供多种风格主题,比如经典、便当、终端、极简、玻璃、气泡、像素、便签等,也支持背景切换、深色模式、自定义图标、站点导入导出和多语言。所有数据都保存在本地,不需要登录,也不收集用户信息。 最新版本还支持了直接将标签页组创建一个文件夹,这样就可以按照当前工作内容分类标签页,然后关闭标签页组,需要的时候一键打开,省内存也省了标签页区域的空间。 我做这个插件的思路,不是去替代浏览器本身,而是把“新标签页”重新变成一个真正高频、顺手、符合个人审美的入口。

Original
DTSoftware developmentDTSkill / pluginDTWeb
—

AskForPermission: Codex Computer Use的「权限申请」开源实现

CodeX Computer Use 在首次安装时会出现权限申请,系统设置窗口弹出来,一张引导卡从按钮位置沿着抛物线飞出,贴在设置窗口旁边;卡上露出宿主 app 的图标,拖进去就完成了授权。整个过程非常丝滑。 这个项目完全复刻了同样的效果: 已支持 点到点的模糊转场 可以随着系统设置框任意拖动 「上箭头」随着拖动的加速度弹性跳动 在开启「台前调度」的情况下依然支持 与 Computer Use 的不同之处: 增加至6种权限申请 动画转场用单个控件实现,Computer Use是两个控件在顶点切换透明度 「上箭头」的弹性跳动时机、幅度是自定义的 对系统设置框的位置判定是单独实现的,确保无论系统设置是「关闭」、「最小化」、「已开启」,都能正确计算终点位置。 开源协议: MIT

Original
DTCodex
—

三省六部幻觉:为什么"虚拟公司"式多Agent架构在工程上不成立

先说结论 如果你正在考虑把多个AI Agent分别命名为"产品经理"、"架构师"、"测试工程师",让它们像公司部门一样传递文档、协作完成任务——请停下来。 这个模式看起来很直觉,逻辑上似乎很合理,但它在工程上有根本性的缺陷。更重要的是,Anthropic、OpenAI、Google三家厂商在构建自己的Agent系统时,没有一家采用这个模式。 这不是巧合。 自己写的,期待点评

Original
DTSoftware developmentDTAgent orchestration
—

NewYouGo - 免费 AI 图片、视频和音乐生成平台

网站名称:NewYouGo 网站地址: 网站简介:一个面向创作者的 AI 生成 SaaS 平台,集合图片、视频、音乐三类模型,支持文本生图、图像编辑、LoRA 风格控制、短视频生成等。 主要特点: 1. 提供图片、视频、音乐多模型入口,适合一站式创作。 2. 首页提供免费体验入口,适合先试用再决定是否深入使用。 3. 支持 FLUX、Kling、Seedance、Nano Banana 等多个热门模型。 4. 模型页和生成器入口整理得比较清晰,适合内容创作者和独立开发者快速上手。 适合人群:内容创作者、营销团队、AI 设计探索者。 如果选题方向合适,欢迎收录。

Original
DTContent creationDTBusiness & growthDTWeb app
—

Mac Übersicht桌面英语单词卡片

Daily English Word 一个 macOS 桌面小组件,基于 Übersicht 运行,每次刷新随机展示一个英语单词及中文释义。 主题 | Default Dark | Light Minimal | Material Design | |::|::|::| | | | | | Glass Morphism | Vintage Paper | Pastel Dream | |::|::|::| | | | | 功能 7 套内置词库(初中到 SAT,每套 3,200 到 13,400 词) 点击喇叭图标,macOS say 命令朗读单词发音 一键收藏/取消收藏 7 天去重,同一个词一周内不会重复出现 7 种配色主题 + random 模式,每次刷新随机切换 9 个屏幕位置可选 刷新间隔自由设置,从秒到天都行 切换单词时带淡入淡出动画 环境要求 macOS Übersicht 释义用词性缩写(n.、v.、adj.、adv. 等)加中文含义,比如: persistent adj. 坚持的,不屈不挠的;持续不断的;反复出现的 要添加自定义词库,把 .txt 文件放到 wordlist/ 目录,然后在 main.coffee 里加一条对应的 case 分支。

Original
DTResearch & learningDTContent / resourceDTmacOS
—

Undertale Text Box Generator:像素级还原《传说之下》对话框生成器

做了一个 100% 还原《传说之下 (Undertale)》风格的对话框生成器。 核心特性: 像素级还原: 完美适配原版字体(Determination Mono 等)、间距以及经典的黑白边框。 动态表情包: 内置了 Sans, Papyrus, Toriel 等全员头像,支持自定义上传。 纯前端实现: 响应式设计,无需注册,即开即用,生成的图片支持一键下载。 动画支持:支持生成带打字机效果的 GIF。

Original
—

Crossclimb Today:LinkedIn 每日文字挑战

LinkedIn 推出的游戏频道(尤其是 Crossclimb)在海外职场圈非常火,但由于阶梯词汇(Word Ladder)对词汇量和逻辑要求较高,不少玩家会卡在最后一步。 我做了这个每日更新的辅助站点:Crossclimbtoday.online 项目初衷: 对 LinkedIn Crossclimb 攻略的需求,帮助大家保持每日连胜记录。 核心功能: 每日答案实时更新: 每天同步更新 LinkedIn Crossclimb 的最新谜题答案。 解题思路拆解: 不仅仅给答案,还通过阶梯逻辑展示单词如何变换,帮助提升词汇量。 历史存档: 整理往期题目,方便错过的玩家进行复盘或练习。

Original
DTLifestyle & entertainment
—

EventPulse:Agent 把同一事件的新闻整理成一条时间线,帮你追新闻后续,新闻有进展直接推送邮箱

完整介绍: 平时看新闻,经常会遇到一个问题:一件事刚发生的时候,到处都是报道; 过了几天再想看后续,却很难把前因后果和最新进展串起来。 EventPulse 就是为这个场景做的。 它会持续收集同一事件的相关新闻,用 AI 做归类整理,再按时间顺序生成一条时间线。 打开一个事件页面,看到的不是一堆零散标题,而是这件事从发生、发酵到后续进展的脉络。 目前主要有 4 个功能: 聚合多个新闻源,把同一事件的报道整理到一起 用时间线展示事件发展过程,方便快速补全上下文 支持邮箱订阅,不需要单独注册,事件有新进展时会自动提醒 支持生成分享海报,别人扫码后可以直接查看完整脉络 我做这个工具的出发点很简单:很多时候,我们不是想多看几条新闻,而是想把一件事真正跟完。 现在的大多数新闻产品更擅长分发信息,但不太擅长持续追踪同一个事件。这个工具就是想补上这一步。 如果你平时会持续关注新闻、行业动态,或者需要梳理某个议题的发展过程,这个工具应该会比较对路。 截图

Original
DTAgent extension
—

new game

Project URL Https/ ismail.com Category Python Project Title Https/ ismail.com Project Https/ ismail.com Highlights import pygame import random import sys 1. Setup pygame.init() info = pygame.display.Info() WIDTH = info.currentw HEIGHT = info.currenth screen = pygame.display.setmode((WIDTH, HEIGHT)) Rang (Colors) WOODBROWN = (150, 75, 0) SKYBLUE = (15, 15, 30) BALLCOLORS = [(255, 0, 0), (0, 255, 0), (0, 0, 255), (255, 255, 0)] WHITE = (255, 255, 255) Fonts font = pygame.font.SysFont("Arial", 60, bold=True) smallfont = pygame.font.SysFont("Arial", 45) Game Variables paddlew, paddleh = 250, 45 Yahan change kiya hai: HEIGHT 300 takki paddle screen ke upar dikhe paddley = HEIGHT 300 def createball(): return { 'x': random.randint(50, WIDTH 50), 'y': random.randint(600, 100), 'speed': random.randint(7, 12), 'color': random.choice(BALLCOLORS), 'radius': 25 } def resetgame(): return { 'paddlex': WIDTH // 2 (paddlew // 2), 'balls': [createball() for in range(4)], 'score': 0, 'lives': 5, 'gameover': False } g = resetgame() clock = pygame.time.Clock() Main Loop while True: screen.fill(SKYBLUE) for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() sys.exit() Finger touch/drag control if event.type == pygame.MOUSEMOTION and not g['gameover']: g['paddlex'] = event.pos[0] (paddlew // 2) Restart logic if event.type == pygame.MOUSEBUTTONDOWN and g['gameover']: g = resetgame() if not g['gameover']: 1. Paddle (Lakdi) ka Rect paddlerect = pygame.Rect(g['paddlex'], paddley, paddlew, paddleh) 2. Balls Logic for ball in g['balls']: ball['y'] += ball['speed'] ballrect = pygame.Rect(ball['x'] ball['radius'], ball['y'] ball['radius'], ball['radius']2, ball['radius']2) Collision: Jab ball lakdi se takraye if paddlerect.colliderect(ballrect): ball['y'] = 50 ball['x'] = random.randint(50, WIDTH 50) g['score'] += 1 ball['speed'] += 0.3 Miss: Jab ball niche nikal jaye if ball['y'] HEIGHT: g['lives'] = 1 ball['y'] = 100 ball['x'] = random.randint(50, WIDTH 50) if g['lives'] <= 0: g['gameover'] = True Drawing 1. Lakdi (Paddle) Iska position fix kiya hai pygame.draw.rect(screen, WOODBROWN, (g['paddlex'], paddley, paddlew, paddleh), borderradius=8) Lakdi ki design lines pygame.draw.line(screen, (80, 40, 0), (g['paddlex'], paddley + 15), (g['paddlex'] + paddlew, paddley + 15), 4) 2. Balls for ball in g['balls']: pygame.draw.circle(screen, ball['color'], (ball['x'], int(ball['y'])), ball['radius']) 3. UI scoretxt = smallfont.render(f"Score: {g['score']}", True, WHITE) livestxt = smallfont.render(f"Lives: {g['lives']}", True, (255, 50, 50)) screen.blit(scoretxt, (50, 70)) screen.blit(livestxt, (WIDTH 250, 70)) else: Game Over Screen msg = font.render("GAME OVER", True, (255, 0, 0)) sc = smallfont.render(f"Score: {g['score']}", True, WHITE) retry = smallfont.render("Tap to Restart", True, WOODBROWN) screen.blit(msg, (WIDTH // 2 180, HEIGHT // 2 100)) screen.blit(sc, (WIDTH // 2 100, HEIGHT // 2)) screen.blit(retry, (WIDTH // 2 140, HEIGHT // 2 + 100)) pygame.display.update() clock.tick(60) Https/ ismail.com Example Code markdown import pygame import random import sys 1. Setup pygame.init() info = pygame.display.Info() WIDTH = info.currentw HEIGHT = info.currenth screen = pygame.display.setmode((WIDTH, HEIGHT)) Rang (Colors) WOODBROWN = (150, 75, 0) SKYBLUE = (15, 15, 30) BALLCOLORS = [(255, 0, 0), (0, 255, 0), (0, 0, 255), (255, 255, 0)] WHITE = (255, 255, 255) Fonts font = pygame.font.SysFont("Arial", 60, bold=True) smallfont = pygame.font.SysFont("Arial", 45) Game Variables paddlew, paddleh = 250, 45 Yahan change kiya hai: HEIGHT 300 takki paddle screen ke upar dikhe paddley = HEIGHT 300 def createball(): return { 'x': random.randint(50, WIDTH 50), 'y': random.randint(600, 100), 'speed': random.randint(7, 12), 'color': random.choice(BALLCOLORS), 'radius': 25 } def resetgame(): return { 'paddlex': WIDTH // 2 (paddlew // 2), 'balls': [createball() for in range(4)], 'score': 0, 'lives': 5, 'gameover': False } g = resetgame() clock = pygame.time.Clock() Main Loop while True: screen.fill(SKYBLUE) for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() sys.exit() Finger touch/drag control if event.type == pygame.MOUSEMOTION and not g['gameover']: g['paddlex'] = event.pos[0] (paddlew // 2) Restart logic if event.type == pygame.MOUSEBUTTONDOWN and g['gameover']: g = resetgame() if not g['gameover']: 1. Paddle (Lakdi) ka Rect paddlerect = pygame.Rect(g['paddlex'], paddley, paddlew, paddleh) 2. Balls Logic for ball in g['balls']: ball['y'] += ball['speed'] ballrect = pygame.Rect(ball['x'] ball['radius'], ball['y'] ball['radius'], ball['radius']2, ball['radius']2) Collision: Jab ball lakdi se takraye if paddlerect.colliderect(ballrect): ball['y'] = 50 ball['x'] = random.randint(50, WIDTH 50) g['score'] += 1 ball['speed'] += 0.3 Miss: Jab ball niche nikal jaye if ball['y'] HEIGHT: g['lives'] = 1 ball['y'] = 100 ball['x'] = random.randint(50, WIDTH 50) if g['lives'] <= 0: g['gameover'] = True Drawing 1. Lakdi (Paddle) Iska position fix kiya hai pygame.draw.rect(screen, WOODBROWN, (g['paddlex'], paddley, paddlew, paddleh), borderradius=8) Lakdi ki design lines pygame.draw.line(screen, (80, 40, 0), (g['paddlex'], paddley + 15), (g['paddlex'] + paddlew, paddley + 15), 4) 2. Balls for ball in g['balls']: pygame.draw.circle(screen, ball['color'], (ball['x'], int(ball['y'])), ball['radius']) 3. UI scoretxt = smallfont.render(f"Score: {g['score']}", True, WHITE) livestxt = smallfont.render(f"Lives: {g['lives']}", True, (255, 50, 50)) screen.blit(scoretxt, (50, 70)) screen.blit(livestxt, (WIDTH 250, 70)) else: Game Over Screen msg = font.render("GAME OVER", True, (255, 0, 0)) sc = smallfont.render(f"Score: {g['score']}", True, WHITE) retry = smallfont.render("Tap to Restart", True, WOODBROWN) screen.blit(msg, (WIDTH // 2 180, HEIGHT // 2 100)) screen.blit(sc, (WIDTH // 2 100, HEIGHT // 2)) screen.blit(retry, (WIDTH // 2 140, HEIGHT // 2 + 100)) pygame.display.update() clock.tick(60) Https/ ismail.com or Videos

DTLifestyle & entertainment
—

VibeLevel AI

Vibe Coding Skills & Talent Platform - Build to Hire

DTSoftware developmentDTSkill / plugin
—

aiCoChef

Smarter Food Decisions, Personalized to You

DTLifestyle & entertainmentDTContent / resource
—

Ona AI

Building digital sign language avatars & inclusive datasets.

DTResearch & learning
—

Talisman

Fill Your Calendar With Qualified Sales Calls AI Sales Rep

DTBusiness & growth
—

Silex

Swiss legal AI, built by lawyers for lawyers

DTResearch & learningDTData & operations
—

DEV TRENDS / COMMUNITY

Discuss this edition

Sign in with GitHub to share a thought, question, or useful follow-up.

Open discussions ↗