Arduino Due 触摸屏井字棋游戏 — 人机对战
元器件清单
| Arduino Due | ×1 |
| 2.8寸 TFT LCD 触摸屏 (ILI9341 驱动) | ×1 |
| 跳线若干 | ×1 |
软件工具
Arduino IDE
所需库:Adafruit_GFX、Adafruit_ILI9341、URTouch
接线说明
触摸屏接口
| T_IRQ | → D22 |
| T_DO | → D24 |
| T_DIN | → D26 |
| T_CS | → D28 |
| T_CLK | → D30 |
显示屏接口 (SPI)
| SDO (MISO) | → A.25 |
| LED | → 3.3V |
| SCK | → A.27 |
| SDI (MOSI) | → A.26 |
| DC | → D9 |
| RESET | → D8 |
| CS | → D10 |
| GND | → GND |
| VCC | → 3.3V |
项目演进
基于 nickthegreek82 的开源项目改进。主要更新:
- 2017-08-22:优化 AI 逻辑与代码结构
- 2017-08-26:进一步代码优化
- 2017-08-27:挑战“不可战胜”的 CPU
- 2018-03-13:引入极大极小算法,参考 klauscam 实现
两个版本代码
版本一:基础 AI (阻塞式)
策略:优先抢占角落 → 中心 → 阻挡玩家连线 → 随机落子。使用 checkOpponent() 遍历所有胜利组合判断是否需拦截。触摸坐标映射到 3×3 网格,绘制 X (玩家, 蓝) 与 O (CPU, 红)。游戏结束显示胜负并提供“再来一局”按钮。
版本二:极大极小算法 AI (必不败)
核心函数 minimax(board, player, depth) 递归搜索博弈树,返回最优分数。CPU 始终选择使对手最差结果的落子。深度限制 difficulty=8 可微调强度。触摸判区坐标微调适配实际屏幕分辨率。绘图使用 drawBitmap() 从 PROGMEM 读取 X/O 位图直接写屏,速度更快。
原理图

制造工艺
- 定制 4×4 井字棋名片 PCB – 设计、制作与代码指南
- K30 CO₂ 传感器:室内空气质量实时监测
- 基于 1Sheeld 与 Arduino 的盲聋人士沟通辅助系统
- 智能存钱罐:Arduino Nano 控制硬币识别器实现余额显示
- Arduino + HC-05 蓝牙控制 LED:MIT App Inventor 手机 App 开发全攻略
- DFRobot 电容指纹传感器 (ID809) 接入 Arduino/ESP8266 完整教程
- 基于 Arduino Mega 与 Nextion 显示屏的交互式气象站
- Arduino Mega 驱动 Wii Nunchuk 控制 6 自由度机械臂
- Arduino UNO + 以太网盾板实现低成本太阳辐射测量仪(热电堆原理)
- 紧凑型Arduino雷达系统:HC-SR04超声波传感器配1.8英寸显示屏
- Arduino 合成乐音:从零实现 88 键钢琴全音域
- TinyML 咳嗽检测:Arduino Nano 33 BLE Sense 实现早期流感筛查