프로젝트 진행과정 009

2025. 10. 6. 08:20·📖TIL/🔥Projects

미니게임 005

제목 : 스네이크

 

1. 스네이크 게임의 동작 원리

  1. 보드 생성
  2. 뱀 생성
  3. 매 프레임마다 키 입력 → 이동 → 충돌 판단 → 출력
  4. 게임 오버 시 종료

 

 

2. 보드 초기화

board = new char[BoardHeight, BoardWidth];

2차원 배열 board[y , x] 에 각 칸의 상태를 저장한다.

  1. Wall (#) : 외곽 경계
  2. Empty ( ) : 빈 칸
  3. Food (●) : 먹이
  4. Head (O) : 뱀의 머리
  5. Body (o) : 뱀의 몸통

콘솔에 그릴 때는 이 board 상태를 한 줄씩 출력한다.

 

 

 

3. 뱀의 데이터 구조

snake = new LinkedList<Pos>();

LinkedList 를 채택했다.

앞 뒤로 쉽게 추가 / 제거 가 가능해서 , "머리 추가 / 꼬리 제거" 구조에 맞는다.

 

매 프레임마다 체크

머리 위치를 새로 계산해서 AddLast()

먹이를 안먹었으면 RemoveFirst() - ( 꼬리 제거 )

 

 

 

4. 이동 로직

Pos head = snake.Last.Value;

int nextX = head.X;
int nextY = head.Y;

if (dir == Up) nextY--;
else if (dir == Down) nextY++;
else if (dir == Left) nextX--;
else if (dir == Right) nextX++;

Pos head = snake.Last.Value; : 현재 머리 좌표

 

방향 ( dir ) 에 따라 다음 머리 좌표를 미리 계산

그 다음 AddLast ( new Pos ( nextX, nextY ) ) 로 새로운 머리 추가

  1. 먹이를 먹었다 → 꼬리를 제거하지 않는다 ( 몸 길이 한칸 늘어남 )
  2. 먹이를 먹지 않았다 → RemoveFirst() 로 꼬리 제거

이동 로직은 머리 추가 + 꼬리 제거로 이동하는 것처럼 보이게 구현했다.

 

 

 

5. 충돌 판정

▼벽 충돌

if (nextCell == Wall)
    isGameOver = true;

 

 

▼몸통 충돌

if (nextCell == Body)
{
    bool conflictBody = true;

    if (isNextTail && !willEat) // 꼬리 위치이고 성장하지 않는다면
    {
        conflictBody = false; // 충돌이 아님
    }

    if (conflictBody)
    {
        isGameOver = true;
        return;
    }
}

다음 칸이 몸통이라면 충돌

다음 칸이 꼬리인데 이번 턴에 꼬리를 제거할 예정이라면 충돌이 아님을 예외 처리했다.

 

 

 

6. 먹이 생성

private static void SpawnFood()
{
    // Board 내부 ( 벽을 제외 ) 난수 좌표 뽑아
    // 뱀 몸과 겹치지 않게 생성해야함!!

    int trySpawn = 0;
    int tryMaxSpawn = 1000;

    while ( trySpawn < tryMaxSpawn )
    {
        int foodX = rnd.Next(1, BoardWidth - 1);
        int foodY = rnd.Next(1, BoardHeight - 1);

        Pos spawnPos = new Pos(foodX, foodY);

        // 뱀 위인지 확인 : 링크드리스트로 순회하며 체크
        if ( !IsOnSnake(spawnPos))
        {
            food = spawnPos;
            return;
        }
        trySpawn++;
    }
}

 

 

 

7. 보드 갱신

RefreshBoard 메서드

board 배열의 데이터를 갱신

전체를 빈 칸으로 초기화

벽 생성

먹이 생성

뱀 좌표 전부 찍기

 

 

UpdateBoard 메서드

board 내용을 콘솔에 출력한다

private static void UpdateBoard()
{
    // 커서를 0,0 이동시킨 후 화면 덮어씌울 목적
    Console.SetCursorPosition(0, 0);

    // 전체를 빈 칸으로 채우기
    int y = 0;
    while (y < BoardHeight)
    {
        int x = 0;
        while (x < BoardWidth)
        {
            char cell = board[y, x];
                                
            if ( cell == Food )
            {
                Console.ForegroundColor = ConsoleColor.Red;
            }
            else
            {
                Console.ResetColor();
            }

            Console.Write(board[y, x]); // 현재 위치에 채우기
            x++; // x 좌표 하나씩 이동하면서 채우기
        }
        Console.WriteLine();
        y++; // y 좌표 하나씩 이동하면서 채우기
    }
}

 

 

 

8. 게임 루프

while (!isGameOver)
{
    HandleInput();
    Step();
    RefreshBoard();
    UpdateBoard();
    UpdateHUD();

    Thread.Sleep(gameSpeed);
}

이 루프가 계속 돌아가며 게임을 프레임 단위로 업데이트 한다

입력 → 이동 → 충돌 → 보드 갱신 → 대기 ( 딜레이 Thread.Sleep )

이 순환이 게임오버 처리 될때까지 반복

 

 

 

정리

이동은 머리 추가 + 꼬리 제거로 구현

2차원 배열에 현재 상태를 반영한 뒤

매 프레임 콘솔에 출력하는 방식을 사용

'📖TIL > 🔥Projects' 카테고리의 다른 글

유니티 개인 프로젝트 기획 초안  (0) 2025.11.21
유니티 개인 프로젝트 기획 초안  (0) 2025.11.12
프로젝트 진행과정 008  (0) 2025.10.06
프로젝트 진행과정 007  (0) 2025.10.06
프로젝트 진행과정 006  (0) 2025.10.05
'📖TIL/🔥Projects' 카테고리의 다른 글
  • 유니티 개인 프로젝트 기획 초안
  • 유니티 개인 프로젝트 기획 초안
  • 프로젝트 진행과정 008
  • 프로젝트 진행과정 007
DevHoChan
DevHoChan
맨땅에서 시작하는 코딩 도전
  • DevHoChan
    Debugging Life
    DevHoChan
  • 전체
    오늘
    어제
    • 분류 전체보기 (374)
      • 🕹️Game Life (1)
      • 🖥️Computer Science (5)
      • 📖TIL (141)
        • 🔥Projects (16)
        • 💡DevTips (5)
        • 🤔발생한 문제와 해결 (5)
        • 🔮Unity Graphics (5)
        • 🎤Interview (3)
        • ✅CodingTest (9)
      • 🚀Game Release (4)
      • 🧊Unity Basic (58)
        • 📌용어 사전 (1)
        • 에디터&인터페이스 (3)
        • 디버그 (1)
        • 라이프사이클 (4)
        • 게임오브젝트 (4)
        • 프리팹 (1)
        • 오브젝트풀링 (4)
        • 애트리뷰트 (2)
        • 트랜스폼 (4)
        • 물리&충돌 (1)
        • 프레임&델타타임 (4)
        • 코루틴&이벤트 (7)
        • 수학&보정함수 (3)
        • 디자인패턴 (9)
        • UGUI (3)
        • 벡터 ( Vector ) (3)
        • 씬 ( Scene ) (2)
        • 데이터 관리 (2)
      • ⭐C Sharp (99)
        • 📌용어 사전 (1)
        • 📌문법 사전 (6)
        • 메모리 관리 (3)
        • 00. 문법 (17)
        • 01. 변수 (3)
        • 02. 자료형 (2)
        • 03. 연산자 (6)
        • 04. 조건문 (2)
        • 05. 반복문 (2)
        • 06. 배열 (3)
        • 07. 메서드(함수) (7)
        • 08. 열거형 (3)
        • 09. 구조체 (2)
        • 10. 참조 (2)
        • 11. 객체 지향 (11)
        • 12. 델리게이트 (3)
        • 13. 디자인 패턴 (7)
        • 14. LINQ (1)
        • 📂▼자료구조 (2)
        • 15-1. 제네릭 (3)
        • 15-2. 배열 (4)
        • 15-3. 리스트 (2)
        • 15-4. 스택과 큐 (2)
        • 15-5. 딕셔너리 해시테이블 (2)
        • 15-6. 트리와 그래프 (3)
      • 📊Algorithm (16)
        • BigO (2)
        • 정렬 (4)
        • 셔플 (2)
        • 탐색 (6)
        • 최적화 (1)
      • 📝Game Design (16)
      • 🤖​AI Tools (12)
        • AI 리뷰 분석 (6)
        • Player2 (0)
        • 3D 모델링 (1)
        • 2D 스프라이트 (0)
        • 이미지 (2)
        • 사운드 (1)
        • 동영상 (1)
        • 문서 (1)
      • 🌍Network (6)
      • 🌱Github (11)
        • 기본 개념 (7)
        • 명령어 (1)
        • 도구 활용 (1)
      • ⚙️Visual Studio (5)
        • 🔧설치 및 환경설정 (2)
        • ⌨️HotKey (1)
        • 🚨디버깅 (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    문법
    csharp
    기획
    OOP
    디자인패턴
    til
    객체지향
    gamedesign
    게임디자인
    GitHub
    유니티
    unity
    부트캠프
    c#
    algorithm
    자료구조
    자료형
    CodingTest
    메모리관리
    게임기획
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
DevHoChan
프로젝트 진행과정 009
상단으로

티스토리툴바