TextRPG를 만드는 과정에서 상점을 구현할 때, 아이템 목록이 보이게 되는데, 그 아이템 목록들의 간격이 일정하지 않았다.
ex)
(현재 결과)
낡은 검 | 공격력 +5 | 못쓸 정도는 아니지만 낡은 검이다. | 500 G
스파르타의 창 | 공격력 +35 | 스파르타의 전사들이 사용했다는 전설의 창이다. | 4500 G
->
(내가 원하는 결과)
낡은 검 | 공격력 +5 | 못쓸 정도는 아니지만 낡은 검이다. | 500 G
스파르타의 창 | 공격력 +35 | 스파르타의 전사들이 사용했다는 전설의 창이다. | 4500 G
먼저 처음에는 '\t'를 사용하여 간격을 맞춰보려고 하였다.
하지만 이 방법은 길이가 비슷한 내용들 끼리는 간격이 맞춰졌는데 너무 긴 내용은 더 뒤로 밀려 버리는 현상이 나타났다.
인터넷에 문자열 정렬하는 법을 검색하니
Console.WriteLine($"{i, -10}");
// (-)는 좌로, (+)는 우로 부터 몇 칸까지 차지하는 문자열로 만든다.
다들 이러한 방법으로 문자열을 왼쪽 또는 오른쪽 기준으로 정렬하였다.
하지만 이 방법은 왜인지 모르겠지만 뭔가 한 두 칸씩 차이가 발생하였다.
(한글이 콘솔창에서 차지하는 칸의 개수 차이때문인듯 하였다)
다른 방법으로는 마우스 커서 위치를 직접 변경하는 것이었다.
Console.SetCursorPosition(10,10);
// (x, y) x, y 좌표를 대입해 원하는 위치로 커서를 옮길 수 있다.
하지만 이 방법은 아이템의 개수가 많아지거나 상점 옵션이 많아 질수록 좌표를 하나씩 수정해야되서 매우 불편하다.
해결 방법을 찾다가 결국 직접 함수를 만들어서 해결하였다.
// 문자열 길이 계산 (한글, 특수문자는 2칸, 공백은 1칸) // 문제점: 도중에 영어나 숫자가 섞여있으면 사용x
int StringCount(string str)
{
string[] korean = str.Split(' ');
int count = 0;
foreach(string s in korean)
{
count += s.Length * 2;
}
count += korean.Length - 1;
return count;
}
// 여백 만들기 (문자열 간격 맞추기 위해)
void StringSpace(int fix, int count)
{
for (int i = 0; i < fix - count; i++)
{
Console.Write(" ");
}
}
StringSpace( 내가 지정한 문자열 길이 , StringCount( 아이템 이름 길이 ));
이러한 함수를 만들어서 일정한 간격이 되도록 ' ' 여백을 주었다.
콘솔창에서 간격을 맞추기 힘들었던 이유는 문자마다 공간을 차지하는 크기가 달랐기 때문이었다.
한글, 특수문자는 2칸 / 영어, 숫자, ' ' 여백은 1칸 씩 차지하였다.