基于ESP32的手持PONG游戏机DIY:从硬件选型到代码实战
1. 从像素到掌心的复古之旅为什么我们要再造一台“手持PONG”如果你对电子游戏的历史稍有了解就一定会知道“PONG”这个名字。它不像今天的3A大作那样拥有宏大的世界观和电影级的画面它简单到极致两个光点代表球拍一个移动的方块代表球目标就是把球打回去。然而正是这个1972年由雅达利Atari推出的街机游戏点燃了电子游戏产业的燎原之火被公认为现代电子游戏的鼻祖之一。今天我们谈论的不是在模拟器里运行它也不是在复古主机上体验它而是亲手打造一台可以握在掌心、随时随地开一局的“手持PONG游戏机”。这听起来像是一个极客的怀旧玩具但它的意义远不止于此。对于硬件爱好者来说这是一个绝佳的入门项目它涵盖了从微控制器编程、基础电路设计、到人机交互按钮、屏幕的完整闭环。你不需要复杂的3D图形库不需要处理网络协议核心逻辑就是让一个“点”在屏幕上按照物理规则反弹并响应玩家的输入。这个过程能让你深刻理解“游戏循环”、“状态机”、“输入检测”这些游戏开发乃至嵌入式开发的核心概念。对于复古游戏文化的爱好者而言拥有一台自己制作的、独一无二的实体设备其满足感远超在软件层面模拟。当那熟悉的“嘀嘀”声从你自己焊接的蜂鸣器中发出当像素点在你挑选的屏幕上跳动时你连接的不只是一段代码更是一段鲜活的历史。所以这篇内容就是一次完整的手持PONG游戏机DIY实录。我会带你从零开始完成从元器件选型、电路设计、代码编写到外壳组装的全过程。这不是一个“仅供参考”的理论方案而是一份可以“抄作业”的实战指南里面会包含我踩过的坑、做出的取舍以及最终验证可行的方案。无论你是想重温经典还是想踏入嵌入式开发的大门这台掌中的“乒乓”都将是一个完美的起点。2. 核心元器件选型在复古感与现代易用性之间找到平衡打造一台手持设备选型是第一步也是最关键的一步。它决定了项目的成本、复杂度、最终体验甚至成败。我们的目标是在保留PONG原始像素风格和操作感的同时利用现代易得的元器件降低制作门槛。2.1 大脑微控制器的抉择这是整个设备的“CPU”。我们有多个选择但核心考量是足够的计算性能驱动屏幕和处理输入、足够的内存、丰富的GPIO通用输入输出接口以及良好的社区支持和开发环境。经典之选ATmega328PArduino Uno核心。这是很多入门项目的首选资源丰富教程遍地。但对于驱动一个哪怕是小尺寸的彩色屏幕其16MHz的主频和2KB的RAM会显得非常吃力需要极其精简的代码和专门的优化库不适合新手直接上手图形项目。性能甜点ESP32系列。这是我最终的选择也是强烈推荐的选择。理由如下双核处理器与高主频通常为240MHz处理简单的图形和逻辑游刃有余。充足的存储通常内置4MB的Flash用于存储程序和520KB的SRAM运行内存足以容纳我们的游戏代码、图形库和帧缓冲区。丰富的GPIO与硬件外设可以轻松连接屏幕、按钮、蜂鸣器甚至未来可以扩展蓝牙手柄或Wi-Fi分数上传虽然我们PONG用不到。完善的生态系统基于Arduino框架或ESP-IDF开发有大量成熟的显示屏驱动库如TFT_eSPI极大简化了开发。内置Wi-Fi/蓝牙虽然本项目不用但为未来升级比如双人对战留下了可能。注意ESP32型号众多对于本项目选择最基础的ESP32 DevKit C V4或NodeMCU-32S即可它们价格便宜引脚引出方便。2.2 眼睛显示屏的挑选屏幕是呈现游戏画面的窗口。为了追求复古感和便携性我们有几个方向单色OLED128x64极具复古感对比度高省电。但尺寸较小且只能显示黑白或单色无法还原早期街机PONG那种绿色或橙色的荧光效果。适合追求极致复古和低功耗的极简项目。彩色TFT LCDIPS这是我推荐的方案。选择一块1.8英寸或2.0英寸的IPS屏幕分辨率在160x128或240x320即可。IPS屏幕可视角度好色彩鲜艳。我们可以通过编程让屏幕显示为单色如深绿背景、亮绿球拍和球来模拟复古CRT显示器的感觉同时又保留了未来显示彩色元素的可能性。驱动这类屏幕通常使用SPI接口只需要占用ESP32的4-5个引脚接线简单。最终选择我使用了2.0英寸 IPS TFT屏分辨率240x320驱动芯片为ST7789通过SPI接口连接。它在显示像素风格图形时非常清晰并且有成熟的TFT_eSPI库支持。2.3 手脚输入与反馈装置输入按钮与摇杆。PONG只需要两个方向上/下控制每个球拍。使用摇杆固然酷但成本高、占用空间大。最简单的方案是使用4个轻触开关每两个为一组上、下分别控制左右球拍。为了更好的手感可以选择带帽的6x6mm微动开关。我们需要4个按钮加上一个额外的“开始/重置”按钮总共5个。反馈蜂鸣器。游戏音效是灵魂PONG经典的击球声“嘀”和得分声“嘟”必须还原。我们需要一个无源蜂鸣器注意是有源还是无源无源的需要通过PWM产生不同频率的声音可控性强。ESP32的PWM功能可以轻松驱动它模拟出各种简单的音效。能源电池与供电。既然是手持设备移动电源是必须的。最方便的方案是使用一块3.7V锂电池如常见的104050或更大容量的型号配合一个TP4056充电/升压一体模块。这个模块可以给锂电池充电并能将电池的3.7V稳定升压到5V为ESP32和屏幕供电。务必选择带充放电保护功能的模块安全第一。2.4 骨架与皮肤PCB与外壳对于初次尝试万能板洞洞板加飞线焊接是完全可行的能让你深刻理解电路连接。但如果你想得到一个更整洁、可靠的作品设计一块简单的PCB是值得的。使用KiCad或EasyEDA这类免费工具将ESP32、屏幕接口、按钮、蜂鸣器、电池接口的线路整合到一块板子上不仅能减少飞线还能提高稳定性。外壳是赋予项目“产品感”的最后一步。你可以使用3D打印。自己用Fusion 360或Tinkercad设计一个符合内部元件尺寸、留有按钮孔和屏幕开口的外壳。材料建议使用PLA强度足够。如果不想自己设计也可以在开源社区如Thingiverse搜索“Handheld Game Console”看看有没有接近的模型可以修改。3. 电路连接与硬件搭建从原理图到实体选好元器件后我们需要将它们正确地连接起来。下面是一个基于ESP32 DevKit C V4和SPI TFT屏的核心连接示意图实际引脚可根据你的开发板型号调整元件引脚/功能连接到ESP32引脚备注TFT屏VCC5V来自TP4056升压模块的5V输出TFT屏GNDGND公共地线TFT屏SCL (时钟)GPIO 18SPI时钟线TFT屏SDA (数据)GPIO 23SPI数据线MOSITFT屏RESET (复位)GPIO 4可接也可接固定电平TFT屏DC (数据/命令)GPIO 2区分发送的是数据还是命令TFT屏CS (片选)GPIO 5SPI片选低电平有效按钮1 (左拍上)一端GPIO 32另一端接GND使用内部上拉电阻按钮2 (左拍下)一端GPIO 33另一端接GND按钮3 (右拍上)一端GPIO 25另一端接GND按钮4 (右拍下)一端GPIO 26另一端接GND按钮5 (开始/重置)一端GPIO 27另一端接GND无源蜂鸣器正极GPIO 13通过一个100Ω电阻连接更安全无源蜂鸣器负极GNDTP4056模块BAT锂电池正极TP4056模块BAT-锂电池负极TP4056模块OUTESP32 Vin / 5V为整个系统供电TP4056模块OUT-GND系统公共地硬件搭建步骤与避坑指南先测试后集成不要一开始就把所有东西焊死。先用杜邦线连接ESP32和屏幕运行一个简单的显示测试程序如TFT_eSPI库中的例程确保屏幕能正常工作。同样单独测试每个按钮和蜂鸣器。电源管理是关键TP4056模块的5V输出能力通常为1A左右驱动ESP32和一块小屏幕绰绰有余。务必确保所有元件的GND地线都连接在一起形成一个共同的参考点否则会出现不可预知的问题。按钮接线我们采用“上拉输入”模式。将按钮一端接ESP32的GPIO引脚另一端接GND。在代码中将该引脚设置为INPUT_PULLUP。当按钮未按下时引脚被内部电阻上拉至高电平1按下时引脚被短接到GND变为低电平0。这种接法省去了外部电阻。蜂鸣器限流虽然ESP32引脚可以直接驱动无源蜂鸣器但串联一个100-220Ω的电阻可以限制电流保护GPIO口和蜂鸣器这是一个好习惯。焊接与布局如果使用洞洞板规划好元件布局尽量使走线简短。电源线5V和GND可以走得粗一些。焊接完成后用万用表通断档检查是否有短路或虚焊。4. 软件核心用代码复活PONG的灵魂硬件是躯体软件是灵魂。我们将使用Arduino IDE进行开发因为它对ESP32和TFT_eSPI库的支持非常好且易于上手。4.1 环境配置与库安装安装Arduino IDE。在“文件”-“首选项”的“附加开发板管理器网址”中添加ESP32的板支持网址https://espressif.github.io/arduino-esp32/package_esp32_index.json。打开“工具”-“开发板”-“开发板管理器”搜索“esp32”安装“Espressif Systems”的ESP32平台。安装TFT_eSPI库。在“项目”-“加载库”-“管理库”中搜索并安装。关键一步配置TFT_eSPI库。找到Arduino安装目录下的libraries/TFT_eSPI/User_Setups文件夹复制Setup24_ST7789.h这样的模板文件根据你的屏幕驱动芯片将其重命名如MyHandheldPONG.h并替换到libraries/TFT_eSPI/User_Setup.h的位置或直接修改User_Setup.h。在这个文件里你需要根据之前的连接表正确设置TFT_CS,TFT_DC,TFT_RST,TFT_MOSI,TFT_SCLK等引脚号以及屏幕的宽度和高度。4.2 游戏逻辑与状态机PONG的游戏逻辑非常清晰我们可以将其分解为几个状态并用一个状态机来管理MENU等待开始状态显示标题和操作提示。PLAYING游戏进行中状态这是核心。SCORE得分后暂停状态显示得分方短暂延迟后继续。GAME_OVER一方达到胜利分数如11分显示胜利者等待重置。在PLAYING状态每一帧一次游戏循环需要做以下几件事读取输入扫描5个按钮的状态更新左右球拍的目标位置。更新球拍位置根据输入以恒定速度移动左右球拍的Y坐标并确保它们不超出屏幕上下边界。更新球的位置与速度球的位置 球的位置 球的速度。碰撞检测与上下边界碰撞球的速度Y分量反向。与球拍碰撞这是一个核心技巧。简单的做法是当球的X坐标碰到球拍X范围且球的Y坐标在球拍Y范围内时判定为击中。此时将球的速度X分量反向并根据球击中球拍的位置微调速度Y分量。例如击中球拍顶部给球一个向上的Y速度分量击中底部则向下。这能增加游戏的策略性而不是简单的直线反弹。得分判定如果球的X坐标超出屏幕左或右边界则对方得分。进入SCORE状态。渲染画面清除上一帧的画面或使用局部更新优化。绘制中间的分隔虚线。绘制两个球拍两个短矩形。绘制球一个小方块或圆形。绘制当前比分。播放音效在检测到碰撞或得分时通过tone()函数或更精确的LEDC PWM函数让蜂鸣器发出特定频率和时长的声音。4.3 代码结构示例与核心片段以下是精简后的核心代码框架展示了游戏循环和碰撞检测的逻辑#include TFT_eSPI.h TFT_eSPI tft TFT_eSPI(); // 引脚定义 #define BTN_LEFT_UP 32 #define BTN_LEFT_DOWN 33 // ... 其他按钮定义 #define BUZZER_PIN 13 // 游戏变量 int ballX, ballY; float ballSpeedX, ballSpeedY; int leftPaddleY, rightPaddleY; const int PADDLE_HEIGHT 20; const int PADDLE_WIDTH 4; int scoreLeft 0, scoreRight 0; enum GameState { MENU, PLAYING, SCORE, GAME_OVER }; GameState state MENU; void setup() { Serial.begin(115200); tft.init(); tft.setRotation(1); // 根据屏幕方向调整 tft.fillScreen(TFT_BLACK); // 初始化按钮引脚为上拉输入模式 pinMode(BTN_LEFT_UP, INPUT_PULLUP); // ... 初始化其他按钮 pinMode(BUZZER_PIN, OUTPUT); // 初始化游戏对象位置 resetGame(); } void loop() { switch(state) { case MENU: drawMenu(); if (isStartPressed()) { state PLAYING; tft.fillScreen(TFT_BLACK); } break; case PLAYING: // 1. 读取输入 readInputs(); // 2. 更新球拍 updatePaddles(); // 3. 更新球 ballX ballSpeedX; ballY ballSpeedY; // 上下边界碰撞 if (ballY 0 || ballY tft.height() - 1) { ballSpeedY -ballSpeedY; playBounceSound(); } // 与左球拍碰撞检测 if (ballX PADDLE_WIDTH ballX 0 ballY leftPaddleY ballY leftPaddleY PADDLE_HEIGHT) { ballSpeedX abs(ballSpeedX); // 确保向右 // 增加基于击中点的Y速度微调 float hitPos (ballY - leftPaddleY) / (float)PADDLE_HEIGHT; ballSpeedY (hitPos - 0.5) * 5.0; // 示例算法 playBounceSound(); } // 与右球拍碰撞检测类似逻辑 // ... // 4. 得分判定 if (ballX 0) { scoreRight; state SCORE; playScoreSound(); } else if (ballX tft.width()) { scoreLeft; state SCORE; playScoreSound(); } // 5. 渲染 drawGame(); break; case SCORE: drawScore(); delay(1500); // 短暂暂停 resetBall(); // 重置球到中心随机发球方向 state PLAYING; break; case GAME_OVER: drawGameOver(); if (isResetPressed()) { resetGame(); state MENU; } break; } delay(16); // 控制帧率约60FPS } // 其他函数readInputs, updatePaddles, drawGame, playSound等需要自行实现代码层面的避坑经验避免屏幕闪烁tft.fillScreen()会清除整个屏幕如果每帧都调用会导致严重闪烁。优化方法是只重绘发生变化的部分球和球拍的旧位置和新位置或者使用双缓冲区如果库支持。对于PONG这种移动元素少的游戏局部重绘是可行的。按钮消抖机械按钮在按下和释放的瞬间会产生物理抖动导致单片机误判为多次按下。必须在代码中实现消抖。简单的软件消抖可以在检测到按下后延迟10-50毫秒再次读取引脚状态如果仍然是按下才确认为有效按键。音效的非阻塞播放使用tone()函数播放音效时它会阻塞程序直到声音播放完毕。这会导致游戏卡顿。更好的方法是使用状态机管理音效记录音效开始时间在loop()中检查持续时间时间到了就停止这样游戏循环就不会被阻塞。5. 调试、优化与外壳总装当代码基本功能实现后就进入了调试和打磨阶段。串口调试是你的好朋友大量使用Serial.print()输出变量值如球坐标、速度、按钮状态这能帮你快速定位逻辑错误。调整游戏参数球的速度、球拍的速度、碰撞反弹的算法、得分上限等这些参数直接影响游戏手感。多试几次找到你觉得最有趣、最平衡的一组值。功耗优化如果你的设备续航不理想可以考虑优化。在MENU或GAME_OVER状态长时间无操作时可以调低屏幕亮度如果屏幕支持甚至让ESP32进入深度睡眠模式通过按钮中断唤醒。总装与测试将调试好的主板、屏幕、电池等所有部件小心地安装进3D打印的外壳。确保按钮按压顺畅屏幕显示无遮挡。拧紧螺丝一台完整的手持PONG游戏机就诞生了。最后开机和你的朋友来一局。当那纯粹的像素在掌间跳动当简洁的电子音效响起你会感受到这份亲手将数字历史转化为物理实体的成就感远比通关任何一个复杂游戏都要来得深刻和直接。这台小设备不仅是一个玩具更是一个通往硬件世界和游戏设计初心的门户。

