1. 项目缘起从传统军棋到智能桌游的跃迁军棋这款承载着许多人童年记忆的策略棋类游戏其魅力在于对弈双方在“暗棋”规则下的心理博弈与战术推演。然而传统的军棋对弈存在一个固有的痛点需要一个公正的第三方裁判来判定棋子相遇时的胜负。这不仅限制了游戏的灵活性也让两人对弈变得不那么纯粹。几年前我在一次朋友聚会中大家想下军棋却苦于找不到裁判这个场景让我萌生了一个想法能不能用技术手段让棋盘自己当裁判这个想法就是“智能军棋”项目的起点。我的目标很明确制作一个物理棋盘当双方棋子移动到同一位置时棋盘能自动、无声地完成大小判定并仅向获胜方显示结果失败方的棋子则被“吃掉”并移出棋盘整个过程无需任何人工干预。这听起来像是一个复杂的嵌入式系统项目但核心逻辑其实非常清晰。经过一番技术选型我最终锁定了Arduino平台。原因很简单Arduino拥有极其丰富的传感器和通信模块生态其开发环境对电子爱好者非常友好社区支持强大能让我快速将想法原型化。这个项目不仅是对传统游戏的现代化改造更是一次融合了传感器技术、无线通信和嵌入式逻辑控制的综合性实践。2. 系统架构设计与核心组件选型要实现“自动裁判”功能整个系统需要解决三个核心问题棋子身份识别、棋子位置感知和胜负判定与执行。围绕这三个问题我设计了如下的系统架构。2.1 棋盘感知层如何让棋盘“看见”棋子棋盘需要知道每个格子上放着什么棋子。我评估了几种方案RFID方案每个棋子底部嵌入RFID标签棋盘每个格子下方安装RFID读卡器。优点是识别准确、非接触。但成本极高一个棋盘90个格子就需要90个读卡器布线复杂被首先排除。电阻网络方案为每个棋子设定不同的电阻值通过棋盘格子的触点读取电阻来识别。电路相对简单但触点容易氧化可靠性一般且棋子制作复杂。矩阵式触点编码方案这是最终采用的方案。其核心思想是为每一类棋子分配一个唯一的二进制ID通过棋子底部的多个导电触点与棋盘格子上对应的弹簧针接触形成一个电路回路由主控读取电平状态从而解码出棋子ID。具体实现如下棋子编码军棋共有12种棋子司令、军、师、旅、团、营、连、排、工兵、地雷、炸弹、军旗加上红蓝双方共24类。5位二进制数2^532足以编码。我在棋子底部设计了5个圆形铜箔作为数据触点D0-D41个作为公共地线触点GND。棋盘结构每个棋盘格子下方安装一组6个精密弹簧针Pogo Pin与棋子底部的触点一一对应。弹簧针具有自清洁和良好接触的特性。所有格子的弹簧针按行、列连接到主控板。读取电路使用Arduino的GPIO口来读取触点电平。为了防止触点接触不良导致的误读每个数据引脚都通过一个上拉电阻连接到VCC。当棋子放上触点接通对应的数据引脚若连接到棋子的GND则被拉低为0若悬空或连接到VCC则保持为1。通过扫描行列就能定位到哪个格子有棋子并读取其5位ID码。注意弹簧针的选型很重要行程和弹力要适中确保棋子放下时所有触点能同时可靠接触拿起时又能迅速断开。我最初用了弹力太小的针导致有时接触不良后来换了弹力更大的型号解决了问题。2.2 主控与通信层系统的大脑与神经主控板负责收集所有格子的状态运行游戏逻辑并控制输出。我选择了Arduino Mega 2560。原因在于它拥有54个数字IO口和16个模拟输入口足以驱动一个9x10的棋盘矩阵需要90个格子的输入扫描。虽然理论上可以用IO扩展芯片如74HC595、MCP23017来节省端口但为了初期原型搭建简单、调试方便直接使用Mega 2560是更稳妥的选择。通信方面棋盘上的每个棋子本身是无源的但我们需要将“吃掉”这个指令传达给特定的棋子。这里我引入了无线通信模块。每个棋子内部嵌入了一个超低功耗的接收模块如NRF24L01或更简单的ASK/OOK超再生接收模块和一个微型振动电机。当主控判定某个棋子被吃它就通过无线信号发送该棋子的唯一ID指令。对应棋子收到指令后驱动振动电机短促震动一下提示持有者该棋子已被“击毙”需移出棋盘。同时获胜方的棋子可以控制一个微型LED闪烁一下作为胜利反馈。2.3 执行与反馈层隐形的裁判与提示胜负判定的逻辑完全由Arduino代码实现就是简单的军棋规则比较司令军师旅团营连排工兵工兵吃地雷炸弹与任何棋子相遇同归于尽地雷除工兵外胜所有军旗不能被移动。当检测到两个棋子进入同一格子通过先后顺序判断为“攻击”行为主控立即查询规则决定胜负。反馈系统需要隐蔽且明确对败者无线信号触发振动电机。振动提示非常私密只有持子者能感受到完美模拟了裁判悄悄告知“你的棋子被吃了”的场景。对胜者可以点亮棋子上的一个LED。为了保持棋盘美观LED光线很微弱且朝向上方只有查看自己棋子时能看到。全局记录Arduino通过串口将每一步的胜负信息发送到电脑或手机端可以用于复盘或显示战况这部分属于增值功能。3. 硬件制作详解从电路图到实体棋盘3.1 棋盘矩阵电路设计与焊接这是整个项目中最耗时也最需要耐心的部分。一个9行10列的棋盘共90个格子。每个格子有6个信号5位数据1位地。如果直接连接需要540根线这是不现实的。我采用了矩阵扫描Matrix Scanning的方法来大幅减少连线将90个格子视为一个9x10的矩阵每个格子的“地线GND”是独立的需要连接。数据线复用将5位数据线D0-D4各自并联起来形成5条“数据总线”贯穿整个棋盘。也就是说所有格子的D0引脚都连到同一根线上D1、D2等亦然。选址控制通过10个IO口控制10个模拟开关芯片如CD4051八选一模拟开关来选通某一列棋盘的“地线”。再通过9个IO口控制另外的模拟开关来选通某一行的“地线”。只有当某行和某列的地线同时被选通时对应交叉点格子上的棋子才与公共地线接通此时主控读取5条数据总线的电平才能代表该格子的棋子ID。这样IO口的需求就从540个降到了5数据总线 10列选通 9行选通 一些控制脚 ≈ 30个以内完全在Mega 2560的能力范围内。焊接时我使用了一块大型万能板洞洞板作为棋盘基底先将弹簧针按照棋盘格位精确固定焊接。然后使用细漆包线进行矩阵走线。务必做好标记防止线路错乱。焊接完成后需要用万用表逐格测试每个触点的连通性确保没有虚焊或短路。3.2 棋子的改装与制作购买标准的木质或塑料军棋棋子在底部钻孔安装微型磁铁用于与棋盘轻微吸附固定和充电触点如果需要为内部电路充电。棋子内部需要放入编码电路板一块很小的圆形PCB上面有按照该棋子ID连接好的5个触点。例如“红方司令”的ID可能是00001那么它的PCB就将D0触点与GND连通代表0D1-D4触点则保持断开通过上拉电阻为1。无线接收与反馈模块一块集成超再生接收、解码和电机驱动的小板子加上一个硬币振动电机。电池使用可充电的纽扣电池如LIR2032。外壳封装将电路妥善放入棋子内部用胶水固定底部用薄片封好并露出金属触点。确保棋子重量、手感与原版相近。制作24个这样的棋子工作量不小建议先做一套红蓝各半进行功能验证。3.3 主控箱与电源管理将所有控制电路、Arduino Mega、无线发射模块、电源模块集成到一个美观的木盒中作为棋盘底座。电源需要提供5V给Arduino和数字电路以及一个可调的如3.3V给无线模块。由于棋盘和棋子中有不少数字电路电源的纹波要小建议使用优质的DC-DC降压模块而不是简单的线性稳压器。4. 软件逻辑剖析Arduino代码的核心框架Arduino程序主要包含初始化、扫描循环、逻辑判定和通信四大块。// 定义引脚 const int dataPins[5] {A0, A1, A2, A3, A4}; // 5位数据总线 const int rowSelectPins[9] {22, 24, 26, 28, 30, 32, 34, 36, 38}; // 行选通 const int colSelectPins[10] {23, 25, 27, 29, 31, 33, 35, 37, 39, 40}; // 列选通 // 棋盘状态数组 int boardState[9][10]; // 存储每个格子的棋子ID-1表示空 void setup() { // 初始化所有引脚模式 for(int i0; i5; i) pinMode(dataPins[i], INPUT_PULLUP); for(int i0; i9; i){ pinMode(rowSelectPins[i], OUTPUT); digitalWrite(rowSelectPins[i], HIGH);} // 默认关断 for(int i0; i10; i){ pinMode(colSelectPins[i], OUTPUT); digitalWrite(colSelectPins[i], HIGH);} // 初始化无线模块 radio.begin(); // 初始化串口 Serial.begin(9600); } void loop() { scanBoard(); // 扫描整个棋盘更新boardState checkForCombat(); // 检查是否有新发生的“战斗” // 其他逻辑... } void scanBoard() { for(int r0; r9; r){ for(int c0; c10; c){ // 选通当前格子 digitalWrite(rowSelectPins[r], LOW); digitalWrite(colSelectPins[c], LOW); delayMicroseconds(100); // 短暂稳定时间 // 读取5位ID int id 0; for(int b0; b5; b){ id | (digitalRead(dataPins[b]) b); // 注意电平逻辑根据实际电路调整 } boardState[r][c] id; // 关闭当前格子 digitalWrite(rowSelectPins[r], HIGH); digitalWrite(colSelectPins[c], HIGH); } } } void checkForCombat() { // 比较当前棋盘状态与上一次状态找出新出现的“两子同格”位置 // 判断先后手假设后移动的为攻击方 // 根据棋子ID查询规则表判定胜负 // 更新棋盘状态将被吃棋子位置设为-1 // 通过无线信号发送指令震动给败者LED闪烁给胜者 // 通过串口输出战报 }规则表可以用一个二维数组或函数来实现。无线通信需要一套简单的协议包含目标棋子ID和指令类型震动/闪烁。5. 调试心得与进阶优化空间在实际制作和调试中我遇到了几个关键问题信号干扰与误触发初期无线模块在电机震动时偶尔会误触发其他棋子。解决方案是增加通信协议校验如CRC并为每个棋子设置唯一的地址码发射时指定地址。同时在振动电机电源两端并联一个104瓷片电容抑制电火花干扰。扫描速度与响应延迟90个格子逐一扫描加上稳定时间一轮扫描可能需要几十毫秒。如果两人落子极快可能检测不到中间状态。优化方法采用中断触发式扫描。常态下棋盘不扫描在每个格子弹簧针的GND回路中串联一个微动开关或霍尔传感器当棋子放入产生磁通变化或压力时触发中断主控只扫描中断发生的那个区域极大提升响应速度。棋子ID读取稳定性弹簧针接触瞬间可能抖动导致读取的ID码错误。解决方法软件去抖多次采样取众数。在scanBoard()函数中对同一个格子连续读取5次ID只有至少3次结果相同才认为有效否则视为放置不稳定要求玩家重新摆放。电源续航棋子内的纽扣电池续航是关键。优化措施让接收模块绝大部分时间处于深度睡眠模式只有收到特定的唤醒信号如棋盘广播的开始游戏指令后才进入接收状态。振动电机采用脉冲式驱动震动时间控制在100ms以内。项目的进阶优化方向加入游戏流程引导通过棋盘四周的LED灯带提示当前该哪一方走子、是否处于行营、游戏是否结束等。连接手机App通过蓝牙将Arduino与手机连接在App上实现更复杂的规则设置如暗棋、明棋切换、战绩记录、甚至人机对战功能。棋子定位自动化结合棋盘下的磁传感器阵列不仅能识别棋子身份还能感知棋子的移动轨迹实现自动记谱。材料与工艺升级使用PCB定制棋盘将弹簧针和走线集成到多层PCB中外观更整洁。棋子采用3D打印外壳内部结构更精密。制作智能军棋的过程是一次将软件逻辑与硬件实体深度融合的体验。它远远超出了简单编程的范畴涉及电路设计、信号处理、机械结构、低功耗设计等多个领域。当看到朋友在不知情的情况下棋子被“默默吃掉”时露出的惊讶表情或是两人沉浸在对弈中完全忘记了背后运行的技术那一刻的成就感是单纯写代码无法比拟的。这个项目最大的收获不是做出了一个能玩的棋盘而是打通了从问题定义、方案选型、硬件实现到软件调试的完整创造链路。如果你也对硬件和交互感兴趣不妨从一个这样具体而有趣的项目开始亲手将脑海中的想法变成可以触摸的现实。
基于Arduino的智能军棋裁判系统:矩阵扫描与无线通信实现
1. 项目缘起从传统军棋到智能桌游的跃迁军棋这款承载着许多人童年记忆的策略棋类游戏其魅力在于对弈双方在“暗棋”规则下的心理博弈与战术推演。然而传统的军棋对弈存在一个固有的痛点需要一个公正的第三方裁判来判定棋子相遇时的胜负。这不仅限制了游戏的灵活性也让两人对弈变得不那么纯粹。几年前我在一次朋友聚会中大家想下军棋却苦于找不到裁判这个场景让我萌生了一个想法能不能用技术手段让棋盘自己当裁判这个想法就是“智能军棋”项目的起点。我的目标很明确制作一个物理棋盘当双方棋子移动到同一位置时棋盘能自动、无声地完成大小判定并仅向获胜方显示结果失败方的棋子则被“吃掉”并移出棋盘整个过程无需任何人工干预。这听起来像是一个复杂的嵌入式系统项目但核心逻辑其实非常清晰。经过一番技术选型我最终锁定了Arduino平台。原因很简单Arduino拥有极其丰富的传感器和通信模块生态其开发环境对电子爱好者非常友好社区支持强大能让我快速将想法原型化。这个项目不仅是对传统游戏的现代化改造更是一次融合了传感器技术、无线通信和嵌入式逻辑控制的综合性实践。2. 系统架构设计与核心组件选型要实现“自动裁判”功能整个系统需要解决三个核心问题棋子身份识别、棋子位置感知和胜负判定与执行。围绕这三个问题我设计了如下的系统架构。2.1 棋盘感知层如何让棋盘“看见”棋子棋盘需要知道每个格子上放着什么棋子。我评估了几种方案RFID方案每个棋子底部嵌入RFID标签棋盘每个格子下方安装RFID读卡器。优点是识别准确、非接触。但成本极高一个棋盘90个格子就需要90个读卡器布线复杂被首先排除。电阻网络方案为每个棋子设定不同的电阻值通过棋盘格子的触点读取电阻来识别。电路相对简单但触点容易氧化可靠性一般且棋子制作复杂。矩阵式触点编码方案这是最终采用的方案。其核心思想是为每一类棋子分配一个唯一的二进制ID通过棋子底部的多个导电触点与棋盘格子上对应的弹簧针接触形成一个电路回路由主控读取电平状态从而解码出棋子ID。具体实现如下棋子编码军棋共有12种棋子司令、军、师、旅、团、营、连、排、工兵、地雷、炸弹、军旗加上红蓝双方共24类。5位二进制数2^532足以编码。我在棋子底部设计了5个圆形铜箔作为数据触点D0-D41个作为公共地线触点GND。棋盘结构每个棋盘格子下方安装一组6个精密弹簧针Pogo Pin与棋子底部的触点一一对应。弹簧针具有自清洁和良好接触的特性。所有格子的弹簧针按行、列连接到主控板。读取电路使用Arduino的GPIO口来读取触点电平。为了防止触点接触不良导致的误读每个数据引脚都通过一个上拉电阻连接到VCC。当棋子放上触点接通对应的数据引脚若连接到棋子的GND则被拉低为0若悬空或连接到VCC则保持为1。通过扫描行列就能定位到哪个格子有棋子并读取其5位ID码。注意弹簧针的选型很重要行程和弹力要适中确保棋子放下时所有触点能同时可靠接触拿起时又能迅速断开。我最初用了弹力太小的针导致有时接触不良后来换了弹力更大的型号解决了问题。2.2 主控与通信层系统的大脑与神经主控板负责收集所有格子的状态运行游戏逻辑并控制输出。我选择了Arduino Mega 2560。原因在于它拥有54个数字IO口和16个模拟输入口足以驱动一个9x10的棋盘矩阵需要90个格子的输入扫描。虽然理论上可以用IO扩展芯片如74HC595、MCP23017来节省端口但为了初期原型搭建简单、调试方便直接使用Mega 2560是更稳妥的选择。通信方面棋盘上的每个棋子本身是无源的但我们需要将“吃掉”这个指令传达给特定的棋子。这里我引入了无线通信模块。每个棋子内部嵌入了一个超低功耗的接收模块如NRF24L01或更简单的ASK/OOK超再生接收模块和一个微型振动电机。当主控判定某个棋子被吃它就通过无线信号发送该棋子的唯一ID指令。对应棋子收到指令后驱动振动电机短促震动一下提示持有者该棋子已被“击毙”需移出棋盘。同时获胜方的棋子可以控制一个微型LED闪烁一下作为胜利反馈。2.3 执行与反馈层隐形的裁判与提示胜负判定的逻辑完全由Arduino代码实现就是简单的军棋规则比较司令军师旅团营连排工兵工兵吃地雷炸弹与任何棋子相遇同归于尽地雷除工兵外胜所有军旗不能被移动。当检测到两个棋子进入同一格子通过先后顺序判断为“攻击”行为主控立即查询规则决定胜负。反馈系统需要隐蔽且明确对败者无线信号触发振动电机。振动提示非常私密只有持子者能感受到完美模拟了裁判悄悄告知“你的棋子被吃了”的场景。对胜者可以点亮棋子上的一个LED。为了保持棋盘美观LED光线很微弱且朝向上方只有查看自己棋子时能看到。全局记录Arduino通过串口将每一步的胜负信息发送到电脑或手机端可以用于复盘或显示战况这部分属于增值功能。3. 硬件制作详解从电路图到实体棋盘3.1 棋盘矩阵电路设计与焊接这是整个项目中最耗时也最需要耐心的部分。一个9行10列的棋盘共90个格子。每个格子有6个信号5位数据1位地。如果直接连接需要540根线这是不现实的。我采用了矩阵扫描Matrix Scanning的方法来大幅减少连线将90个格子视为一个9x10的矩阵每个格子的“地线GND”是独立的需要连接。数据线复用将5位数据线D0-D4各自并联起来形成5条“数据总线”贯穿整个棋盘。也就是说所有格子的D0引脚都连到同一根线上D1、D2等亦然。选址控制通过10个IO口控制10个模拟开关芯片如CD4051八选一模拟开关来选通某一列棋盘的“地线”。再通过9个IO口控制另外的模拟开关来选通某一行的“地线”。只有当某行和某列的地线同时被选通时对应交叉点格子上的棋子才与公共地线接通此时主控读取5条数据总线的电平才能代表该格子的棋子ID。这样IO口的需求就从540个降到了5数据总线 10列选通 9行选通 一些控制脚 ≈ 30个以内完全在Mega 2560的能力范围内。焊接时我使用了一块大型万能板洞洞板作为棋盘基底先将弹簧针按照棋盘格位精确固定焊接。然后使用细漆包线进行矩阵走线。务必做好标记防止线路错乱。焊接完成后需要用万用表逐格测试每个触点的连通性确保没有虚焊或短路。3.2 棋子的改装与制作购买标准的木质或塑料军棋棋子在底部钻孔安装微型磁铁用于与棋盘轻微吸附固定和充电触点如果需要为内部电路充电。棋子内部需要放入编码电路板一块很小的圆形PCB上面有按照该棋子ID连接好的5个触点。例如“红方司令”的ID可能是00001那么它的PCB就将D0触点与GND连通代表0D1-D4触点则保持断开通过上拉电阻为1。无线接收与反馈模块一块集成超再生接收、解码和电机驱动的小板子加上一个硬币振动电机。电池使用可充电的纽扣电池如LIR2032。外壳封装将电路妥善放入棋子内部用胶水固定底部用薄片封好并露出金属触点。确保棋子重量、手感与原版相近。制作24个这样的棋子工作量不小建议先做一套红蓝各半进行功能验证。3.3 主控箱与电源管理将所有控制电路、Arduino Mega、无线发射模块、电源模块集成到一个美观的木盒中作为棋盘底座。电源需要提供5V给Arduino和数字电路以及一个可调的如3.3V给无线模块。由于棋盘和棋子中有不少数字电路电源的纹波要小建议使用优质的DC-DC降压模块而不是简单的线性稳压器。4. 软件逻辑剖析Arduino代码的核心框架Arduino程序主要包含初始化、扫描循环、逻辑判定和通信四大块。// 定义引脚 const int dataPins[5] {A0, A1, A2, A3, A4}; // 5位数据总线 const int rowSelectPins[9] {22, 24, 26, 28, 30, 32, 34, 36, 38}; // 行选通 const int colSelectPins[10] {23, 25, 27, 29, 31, 33, 35, 37, 39, 40}; // 列选通 // 棋盘状态数组 int boardState[9][10]; // 存储每个格子的棋子ID-1表示空 void setup() { // 初始化所有引脚模式 for(int i0; i5; i) pinMode(dataPins[i], INPUT_PULLUP); for(int i0; i9; i){ pinMode(rowSelectPins[i], OUTPUT); digitalWrite(rowSelectPins[i], HIGH);} // 默认关断 for(int i0; i10; i){ pinMode(colSelectPins[i], OUTPUT); digitalWrite(colSelectPins[i], HIGH);} // 初始化无线模块 radio.begin(); // 初始化串口 Serial.begin(9600); } void loop() { scanBoard(); // 扫描整个棋盘更新boardState checkForCombat(); // 检查是否有新发生的“战斗” // 其他逻辑... } void scanBoard() { for(int r0; r9; r){ for(int c0; c10; c){ // 选通当前格子 digitalWrite(rowSelectPins[r], LOW); digitalWrite(colSelectPins[c], LOW); delayMicroseconds(100); // 短暂稳定时间 // 读取5位ID int id 0; for(int b0; b5; b){ id | (digitalRead(dataPins[b]) b); // 注意电平逻辑根据实际电路调整 } boardState[r][c] id; // 关闭当前格子 digitalWrite(rowSelectPins[r], HIGH); digitalWrite(colSelectPins[c], HIGH); } } } void checkForCombat() { // 比较当前棋盘状态与上一次状态找出新出现的“两子同格”位置 // 判断先后手假设后移动的为攻击方 // 根据棋子ID查询规则表判定胜负 // 更新棋盘状态将被吃棋子位置设为-1 // 通过无线信号发送指令震动给败者LED闪烁给胜者 // 通过串口输出战报 }规则表可以用一个二维数组或函数来实现。无线通信需要一套简单的协议包含目标棋子ID和指令类型震动/闪烁。5. 调试心得与进阶优化空间在实际制作和调试中我遇到了几个关键问题信号干扰与误触发初期无线模块在电机震动时偶尔会误触发其他棋子。解决方案是增加通信协议校验如CRC并为每个棋子设置唯一的地址码发射时指定地址。同时在振动电机电源两端并联一个104瓷片电容抑制电火花干扰。扫描速度与响应延迟90个格子逐一扫描加上稳定时间一轮扫描可能需要几十毫秒。如果两人落子极快可能检测不到中间状态。优化方法采用中断触发式扫描。常态下棋盘不扫描在每个格子弹簧针的GND回路中串联一个微动开关或霍尔传感器当棋子放入产生磁通变化或压力时触发中断主控只扫描中断发生的那个区域极大提升响应速度。棋子ID读取稳定性弹簧针接触瞬间可能抖动导致读取的ID码错误。解决方法软件去抖多次采样取众数。在scanBoard()函数中对同一个格子连续读取5次ID只有至少3次结果相同才认为有效否则视为放置不稳定要求玩家重新摆放。电源续航棋子内的纽扣电池续航是关键。优化措施让接收模块绝大部分时间处于深度睡眠模式只有收到特定的唤醒信号如棋盘广播的开始游戏指令后才进入接收状态。振动电机采用脉冲式驱动震动时间控制在100ms以内。项目的进阶优化方向加入游戏流程引导通过棋盘四周的LED灯带提示当前该哪一方走子、是否处于行营、游戏是否结束等。连接手机App通过蓝牙将Arduino与手机连接在App上实现更复杂的规则设置如暗棋、明棋切换、战绩记录、甚至人机对战功能。棋子定位自动化结合棋盘下的磁传感器阵列不仅能识别棋子身份还能感知棋子的移动轨迹实现自动记谱。材料与工艺升级使用PCB定制棋盘将弹簧针和走线集成到多层PCB中外观更整洁。棋子采用3D打印外壳内部结构更精密。制作智能军棋的过程是一次将软件逻辑与硬件实体深度融合的体验。它远远超出了简单编程的范畴涉及电路设计、信号处理、机械结构、低功耗设计等多个领域。当看到朋友在不知情的情况下棋子被“默默吃掉”时露出的惊讶表情或是两人沉浸在对弈中完全忘记了背后运行的技术那一刻的成就感是单纯写代码无法比拟的。这个项目最大的收获不是做出了一个能玩的棋盘而是打通了从问题定义、方案选型、硬件实现到软件调试的完整创造链路。如果你也对硬件和交互感兴趣不妨从一个这样具体而有趣的项目开始亲手将脑海中的想法变成可以触摸的现实。