아두이노

아두이노 LCD 자동 슈팅 게임 만들기 🚀

모빌리티키즈 2025. 5. 24. 11:28
728x90
반응형

🕹️ 프로젝트 개요

이번 프로젝트에서는 아두이노와 I2C LCD 디스플레이를 활용하여 자동 슈팅 게임을 구현해보겠습니다! 플레이어는 사용자 정의 캐릭터(mFace)를 사용하여 화면에 표시되며, 자동으로 탄환을 발사하는 방식으로 진행됩니다.

이 프로젝트에서 구현할 주요 기능은 다음과 같습니다.

플레이어 캐릭터 (mFace) 출력 – LCD 화면 하단에 플레이어 표시

적(Enemy) 출력 – LCD 화면 상단의 랜덤 위치에서 등장

10번 움직인 후 탄환 발사 – 탄환이 즉시 발사되지 않고 일정 횟수 움직인 후 발사됨

탄환이 적을 맞추면 점수 증가 – 적을 명중할 때 점수가 올라가며 화면 상단에 표시

게임 자동 실행 (100번 반복 후 종료) – 플레이어가 개입하지 않아도 게임이 진행됨

이 프로젝트를 통해 아두이노 프로그래밍의 기본 원리를 익히고, LCD 디스플레이를 활용한 게임 개발을 경험할 수 있습니다. 바로 시작해볼까요? 🎮✨

🔧 필요한 부품 리스트

부품명설명
아두이노 (Arduino Uno) 코드 실행을 위한 마이크로컨트롤러
LCD 16x2 (I2C 방식) 게임 화면을 출력할 디스플레이
점퍼 와이어 회로 연결을 위한 필수품
브레드보드 납땜 없이 회로를 구성하는 기판

🛠 회로 연결 방법

LCD - 아두이노 연결

I2C 방식의 LCD 디스플레이를 사용하며, 다음과 같이 연결하면 됩니다.

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번 움직인 후 발사되도록 수정되었습니다! 게임 진행이 더 자연스럽고, 연속적인 발사 방지로 게임 난이도가 조절되었습니다.

게임을 실행해보고 원하는 추가 기능이 있으면 언제든지 알려주세요! 🚀😊 즐거운 코딩 되세요! 🎮✨

728x90
반응형