相关新闻

从D-LOG2灰片到电影感旅拍:6款LUT实战调色指南

从D-LOG2灰片到电影感旅拍:6款LUT实战调色指南

在实际使用 DJI Pocket 4P 这类便携相机进行旅拍创作时,很多用户会发现,直接拍摄的素材色彩平淡、动态范围有限,尤其在复杂光线下,难以直接获得理想的电影感画面。这时,启用相机内置的 D-LOG2 色彩模式进行拍摄&#x…

2026/8/19 2:28:47 阅读更多 →
AI项目部署实战:从环境准备到批量集成的全流程指南

AI项目部署实战:从环境准备到批量集成的全流程指南

这次我们来看一个名为“中际旭创”的项目。从名称上看,它可能是一个涉及AI、自动化或特定技术解决方案的实体或工具集。在技术领域,这类项目通常聚焦于解决特定场景下的效率或智能化问题,例如自动化流程、数据处理、模型部署或软硬件集成。对…

2026/8/19 2:28:47 阅读更多 →
程序化生成与动态交互:构建“变异公路”的数字生命系统

程序化生成与动态交互:构建“变异公路”的数字生命系统

1. 项目概述:当“公路”成为数字世界的“变异体”“Mutant Road”,直译过来是“变异公路”。乍一听,这个名字充满了赛博朋克式的想象空间,仿佛一条在数据洪流中扭曲、生长、不断自我进化的道路。在数字创作、游戏开发、虚拟世界构…

