WalkerJei's Lifelog

캐릭터 신장 프로그램 개발 본문

일상/일기

캐릭터 신장 프로그램 개발

WalkerJei 2025. 6. 6. 21:20

서론

그동안 캐릭터 표준을 디자인하면서 각 부위의 크기, 길이, 높이, 너비 등을 일일이 재면서 작업했다. 일일이 반복하는데 시간이 오래 걸렸지만 이런 와중에 특정한 패턴을 찾으면서 이를 프로그램으로 만들어서 계산하면 더 효율적이라고 생각했고 그리하여 C#으로 스크립트를 작성헀다.

 

주어진 것

기준이 되어줄 남녀 캐릭터의 키는 모두 504px로 되어 있으며 목을 포함한 몸통 길이가 186px, 다리 부분(몸통과 겹친 부분과 발은 제외)의 길이는 218px로 되어 있다.

1m 256px이다.

줄이는 부위는 몸통과 다리다.

다리는 무릎을 기준으로 상하로 구분하며 8개 구간으로 구성되며, 1~4번째 구간인 상부분은 직선으로 뻗어있고 5~8번째 구간인 하부분은 내려갈수록 좁아지게 되어있다.

 

소스 코드

class CharacterHeight256px
{
    // 기준 캐릭터의 신장
    static ushort standardHeight = 504;
    // 기준 캐릭터의 몸통 길이
    static ushort standardTorsoLength = 186;
    // 기준 캐릭터의 다리 길이
    static ushort standardLegLength = 218;

    static void Main(string[] args)
    {
        CharacterHeight256pxInfo characterHeight256PxInfo = new CharacterHeight256pxInfo();        
        
        // 캐릭터의 목표 신장 입력
        Console.WriteLine("목표하는 캐릭터 신장을 px 단위로 입력하세요.");
        Console.Write("목표 신장: ");
        characterHeight256PxInfo.CharacterHeight = Convert.ToUInt16(Console.ReadLine());

        // 기준 캐릭터의 신장 - 캐릭터의 목표 신장 값 구하기
        characterHeight256PxInfo.Value1 = (ushort)(standardHeight - characterHeight256PxInfo.CharacterHeight);

        // 기준 캐릭터의 신장 - 캐릭터의 목표 신장 값이 짝수일 때
        if (characterHeight256PxInfo.Value1 % 2 == 0)
        {
            characterHeight256PxInfo.Value2_Torso = (ushort)(standardTorsoLength - characterHeight256PxInfo.Value1 / 2);
            characterHeight256PxInfo.Value2_Leg = (ushort)(standardLegLength - characterHeight256PxInfo.Value1 / 2);
        }

        // 기준 캐릭터의 신장 - 캐릭터의 목표 신장 값이 홀수일 때
        else if (characterHeight256PxInfo.Value1 % 2 == 1)
        {
            characterHeight256PxInfo.Value2_Torso = (ushort)(standardTorsoLength - (characterHeight256PxInfo.Value1 / 2 + 1));
            characterHeight256PxInfo.Value2_Leg = (ushort)(standardLegLength - characterHeight256PxInfo.Value1 / 2);
        }

        // 기준 캐릭터의 신장 - 캐릭터의 목표 신장 값이 짝수일 때
        if (characterHeight256PxInfo.Value2_Leg % 2 == 0)
        {
            characterHeight256PxInfo.Value3_UpperLeg = (ushort)(characterHeight256PxInfo.Value2_Leg / 2);
            characterHeight256PxInfo.Value3_LowerLeg[0] = (ushort)(characterHeight256PxInfo.Value2_Leg / 2);
        }

        // 기준 캐릭터의 신장 - 캐릭터의 목표 신장 값이 홀수일 때
        else if (characterHeight256PxInfo.Value2_Leg % 2 == 1)
        {
            characterHeight256PxInfo.Value3_UpperLeg = (ushort)(characterHeight256PxInfo.Value2_Leg / 2);
            characterHeight256PxInfo.Value3_LowerLeg[0] = (ushort)(characterHeight256PxInfo.Value2_Leg / 2 + 1);
        }

        ushort leftoverSave = (ushort)(characterHeight256PxInfo.Value3_LowerLeg[0] % 8);
        ushort count = 8;

        for (int i = 1; i < characterHeight256PxInfo.Value3_LowerLeg.Length; i++)
            characterHeight256PxInfo.Value3_LowerLeg[i] = (ushort)(characterHeight256PxInfo.Value3_LowerLeg[0] / 8);


        while (leftoverSave > 0 && count > 0)
        {
            characterHeight256PxInfo.Value3_LowerLeg[count] += 1;
            count--;
            leftoverSave--;
        }
        
        // 결과 출력
        Console.WriteLine("캐릭터의 목표 신장: " + characterHeight256PxInfo.CharacterHeight + "px");
        Console.WriteLine("줄어들 신장 값: " + characterHeight256PxInfo.Value1 + "px");
        Console.WriteLine("목표 몸통 길이: " + characterHeight256PxInfo.Value2_Torso + "px");
        Console.WriteLine("목표 다리 길이: " + characterHeight256PxInfo.Value2_Leg + "px");
        Console.WriteLine("목표 다리 길이(무릎 위): " + characterHeight256PxInfo.Value3_UpperLeg + "px");
        Console.WriteLine("목표 다리 길이(무릎 아래): " + characterHeight256PxInfo.Value3_LowerLeg[0] + "px");
        for(int i = 1; i < characterHeight256PxInfo.Value3_LowerLeg.Length; i++)
            Console.WriteLine("목표 다리 길이(무릎 아래)" + i + "번째 부분: " + characterHeight256PxInfo.Value3_LowerLeg[i] + "px");
    }
}

