미니게임 005
제목 : 스네이크

1. 스네이크 게임의 동작 원리
- 보드 생성
- 뱀 생성
- 매 프레임마다 키 입력 → 이동 → 충돌 판단 → 출력
- 게임 오버 시 종료
2. 보드 초기화
board = new char[BoardHeight, BoardWidth];
2차원 배열 board[y , x] 에 각 칸의 상태를 저장한다.
- Wall (#) : 외곽 경계
- Empty ( ) : 빈 칸
- Food (●) : 먹이
- Head (O) : 뱀의 머리
- 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 ) ) 로 새로운 머리 추가
- 먹이를 먹었다 → 꼬리를 제거하지 않는다 ( 몸 길이 한칸 늘어남 )
- 먹이를 먹지 않았다 → 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 |