2026/8/19 2:28:47 阅读更多 →

最新新闻

基于Raspberry Pi Pico与W5100S的智能诗歌时钟:硬件选型与MicroPython开发全解析

基于Raspberry Pi Pico与W5100S的智能诗歌时钟:硬件选型与MicroPython开发全解析

1. 项目缘起:当复古时钟遇见AI诗魂几年前,我在一个旧货市场淘到了一个老式挂钟的机芯和表盘,一直想把它改造成一个有点特别的东西。一个只会走时的钟,在今天看来已经有些乏味了。我想要的,是一个能讲故事、能带来一点意…

2026/8/19 2:58:05 阅读更多 →
基于Raspberry Pi Pico与ChatGPT API的AI创意时钟项目实践

基于Raspberry Pi Pico与ChatGPT API的AI创意时钟项目实践

1. 项目概述:当硬件时钟遇见AI诗意最近在捣鼓Raspberry Pi Pico的时候,我一直在想,能不能让这个小小的微控制器做点更有“温度”的事情,而不是仅仅控制个LED或者读取个传感器。一个普通的电子时钟,显示时间谁都会做&am…

2026/8/19 2:58:05 阅读更多 →
树莓派Pico通过W5500实现以太网连接:CircuitPython驱动与实战指南

树莓派Pico通过W5500实现以太网连接:CircuitPython驱动与实战指南

