아두이노 우노 & MAX7219로 만드는 UFO 어택 게임 – 직접 만드는 레트로 아케이드
부품 및 소모품
| 부품 | 수량 |
| Arduino UNO | 1 |
| MAX7219 도트 매트릭스 모듈 4-in-1 디스플레이 | 1 |
| DB9 9핀 터미널 브레이크아웃 보드 (조이스틱 연결용) | 1 |
| 범용 NPN 트랜지스터 | 1 |
| 브레드보드 | 1 |
| Adafruit 패시브 피에조 부저 | 1 |
| 암/수 점퍼 와이어 | 5 |
| 점퍼 와이어 | 10 |
| 저항 1kΩ | 1 |
| 아타리 호환 9핀 조이스틱 | 1 |
프로젝트 소개
아두이노 우노, "4-in-1" MAX7219 매트릭스 세트, 아두이노 스타터 키트 부품으로 만든 레트로 슈팅 게임입니다.
코드는 직접 작성했으며 Max72xxPanel, Adafruit GFX, SPI 라이브러리를 사용했습니다.
직접 만들어 UFO를 격추해보세요! :-)
- 각 레벨마다 격추해야 할 UFO 목표 수가 정해져 있으며, 달성 시 보스 등장
- 아타리 호환 9핀 조이스틱 필요 (집에 굴러다니는 옛날 조이스틱 활용 가능, 직접 제작도 가능)
- 향후 휴대용 버전으로 발전 예정
코드
UFO Attack 코드 (C/C++)
/* UFO ATTACK! - Anthony Clarke 작성 */
/* 일부 코드는 오픈소스 예제에서 가져옴. 주석으로 표시함. */
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Max72xxPanel.h>
const int pinCS = 10; // CS 핀, DIN=MOSI, CLK=SCK (SPI 참고)
const int numberOfHorizontalDisplays = 4;
const int numberOfVerticalDisplays = 1;
Max72xxPanel matrix = Max72xxPanel(pinCS, numberOfHorizontalDisplays, numberOfVerticalDisplays);
// 스프라이트 비트맵 데이터 (PROGMEM 저장)
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 explosion[] PROGMEM = { 0xe0, 0xe0, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00 };
const unsigned char bouncer[] PROGMEM = { 0x60, 0xc0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00 };
const unsigned char boss[] PROGMEM = { 0x18, 0x24, 0x42, 0xff, 0x24, 0xff, 0x7e, 0x3c };
const unsigned char faller[] PROGMEM = { 0x80, 0xc0, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00 };
const unsigned char riser[] PROGMEM = { 0xe0, 0xc0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00 };
const unsigned char LT[] PROGMEM = { 0x78, 0xfc, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00 };
const unsigned char ufoLaser[] PROGMEM = { 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
const unsigned char bossBoom1[] PROGMEM = { 0xaa, 0x55, 0xa2, 0x51, 0x8a, 0x45, 0xaa, 0x55 };
const unsigned char bossBoom2[] PROGMEM = { 0x55, 0xaa, 0x45, 0x8a, 0x51, 0xa2, 0x55, 0xaa };
// 게임 상태 변수들
bool gameStart = false;
int up = 2, down = 3, left = 4, right = 5, trigger = 6; // 조이스틱 핀
String tape = "UFO ATTACK! - Press fire to start ";
int wait = 40, spacer = 1, width = 5 + spacer;
// 플레이어 변수
int shipx = 0, shipy = 0, lasx, lasy;
int lives = 5;
bool lasExist = false;
// 적/레이저/보스 관련 변수 다수... (원본 참조)
void setup() {
pinMode(buzzerPin, OUTPUT);
pinMode(up, INPUT_PULLUP); pinMode(down, INPUT_PULLUP);
pinMode(left, INPUT_PULLUP); pinMode(right, INPUT_PULLUP);
pinMode(trigger, INPUT_PULLUP);
matrix.setIntensity(0);
matrix.setPosition(0, 3, 0); matrix.setPosition(1, 2, 0);
matrix.setPosition(2, 1, 0); matrix.setPosition(3, 0, 0);
matrix.setRotation(0, 3); matrix.setRotation(1, 3);
matrix.setRotation(2, 3); matrix.setRotation(3, 3);
matrix.fillScreen(LOW);
}
void loop() {
if (!gameStart) Ticker(true);
SpawnTimer(); JoystickControl(); UfoControl(); BouncerControl();
LaserControl(); ScreenLimit(); BossBattle(); BossControl();
UFOLaserControl(); LTControl(); FallerControl(); RiserControl();
ShipCollision();
matrix.write(); delay(50); matrix.fillScreen(LOW);
}
// 레벨별 설정 함수 (Level 1~10)
void Level(int level) { ... }
// 타이틀/점수/게임오버 티커
void Ticker(bool resetKills) { ... }
// 조이스틱 입력 처리
void JoystickControl() { ... }
// 플레이어 레이저 발사
void ShootLaser() { ... }
// 레이저 제어 및 충돌 감지 (매우 긴 함수)
void LaserControl() { ... }
// 폭발 효과 및 점수 추가
void Boom(int x, int y, bool addKill, int scoreType) { ... }
// 화면 경계 제한
void ScreenLimit() { ... }
// 적 스폰 타이머
void SpawnTimer() { ... }
// 각 적 타입별 스폰/제어 함수들
void SpawnUFO() { ... }
void UfoControl() { ... }
void SpawnBouncer() { ... }
void BouncerControl() { ... }
void SpawnFaller() { ... }
void FallerControl() { ... }
void SpawnRiser() { ... }
void RiserControl() { ... }
void SpawnLT() { ... }
void LTControl() { ... }
// 보스전 진입 및 제어
void BossBattle() { ... }
void BossControl() { ... }
void UFOLaserShoot(int selection) { ... }
void UFOLaserControl() { ... }
// 플레이어 충돌 감지
void ShipCollision() { ... }
// 게임 오버 처리
void GameOver(int gameStatus) { ... }
// 플레이어 피격 처리
void ShipHit() { ... }
전체 코드는 위와 같으며, 레벨 시스템, 다양한 적 타입(UFO, 바운서, 폴러, 라이저, 미니보스 LT, 최종 보스), 조이스틱 조작, 충돌 감지, 사운드 효과까지 완전한 아케이드 게임을 구현합니다.
회로도
UFO Attack 게임 배선 회로도:
