728x90
안녕하세요!
이번 글에서는 C#을 사용하여 콘솔에서 길찾기 게임을 구현하는 방법에 대해 알아보겠습니다.
길찾기 게임은 사용자가 주어진 맵에서 캐릭터를 이동시켜 목표 지점에 도달하는 게임입니다.
게임 맵은 배열로 표현되며, 벽, 길, 캐릭터, 목표 지점은 적절한 문자로 표시됩니다.
사용자는 W,A,S,D입력을 통해 캐릭터를 위, 아래, 왼쪽, 오른쪽으로 움직일 수 있습니다.
<예제코드>
using System;
class Program
{
static void Main()
{
// 2차원 배열로 맵을 표현합니다.
char[,] map =
{
{'#', '#', '#', '#', '#', '#', '#', '#', '#', '#'},
{'#', ' ', ' ', ' ', '#', ' ', ' ', ' ', ' ', '#'},
{'#', '#', '#', ' ', '#', ' ', '#', '#', ' ', '#'},
{'#', ' ', '#', ' ', ' ', ' ', ' ', ' ', ' ', '#'},
{'#', ' ', '#', '#', '#', '#', '#', '#', ' ', '#'},
{'#', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '#'},
{'#', '#', '#', '#', '#', '#', '#', '#', '#', '#'},
};
int playerRow = 1; // 캐릭터의 초기 행 위치
int playerCol = 1; // 캐릭터의 초기 열 위치
map[playerRow, playerCol] = 'C'; // 캐릭터를 맵에 표시
int goalRow = 5; // 골인지점의 행 위치
int goalCol = 8; // 골인지점의 열 위치
map[goalRow, goalCol] = 'G'; // 골인지점을 맵에 표시
Console.WriteLine("길찾기 게임을 시작합니다. 목표는 'G'에 도착하는 것입니다.");
PrintMap(map);
while (true)
{
Console.Write("이동할 방향을 입력하세요 (W: 위, A: 왼쪽, S: 아래, D: 오른쪽): ");
char input = char.ToUpper(Console.ReadKey().KeyChar);
Console.Clear();
int newRow = playerRow;
int newCol = playerCol;
switch (input)
{
case 'W':
newRow--;
break;
case 'A':
newCol--;
break;
case 'S':
newRow++;
break;
case 'D':
newCol++;
break;
default:
Console.WriteLine("잘못된 입력입니다. 다시 입력하세요.");
PrintMap(map);
continue;
}
if (IsMoveValid(map, newRow, newCol))
{
// 이동 가능한 경우 캐릭터 위치 갱신
map[playerRow, playerCol] = ' ';
playerRow = newRow;
playerCol = newCol;
map[playerRow, playerCol] = 'C';
PrintMap(map);
if (playerRow == goalRow && playerCol == goalCol)
{
Console.WriteLine("목표지점에 도착했습니다! 게임을 종료합니다.");
break;
}
}
else
{
Console.WriteLine("이동할 수 없는 방향입니다. 다른 방향을 선택하세요.");
PrintMap(map);
}
}
}
static void PrintMap(char[,] map)
{
Console.WriteLine();
for (int i = 0; i < map.GetLength(0); i++)
{
for (int j = 0; j < map.GetLength(1); j++)
{
Console.Write(map[i, j]);
}
Console.WriteLine();
}
Console.WriteLine();
}
static bool IsMoveValid(char[,] map, int row, int col)
{
int numRows = map.GetLength(0);
int numCols = map.GetLength(1);
if (row < 0 || row >= numRows || col < 0 || col >= numCols)
{
// 배열 범위를 벗어나는 경우
return false;
}
if (map[row, col] == '#')
{
// 벽인 경우
return false;
}
return true;
}
}
<코드 해석>
char[,] map =
{
{'#', '#', '#', '#', '#', '#', '#', '#', '#', '#'},
{'#', ' ', ' ', ' ', '#', ' ', ' ', ' ', ' ', '#'},
{'#', '#', '#', ' ', '#', ' ', '#', '#', ' ', '#'},
{'#', ' ', '#', ' ', ' ', ' ', ' ', ' ', ' ', '#'},
{'#', ' ', '#', '#', '#', '#', '#', '#', ' ', '#'},
{'#', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '#'},
{'#', '#', '#', '#', '#', '#', '#', '#', '#', '#'},
};
- char[,] map은 길찾기 게임의 맵을 2차원 배열로 표현한 변수입니다.
- #은 벽을, 공백은 길을 나타냅니다.
- 이 배열은 초기 맵을 나타내며, 이후 게임 중에 캐릭터와 골인지점의 위치가 변경됩니다.
int playerRow = 1;
int playerCol = 1;
map[playerRow, playerCol] = 'C';
- playerRow와 playerCol은 캐릭터의 초기 위치를 나타내는 변수입니다.
- 캐릭터의 초기 위치는 (1, 1)입니다.
- map[playerRow, playerCol]은 맵에서 캐릭터의 위치를 나타내기 위해 해당 좌표에 C 문자를 할당하는 부분입니다.
int goalRow = 5;
int goalCol = 8;
map[goalRow, goalCol] = 'G';
- goalRow와 goalCol은 골인지점의 위치를 나타내는 변수입니다.
- 즉, 골인지점의 위치는 (5, 8)입니다.
- map[goalRow, goalCol]은 맵에서 골인지점의 위치를 나타내기 위해 해당 좌표에 G 문자를 할당하는 부분입니다.
Console.WriteLine("길찾기 게임을 시작합니다. 목표는 'G'에 도착하는 것입니다.");
PrintMap(map);
- 게임 시작을 알리는 메시지를 콘솔에 출력하고, PrintMap 메소드를 호출하여 초기 맵을 콘솔에 출력합니다.
while (true) { ... }
- 게임 루프를 나타내는 부분입니다.
- 이 루프는 게임이 종료될 때까지 반복됩니다.
Console.Write("이동할 방향을 입력하세요 (W: 위, A: 왼쪽, S: 아래, D: 오른쪽): ");
char input = char.ToUpper(Console.ReadKey().KeyChar);
Console.Clear();
int newRow = playerRow;
int newCol = playerCol;
- 사용자에게 이동할 방향을 입력하도록 안내하는 메시지를 출력하고, 사용자의 키 입력을 받아 대문자로 변환하여 input 변수에 할당합니다.
- Console.ReadKey().KeyChar는 사용자가 키보드에서 키를 입력할 때까지 대기하고, 입력된 키를 가져옵니다.
- Console.Clear();는 콘솔의 내용을 지우는 역할을 합니다.
- newRow와 newCol은 캐릭터의 새로운 위치를 저장할 변수입니다.
- 초기값으로 이전의 위치를 할당합니다.
switch (input)
{
case 'W':
newRow--;
break;
case 'A':
newCol--;
break;
case 'S':
newRow++;
break;
case 'D':
newCol++;
break;
default:
Console.WriteLine("잘못된 입력입니다. 다시 입력하세요.");
PrintMap(map);
continue;
}
- switch (input)은 사용자의 입력에 따라 다른 동작을 수행하기 위해 분기하는 부분입니다.
- input 변수의 값에 따라서 다음 동작이 결정됩니다.
- 'W'는 사용자가 'W'를 입력했을 때의 동작을 정의하는 부분입니다. newRow--은 캐릭터를 위로 이동시킵니다.
- 'A'는 사용자가 'A'를 입력했을 때의 동작을 정의하는 부분입니다. newCol--은 캐릭터를 왼쪽으로 이동시킵니다.
- 'S'는 사용자가 'S'를 입력했을 때의 동작을 정의하는 부분입니다. newRow++은 캐릭터를 아래로 이동시킵니다.
- 'D'는 사용자가 'D'를 입력했을 때의 동작을 정의하는 부분입니다. newCol++은 캐릭터를 오른쪽으로 이동시킵니다.
- default는 위의 case에 해당하지 않는 경우, 즉 잘못된 입력일 때 실행되는 부분입니다.
if (IsMoveValid(map, newRow, newCol))
{
map[playerRow, playerCol] = ' ';
playerRow = newRow;
playerCol = newCol;
map[playerRow, playerCol] = 'C';
PrintMap(map);
if (playerRow == goalRow && playerCol == goalCol)
{
Console.WriteLine("목표지점에 도착했습니다! 게임을 종료합니다.");
break;
}
}
else
{
Console.WriteLine("이동할 수 없는 방향입니다. 다른 방향을 선택하세요.");
PrintMap(map);
}
- IsMoveValid 메소드를 호출하여 이동이 유효한지 검사합니다.
- 만약 이동이 가능하다면, 캐릭터의 현재 위치를 맵에서 비워주고, 새로운 위치로 갱신한 후, 맵에 캐릭터를 표시합니다.
- PrintMap 메소드를 호출하여 맵을 콘솔에 출력합니다.
- if (playerRow == goalRow && playerCol == goalCol)은 캐릭터가 골인지점에 도착했는지 검사하는 조건문입니다.
- 만약 도착했다면, "목표지점에 도착했습니다! 게임을 종료합니다."라는 메시지를 출력하고, 게임 루프를 종료합니다.
- else는 이동이 불가능한 방향일 경우 실행되는 부분입니다.
static void PrintMap(char[,] map)
{
Console.WriteLine();
for (int i = 0; i < map.GetLength(0); i++)
{
for (int j = 0; j < map.GetLength(1); j++)
{
Console.Write(map[i, j]);
}
Console.WriteLine();
}
Console.WriteLine();
}
- PrintMap 메소드는 맵을 콘솔에 출력하는 역할을 합니다.
- Console.WriteLine();은 새로운 줄로 이동하여 가독성을 높입니다.
- for 반복문을 통해 2차원 맵 배열을 순회하며 각 요소를 콘솔에 출력합니다.
static bool IsMoveValid(char[,] map, int row, int col)
{
int numRows = map.GetLength(0);
int numCols = map.GetLength(1);
if (row < 0 || row >= numRows || col < 0 || col >= numCols)
{
return false;
}
if (map[row, col] == '#')
{
return false;
}
return true;
}
- IsMoveValid 메소드는 이동이 유효한지 검사하는 역할을 합니다.
- 맵의 크기와 현재 위치를 비교하여 이동이 가능한지 판단합니다.
- GetLength(0)은 2차원 배열의 첫 번째 차원의 크기를 반환합니다.
- GetLength(1)은 2차원 배열의 두 번째 차원의 크기를 반환합니다.
- if 조건문을 사용하여 배열 범위를 벗어나는 경우나 벽에 부딪히는 경우, 즉 이동이 불가능한 경우에는 false를 반환합니다.
- 그 외의 경우에는 이동이 가능하다는 의미로 true를 반환합니다.
위의 예제코드를 실행하면 게임이 시작됩니다.
콘솔에는 초기 맵이 출력되며, 사용자에게 이동할 방향을 입력하도록 안내합니다.
'W'는 위로, 'A'는 왼쪽으로, 'S'는 아래로, 'D'는 오른쪽으로 캐릭터를 이동시킵니다.
게임이 진행되는 동안 캐릭터의 위치와 맵은 콘솔에 표시되며, 목표 지점에 도착하면 게임이 종료됩니다.
감사합니다!
728x90
'[C#] > 콘솔 프로그래밍' 카테고리의 다른 글
[C#] 콘솔 프로그래밍 : 시저 암호 (23) | 2023.07.14 |
---|---|
[C#] 콘솔 프로그래밍 : 종료 대기 (18) | 2023.07.12 |
[C#] 콘솔 프로그래밍 : 요일 판단 (20) | 2023.07.10 |
[C#] 콘솔 프로그래밍 : 콘솔 가위바위보 게임 (25) | 2023.07.06 |
[C#] 콘솔 프로그래밍 : 사칙연산 계산기 (13) | 2023.07.05 |