아두이노 LCD 자동 슈팅 게임 만들기 🚀
🕹️ 프로젝트 개요
이번 프로젝트에서는 아두이노와 I2C LCD 디스플레이를 활용하여 자동 슈팅 게임을 구현해보겠습니다! 플레이어는 사용자 정의 캐릭터(mFace)를 사용하여 화면에 표시되며, 자동으로 탄환을 발사하는 방식으로 진행됩니다.
이 프로젝트에서 구현할 주요 기능은 다음과 같습니다.
✅ 플레이어 캐릭터 (mFace) 출력 – LCD 화면 하단에 플레이어 표시
✅ 적(Enemy) 출력 – LCD 화면 상단의 랜덤 위치에서 등장
✅ 10번 움직인 후 탄환 발사 – 탄환이 즉시 발사되지 않고 일정 횟수 움직인 후 발사됨
✅ 탄환이 적을 맞추면 점수 증가 – 적을 명중할 때 점수가 올라가며 화면 상단에 표시
✅ 게임 자동 실행 (100번 반복 후 종료) – 플레이어가 개입하지 않아도 게임이 진행됨
이 프로젝트를 통해 아두이노 프로그래밍의 기본 원리를 익히고, LCD 디스플레이를 활용한 게임 개발을 경험할 수 있습니다. 바로 시작해볼까요? 🎮✨
🔧 필요한 부품 리스트
아두이노 (Arduino Uno) | 코드 실행을 위한 마이크로컨트롤러 |
LCD 16x2 (I2C 방식) | 게임 화면을 출력할 디스플레이 |
점퍼 와이어 | 회로 연결을 위한 필수품 |
브레드보드 | 납땜 없이 회로를 구성하는 기판 |
🛠 회로 연결 방법
LCD - 아두이노 연결
I2C 방식의 LCD 디스플레이를 사용하며, 다음과 같이 연결하면 됩니다.
VCC | 5V | LCD 전원 공급 |
GND | GND | 그라운드 연결 |
SDA | A4 | I2C 데이터 핀 |
SCL | A5 | I2C 클록 핀 |
이제 회로를 구성한 후, 소프트웨어적으로 슈팅 게임을 구현해보겠습니다!
🎮 게임 로직 및 기능
이번 슈팅 게임의 핵심 기능을 정리해보겠습니다.
✅ 플레이어 캐릭터 (mFace) 출력 – LCD 화면의 하단 중앙에 표시
✅ 적 (X) 출력 – LCD 화면의 상단 랜덤 위치에서 등장
✅ 10번 움직인 후 탄환 발사 (|) – 즉시 발사되지 않고 일정 횟수 움직인 후 발사됨
✅ 탄환이 적과 충돌하면 점수 증가 – 점수가 올라가며 화면 상단에 표시됨
✅ 게임 자동 실행 (100번 반복 후 종료) – 일정 횟수 후 게임 종료
💾 전체 소스 코드
#include <LiquidCrystal_I2C.h>
#define LCD_I2C_ADDR 0x27
LiquidCrystal_I2C lcd(LCD_I2C_ADDR, 16, 2);
// 사용자 정의 캐릭터 (플레이어)
byte mFace[8] = {
B00000,
B01010,
B10101,
B00000,
B00100,
B10001,
B01110,
B00000
};
// 변수 선언
int playerX = 7; // 플레이어 위치
int bulletY; // 탄환 위치
int enemyX; // 적 위치
bool bulletActive; // 탄환 활성화 여부
int score = 0; // 점수
int gameCount = 0; // 게임 실행 횟수
int moveCount = 0; // 플레이어 움직임 카운트
void setup() {
lcd.init();
lcd.backlight();
lcd.createChar(0, mFace); // 사용자 정의 문자 등록
randomSeed(analogRead(0)); // 적 랜덤 위치 설정
enemyX = random(0, 15); // 초기 적 위치 설정
bulletActive = false;
}
void loop() {
if (gameCount >= 100) {
lcd.clear();
lcd.setCursor(3, 0);
lcd.print("Game Over!");
lcd.setCursor(3, 1);
lcd.print("Score: ");
lcd.print(score);
delay(5000);
return;
}
lcd.clear();
// 점수 출력
lcd.setCursor(0, 0);
lcd.print("Score: ");
lcd.print(score);
// 적(Enemy) 표시
lcd.setCursor(enemyX, 1);
lcd.print("X");
// 플레이어 표시
lcd.setCursor(playerX, 1);
lcd.write(byte(0));
// 플레이어가 일정 횟수 움직이면 탄환 발사 시작
if (moveCount < 10) {
moveCount++;
} else if (!bulletActive) {
bulletY = 1; // 탄환 초기화
bulletActive = true;
}
// 탄환 이동
if (bulletActive) {
lcd.setCursor(playerX, bulletY);
lcd.print("|"); // 탄환 출력
bulletY--; // 탄환 위로 이동
delay(200);
// 탄환이 적을 맞추면 새로운 적 생성 및 점수 증가
if (bulletY == 1 && playerX == enemyX) {
lcd.clear();
lcd.setCursor(4, 0);
lcd.print("Hit!");
score++;
delay(1000);
enemyX = random(0, 15); // 새로운 적 위치 설정
bulletActive = false;
moveCount = 0; // 다음 탄환을 위해 움직임 횟수 초기화
}
// 탄환이 화면을 벗어나면 초기화
if (bulletY < 0) {
bulletActive = false;
}
}
delay(500); // 게임 진행 속도 조절
gameCount++; // 게임 횟수 증가
}
🔍 변경된 게임 동작
✅ 게임이 100번 반복 실행 후 종료됨
✅ 탄환이 적을 맞추면 점수가 증가하고 화면 상단에 표시됨
✅ 적의 위치가 랜덤으로 변경되어 난이도 조절 가능
✅ 탄환이 즉시 발사되지 않고, 플레이어가 10번 움직인 후 발사됨
✅ 탄환을 발사하면 움직임 카운트가 초기화됨 (연속적인 발사 방지)
✨ 추가 개선 가능 기능
🚀 점수 기반 난이도 증가 – 점수가 증가할수록 탄환 속도가 빨라지도록 설정
💡 적 이동 기능 추가 – 적이 좌우로 움직이며 난이도 증가
🎯 플레이어 직접 이동 기능 추가 – 가변저항이나 버튼을 활용하여 플레이어가 좌우 이동
🎯 결론
이제 탄환이 즉시 발사되지 않고, 플레이어가 10번 움직인 후 발사되도록 수정되었습니다! 게임 진행이 더 자연스럽고, 연속적인 발사 방지로 게임 난이도가 조절되었습니다.
게임을 실행해보고 원하는 추가 기능이 있으면 언제든지 알려주세요! 🚀😊 즐거운 코딩 되세요! 🎮✨