1. 项目缘起:为什么要在Pico上折腾以太网? 如果你玩过树莓派Pico,大概率会和我有同样的感受:这玩意儿性能不错、价格便宜、社区活跃,但缺个网络功能,总让人觉得少了点什么。无论是想做个远程传感器数据上报…

2026/8/19 2:58:05 阅读更多 →
ESP32智能家居开发:Alexa语音控制与OTA无线升级实战指南

ESP32智能家居开发:Alexa语音控制与OTA无线升级实战指南

1. 项目概述:当ESP32遇上Alexa与OTA,智能家居开发的新范式如果你玩过ESP32,大概率会用它连个Wi-Fi、采集个传感器数据,或者做个简单的Web服务器。但有没有想过,把这块性价比极高的芯片,直接变成一个能听懂人…

2026/8/19 2:58:05 阅读更多 →
ESP8266驱动OLED实现拟人化眨眼动画:硬件编程与创意交互实践

ESP8266驱动OLED实现拟人化眨眼动画:硬件编程与创意交互实践

1. 项目缘起:为什么要在OLED上做一双“会眨眼”的机器人眼睛?几年前,我在做一个桌面小机器人项目时,遇到了一个挺有意思的问题:如何用最低的成本和最简单的硬件,给机器人一个能表达“情绪”或“状态”的交互…