class CharacterHeight256pxInfo
{
    // 캐릭터의 목표 신장
    private ushort characterHeight;
    public ushort CharacterHeight
    {
        get { return characterHeight; }
        set { characterHeight = value; }
    }

    // 기준 캐릭터의 신장 - 캐릭터의 목표 신장
    private ushort value1;
    public ushort Value1
    {
        get { return value1; }
        set { value1 = value; }
    }

    // 기준 캐릭터의 몸통 길이 - Value1
    private ushort value2_Torso;
    public ushort Value2_Torso
    {
        get { return value2_Torso; }
        set { value2_Torso = value; }
    }

    // 기준 캐릭터의 다리 길이 - Value1
    private ushort value2_Leg;
    public ushort Value2_Leg
    {
        get { return value2_Leg; }
        set { value2_Leg = value; }
    }

    // 캐릭터의 무릎 위 길이
    private ushort value3_UpperLeg;
    public ushort Value3_UpperLeg
    {
        get { return value3_UpperLeg; }
        set { value3_UpperLeg = value; }
    }

    // 캐릭터의 무릎 아래 길이 총 길이
    // 0번째에 전체 길이 저장
    // 1 ~ 8번째에 8등분한 길이 저장
    private ushort[] value3_LowerLeg = new ushort [9];
    public ushort[] Value3_LowerLeg
    {
        get { return value3_LowerLeg; }
        set { value3_LowerLeg = value; }
    }
}

 

결론

일단은 원하는 기능을 완성했다. 하지만 다른 사용자들이 이상한 값을 대입해서 오류가 나는 것을 방지할 장치가 없는 상태다. 또한 반복해서 사용하더라도 자꾸 객체가 생성되어서 메모리를 잡아먹는 일도 없어야 한다. 클래스 방식으로 만들었는데 클래스 이름이 길었다. 또한 코딩테스트 문제를 풀 때 밥 먹듯이 쓰던 StreamReaderStreamWriter 대신 Console.ReadLine(), Console.WriteLine()을 사용했다. 그 이유는 한글이 깨지는 것을 방지하기 위해서이다. 일기에 소스 코드를 넣어본 것은 처음이었다. 남아있는 문제점을 해결할 방법을 찾아보겠다.

'일상 > 일기' 카테고리의 다른 글

작품 쌓아두기  (0) 2025.06.08
네 번 문제를 풀어보다  (0) 2025.06.08
삼시세끼를 파리바게트로  (1) 2025.06.05
허탕친 날  (0) 2025.06.04
정보처리기사 실기 공부 현황  (0) 2025.06.04