Arduino UNO + MAX7219 自制《UFO攻击》复古射击游戏机
硬件清单
- Arduino UNO ×1
- MAX7219 四合一点阵模块(32×8像素) ×1
- DB9 9针公头接线端子(接Atari标准摇杆) ×1
- NPN三极管(驱动蜂鸣器) ×1
- 无源压电蜂鸣器 ×1
- 1kΩ电阻 ×1、面包板/跳线若干
- Atari兼容9针摇杆 ×1(可自制)
游戏特性
- 显示:32×8 LED矩阵,双缓冲无闪烁渲染
- 操控:经典9针摇杆(上下左右+发射)
- 关卡制:10个难度递增关卡,每关击杀目标数不同
- 敌人类型:直线UFO、弹跳器、俯冲机、上升机、中型BOSS(LT)、终极BOSS
- 音效:蜂鸣器合成激光、爆炸、警报音
- 扩展性:代码模块化,易移植手持设备
核心代码架构
图形定义(PROGMEM存储8×8精灵)
const unsigned char ship[] PROGMEM = {0x80,0xE0,0x00,0x00,0x00,0x00,0x00,0x00};
const unsigned char ufo[] PROGMEM = {0x40,0xE0,0x00,0x00,0x00,0x00,0x00,0x00};
const unsigned char boss[] PROGMEM = {0x18,0x24,0x42,0xFF,0x24,0xFF,0x7E,0x3C};
// ... 其它精灵略
主循环状态机
void loop() {
if (!gameStart) Ticker(true); // 跑马灯标题/分数/游戏结束
SpawnTimer(); // 定时生成敌人
JoystickControl(); // 读取摇杆+开火
UfoControl(); BouncerControl(); // 敌人移动绘制
FallerControl(); RiserControl(); // BOSS召唤的小兵
LTControl(); BossControl(); // 中/终极BOSS
UFOLaserControl(); // 敌方激光
LaserControl(); // 玩家激光+碰撞检测
ScreenLimit(); // 边界/消亡处理
ShipCollision(); // 玩家被击判定
matrix.write(); delay(50); matrix.fillScreen(LOW);
}
关卡参数表(Level函数)
| 关卡 | 生成间隔(ms) | 击杀目标 | BOSS血量 | BOSS射速 |
|---|---|---|---|---|
| 1 | UFO:3000 | 10 | 10 | 1000 |
| 2 | UFO:3000/Bouncer:8000 | 20 | 15 | 900 |
| 3 | UFO:2000/Bouncer:6000/LT:8000 | 30 | 20 | 800 |
| 4-10 | 逐级加快,引入Faller/Riser小兵 | 40-100 | 25-55 | 700-100 |
碰撞检测策略
采用像素级坐标比对:激光/飞船与每类敌人的占用像素逐一判断,命中则触发Boom()播放爆炸动画+加分+击杀计数。BOSS因体积大(8×8),按行扫描碰撞箱。
接线原理图
核心连接:
- MAX7219:DIN→MOSI(11),CLK→SCK(13),CS→D10
- 摇杆:上/下/左/右/火 → D2-D6(内部上拉)
- 蜂鸣器:D9经三极管驱动
- 电源:USB供电或外接5V
进阶构想
- 制作手持机壳(3D打印+锂电池)
- 增加OLED显示分数/血条
- 移植至ESP32联网对战
- 设计关卡编辑器
制造工艺
- Arduino 数字骰子:LCD 显示随机点数的电子骰子
- 水驱动火焰效果:Arduino UNO + Neopixel Stick 仿真壁炉
- 3D RGB Arduclock — 蓝牙控制全彩LED时钟带RTC与闹钟
- MyRiver:基于 Arduino MKR FOX 1200 的河流水质远程监测系统
- DIY 钢铁侠人偶:Arduino 控制超声波触发音效与灯光
- Arduino + 模拟摇杆互动游戏:五向 LED 反馈
- Find Me:基于 Arduino 与蓝牙的智能寻物器制作指南
- 打造功能完整的 Arduino 驱动 3D 打印机械臂:分步指南
- 便携测距仪 DIY 套件:Arduino Nano + HC-SR04 + 18650 电池 + 3D 打印外壳
- DIY Arduino 加湿器控制器:继电器安全控制高压电路
- Arduino 驱动的迷你漫游车:自制避障机器人
- DIY Arduino 手柄方向盘 - 游戏竞速模拟器自制指南