2026/8/19 2:58:05 阅读更多 →
基于BC547三极管的共射极音频放大器:从原理到实践

基于BC547三极管的共射极音频放大器:从原理到实践

1. 从零开始:为什么选择BC547搭建基础音频放大器?如果你对电子制作感兴趣,想亲手做一个能“出声”的小玩意儿,那么用一颗BC547三极管搭建一个简单的音频放大器,绝对是一个经典且完美的入门项目。这听起来可能有点“复古…

2026/8/19 2:57:05 阅读更多 →

日新闻

【单片机课程设计/毕业设计】基于 STM32 与 WiFi 模块的室内通风智能管控系统设计 基于 STM32 的人体存在感知自适应风扇控制系统设计(018503)

【单片机课程设计/毕业设计】基于 STM32 与 WiFi 模块的室内通风智能管控系统设计 基于 STM32 的人体存在感知自适应风扇控制系统设计(018503)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于嵌入式单片机,Java、小程序技术领域和毕业项目实战 ✌️…

2026/8/19 0:00:30 阅读更多 →
AI如何驱动数学猜想生成:从大语言模型到自动化数学发现

AI如何驱动数学猜想生成:从大语言模型到自动化数学发现

1. 项目概述:当AI开始“猜”数学定理 最近在AI研究圈里,一个名为“Moonshine”的项目引起了不小的讨论。这名字本身就挺有意思,直译是“月光”,但在数学史上,它特指一个神秘而美丽的联系——魔群月光猜想,连…

2026/8/19 0:00:30 阅读更多 →
WarcraftHelper 魔兽争霸3优化实战指南

WarcraftHelper 魔兽争霸3优化实战指南

WarcraftHelper 魔兽争霸3优化实战指南 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 一台刚配的新电脑,跑《魔兽争霸3》却卡成 PPT——这…

2026/8/19 0:02:31 阅读更多 →

周新闻

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

如果你是一名开发者,最近可能已经感受到了AI大模型正在从“玩具”变成“生产力工具”的强烈信号。从代码补全到智能Agent,从本地部署到云端API,我们正处在一个技术栈快速重构的节点。然而,面对层出不穷的模型、框架和工具&#xf…

2026/8/18 9:15:35 阅读更多 →
工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

第四篇:反射——高频能量撞墙之后会发生什么? —— 你以为信号已经过去了,其实它正在回来打你 老Q的现场笔记 第五季,我们正式进入工业神经系统层。这里不再是单个设备的战斗,而是整个工厂“经脉”层面的秩序之战。从这一篇开始,你将第一次看清:看似简单的信号传播,背…

2026/8/18 9:06:28 阅读更多 →
【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

2026/8/18 9:04:56 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/17 18:54:37 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/17 18:55:16 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/17 18:55:55 阅读更多 →